Spring基于注解声明式事务

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>

猜你喜欢

转载自blog.csdn.net/qq_43257103/article/details/90215387