package zhang.spring.dao;
import zhang.spring.transtions.User;
public interface ShoppingDao {
//根据用户名获取用户
public User getUser(String username);
//根据图书的id获取图书的价格
public int findBookPrice(int bookid);
//更新用户的余额
public void updateUserBalance(String username,int price);
//更新图书的库存
public void updateBookStack(int bookid);
}
package zhang.spring.dao;
import java.util.List;
public interface UserSeviceDao {
//购买一本书
public void BuyBook(String username,int bookid);
//购买多本书
public void BuyBooks(String username,List<Integer> bookids);
}
package zhang.spring.daoimpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import zhang.spring.Expection.BookStackException;
import zhang.spring.Expection.UserBalanceException;
import zhang.spring.dao.ShoppingDao;
import zhang.spring.transtions.User;
@Repository
public class ShoppingDaoimpl implements ShoppingDao {
@Autowired
private JdbcTemplate jdbcTemplate=null;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
@Override
public User getUser(String username) {
String sql="select username,balance from user where username=?";
RowMapper<User> rowMapper=new BeanPropertyRowMapper<>(User.class);
User user = jdbcTemplate.queryForObject(sql, rowMapper,username);
return user;
}
@Override
public int findBookPrice(int bookid) {
String sql="select bookprice from book where bookid=?";
Integer price = jdbcTemplate.queryForObject(sql, Integer.class, bookid);
return price;
}
@Override
public void updateUserBalance(String username, int price) {
//检查用户的余额是否够
String sql2="select balance from user where username=?";
Integer money = jdbcTemplate.queryForObject(sql2, Integer.class, username);
if(price>money){
throw new UserBalanceException("用户的余额不足!");
}
String sql="update user set balance=balance-? where username=?";
jdbcTemplate.update(sql, price,username);
}
@Override
public void updateBookStack(int bookid) {
//验证库存是否充足
String sql2="select stack from book_stack where bookid=?";
Integer stack = jdbcTemplate.queryForObject(sql2, Integer.class, bookid);
if(stack==0){
throw new BookStackException("图书的库存不足");
}
String sql="update book_stack set stack=stack-1 where bookid=?";
jdbcTemplate.update(sql, bookid);
}
}
package zhang.spring.daoimpl;
import java.util.Arrays;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import zhang.spring.dao.ShoppingDao;
import zhang.spring.dao.UserService2;
import zhang.spring.dao.UserSeviceDao;
import zhang.spring.transtions.User;
public class Testshoppingimple {
private UserService2 userService2=null;
private UserSeviceDao userSeviceDao=null;
private ShoppingDao dao=null;
private ApplicationContext ctx=null;
{
ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
dao=ctx.getBean(ShoppingDaoimpl.class);
userSeviceDao=ctx.getBean(UserSeviceDao.class);
userService2=ctx.getBean(UserService2.class);
}
@Test
public void testbuybooks(){
userService2.BuyBooks("zhang", Arrays.asList(1001,1002));
}
/**
* 购买多本的图书
*/
@Test
public void buybooks(){
userSeviceDao.BuyBooks("zhang", Arrays.asList(1001,1002));
}
/*
* 用户购买图书构成一个事务,更新用户的余额,同时更新对应
* 图书的的库存
*/
@Test
public void testbuybook(){
userSeviceDao.BuyBook("zhang", 1001);
}
/**
* 更新用户的余额
*/
@Test
public void testupdateuserBalance(){
dao.updateUserBalance("zhang", dao.findBookPrice(1001));
}
/**
* 更新用户的余额
*/
@Test
public void testupdateuserbalance(){
dao.updateBookStack(1001);
}
@Test
public void getbookprice(){
int price = dao.findBookPrice(1001);
System.out.println(price);
}
@Test
public void testjdbc(){
ShoppingDaoimpl bean = ctx.getBean(ShoppingDaoimpl.class);
bean.getJdbcTemplate().update("delete from user where username='zhang'");
}
@Test
public void testgetuser(){
String username="zhang";
User user = dao.getUser(username);
System.out.println(user);
}
@Test
public void test() {
ShoppingDaoimpl bean = ctx.getBean(ShoppingDaoimpl.class);
JdbcTemplate jdbcTemplate = bean.getJdbcTemplate();
System.out.println(jdbcTemplate);
}
}
package zhang.spring.daoimpl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import zhang.spring.dao.ShoppingDao;
import zhang.spring.dao.UserSeviceDao;
@Service
public class UserServiceDaoimpl implements UserSeviceDao {
@Autowired
private ShoppingDao shoppingdao=null;
public void setShoppingdao(ShoppingDao shoppingdao) {
this.shoppingdao = shoppingdao;
}
public ShoppingDao getShoppingdao() {
return shoppingdao;
}
/**
* Spring使用注解的方式来配置事务
*/
@Transactional(propagation=Propagation.REQUIRES_NEW)
@Override
public void BuyBook(String username, int bookid) {
//获取要买的数的价格
int price = shoppingdao.findBookPrice(bookid);
//更新用户的余额
shoppingdao.updateUserBalance(username, price);
//更新图书的库存
shoppingdao.updateBookStack(bookid);
}
@Transactional
@Override
public void BuyBooks(String username, List<Integer> bookids) {
for(Integer id:bookids){
BuyBook(username, id);
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!-- 引入属性文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<context:component-scan base-package="zhang.spring"></context:component-scan>
<!-- 配置c3p0数据源 -->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="driverClass" value="${driverclass}"></property>
<property name="jdbcUrl" value="${jdbcurl}"></property>
</bean>
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="TransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 使用注解的方式 -->
<tx:annotation-driven transaction-manager="TransactionManager" proxy-target-class="true"/>
</beans>
Spring基于注解声明式事务
猜你喜欢
转载自blog.csdn.net/qq_43257103/article/details/90215387
今日推荐
周排行