Spring学习事务管理--基于注解方式(三)

图书类接口

package com.spring.tx;

public interface BookShopDao {
	/**
	 * 根据书号查找加个
	 * @param isbn
	 * @return
	 */
	public int findBookPriceByIsbn(String isbn);
	/**
	 * 更新书的库存
	 * @param isbn
	 */
	public void updateBookStock(String isbn);
	/**
	 * 更新账户
	 * @param username
	 * @param price
	 */
	public void updateUserAccount(String username,int price);

}

  

图书类实现类

package com.spring.tx;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository("bookShopDao")
public class BookShopDaoImpl implements BookShopDao{

	@Autowired
	private JdbcTemplate jdbcTemplate;

	@Override
	public int findBookPriceByIsbn(String isbn) {
		String sql ="SELECT price FROM book WHERE isbn = ?";
		return jdbcTemplate.queryForObject(sql, Integer.class,isbn);
	}

	@Override
	public void updateBookStock(String isbn) {
//		检查库存是否足够
		String sql = "SELECT stock FROM book_stock WHERE isbn = ?";
		Integer queryForObject = jdbcTemplate.queryForObject(sql, Integer.class,isbn);
		if(queryForObject <=0){
			throw new BookStockException("库存不足");
		}
		String sql2 = "UPDATE book_stock SET stock = stock -1 WHERE isbn = ?";
		jdbcTemplate.update(sql2, isbn);
	}

	@Override
	public void updateUserAccount(String username, int price) {
//		验证余额是否够,若不足,抛出异常
		String sql = "SELECT balance FROM account WHERE username = ?";
		Integer balance = jdbcTemplate.queryForObject(sql,Integer.class, username);
		if(balance<price){
			throw new UserAccountException("余额不足");
		}
		String sql2="UPDATE account SET balance = balance - ? WHERE username = ?";
		jdbcTemplate.update(sql2, price,username);

	}

}

  

图书Service

package com.spring.tx;

public interface BookShopService {

	public void purchase(String username,String isbn);

}

  

图书Service 实现类

package com.spring.tx;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service("bookShopService")
public class BookShopServiceImpl implements BookShopService {

	@Autowired
	private BookShopDao bookShopDao;
//	添加事务注解
	/**
	 * propagation 事务的传播行为 ,即当前的事务方法被另一个事务方法调用时适合使用事务
	 * 		默认值Propagation.REQUIRED 使用调用事务的方法(共用一个事务)
	 * 		    REQUIRES_NEW	使用自己的事务,调用事务的方法的事务被挂起
	 * isolation 制事务的隔离级别,常用的取值为READ_COMMITTED
	 * rollbackFor/norollbackFor 默认情况下Spring的声明式事务对所有的运行时异常进行回滚
	 * readOnly 制定事务是否为只读
	 * timeout 制定强制回滚之前事务可以占用时间
	 */
	@Transactional(propagation=Propagation.REQUIRES_NEW,
			isolation=Isolation.READ_COMMITTED,rollbackFor={UserAccountException.class}
			,readOnly=true,timeout=1
			)
	@Override
	public void purchase(String username, String isbn) {
//		获取单价
		int price = bookShopDao.findBookPriceByIsbn(isbn);
//		更新库存
		bookShopDao.updateBookStock(isbn);
//		更新账户
		bookShopDao.updateUserAccount(username, price);

	}

}

  

出账接口

package com.spring.tx;

import java.util.List;

public interface CashierService {

	public void checkout(String username,List<String> ibsns);

}

  

出账实现类

package com.spring.tx;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service("cashierService")
public class CashierServiceimpl implements CashierService {

	@Autowired
	private BookShopService bookShopService;

	@Transactional
	@Override
	public void checkout(String username, List<String> ibsns) {

		for(String ibsn:ibsns){
			bookShopService.purchase(username, ibsn);
		}

	}

}

  

异常处理类

package com.spring.tx;

public class BookStockException extends RuntimeException{

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	public BookStockException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public BookStockException(String message, Throwable cause,
			boolean enableSuppression, boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
		// TODO Auto-generated constructor stub
	}

	public BookStockException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

	public BookStockException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public BookStockException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}

}

package com.spring.tx;

public class UserAccountException extends RuntimeException{

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	public UserAccountException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public UserAccountException(String message, Throwable cause,
			boolean enableSuppression, boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
		// TODO Auto-generated constructor stub
	}

	public UserAccountException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

	public UserAccountException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public UserAccountException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}

}

  

Spring配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:tx="http://www.springframework.org/schema/tx"
 6     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 7         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
 8         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
 9
10     <!-- 配置自动扫描的包 -->
11     <context:component-scan base-package="com.spring.tx"></context:component-scan>
12     <!-- 导入资源文件 -->
13     <context:property-placeholder location="classpath:db.properties" />
14
15     <!-- 配置C3P0数据源 -->
16     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
17         <property name="user" value="${jdbc.user}"></property>
18         <property name="password" value="${jdbc.password}"></property>
19         <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
20         <property name="driverClass" value="${jdbc.driverClass}"></property>
21
22         <property name="initialPoolSize" value="${jdbc.initPoorSize}"></property>
23         <property name="maxPoolSize" value="${jdbc.maxPoorSize}"></property>
24     </bean>
25
26     <!-- 配置Spring的JdbcTemplate -->
27     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
28         <property name="dataSource" ref="dataSource"></property>
29     </bean>
30
31     <!-- 配置事务管理器 -->
32     <bean id="transactionManager"
33         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
34         <property name="dataSource" ref="dataSource"></property>
35     </bean>
36
37     <!-- 启用事物注解 -->
38     <tx:annotation-driven transaction-manager="transactionManager"/>
39
40 </beans>

数据源

1 jdbc.user=root
2 jdbc.password=123456
3 jdbc.driverClass=com.mysql.jdbc.Driver
4 jdbc.jdbcUrl=jdbc:mysql:///spring
5
6 jdbc.initPoorSize=5
7 jdbc.maxPoorSize=10

测试类

package com.spring.junit;

import java.sql.SQLException;
import java.util.Arrays;

import javax.sql.DataSource;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

import com.spring.tx.BookShopDao;
import com.spring.tx.BookShopService;
import com.spring.tx.CashierService;

public class JdbcTest {

	private ApplicationContext ctx =null;
	private JdbcTemplate jdbcTemplate;
	private BookShopDao bookShopDao =null;
	private BookShopService bookShopService=null;
	private CashierService cashierService = null;

	{
		ctx =new ClassPathXmlApplicationContext("applicationContext.xml");
		jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
		bookShopDao = ctx.getBean(BookShopDao.class);
		bookShopService =ctx.getBean(BookShopService.class);
		cashierService =ctx.getBean(CashierService.class);
	}
	/**
	 * 测试数据库连接
	 * @throws SQLException
	 */
	@Test
	public void testJdbcTest() throws SQLException {
		DataSource dataSource = ctx.getBean(DataSource.class);
		System.out.println(dataSource.getConnection());
	}
	/**
	 * 执行insert delete update
	 */
	@Test
	public void testJdbcTemplate(){
		String sql = "update test1 set name = ? where id = ?";
		jdbcTemplate.update(sql, "213","1");

	}
	/**
	 * 测试booksdao
	 */
	@Test
	public void testBooksShopDao(){
		int findBookPriceByIsbn = bookShopDao.findBookPriceByIsbn("1001");
		bookShopDao.updateBookStock("1001");
		bookShopDao.updateUserAccount("1", 100);
		System.out.println(findBookPriceByIsbn);
	}
	/**
	 * 测试booksService
	 */
	@Test
	public void testBookShopService(){
		bookShopService.purchase("1", "1001");
	}
	/**
	 * 测试CashierService
	 */
	@Test
	public void testCashierService(){
		cashierService.checkout("1", Arrays.asList("1002","1001"));
	}

}

  

Jar包

c3p0-0.9.1.2.jar
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-logging-1.1.3.jar
mysql-connector-java-5.1.7-bin.jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-jdbc-4.0.0.RELEASE.jar
spring-orm-4.0.0.RELEASE.jar
spring-tx-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar

时间: 2024-12-25 16:46:32

Spring学习事务管理--基于注解方式(三)的相关文章

spring学习5:基于注解实现spring的aop

目录 spring学习5:基于注解实现spring的aop 一.基于注解+xml实现 1.1 在配置文件中开启spring对注解aop的支持 1.2 把通知类用注解配置到容器中,并用注解声明为切面 1.3 定义切入点表达式 1.4 定义通知 二.基于纯注解实现 三.多个aop的执行顺序 1.xml配置 2.注解配置 3.注意 spring学习5:基于注解实现spring的aop 上一节学习了spring aop的基本概念和如何基于xml配置来实现aop功能.这一节来学习下如何用注解实现aop 一

spring的bean管理(注解方式)

1.Spring的Bean管理的中常用的注解 @Component:组件.(作用在类上) public interface UserDao {     public void sayHello(); }   @Component(value="userDao")     public class UserDaoImpl implements UserDao {   @Override public void sayHello() {     System.out.println(&qu

Spring学习笔记-springMVC基于注解的控制器(Demo)

springmvc的整体运行流程图: 基于@Controller和@RequestMapping是springmvc示例代码 在web.xml中配置springmvc核心分发器DispatcherServlet .... <servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </

Spring学习笔记-springMVC基于注解的控制器(基本概念)

在spring2.5以前的版本中,实现一个mvc的Controller的唯一方法就是实现Controller接口,一个控制器只能响应一个客户端请求,在2.5以后的版本中,spring引入了注解,利用注解简化配置文件,利用注解实现bean的声明和依赖注入(DI),注解也同样被引入到spring的web模块springMVC中. 使用基于注解的控制器有两个优点 第一:一个控制器可以处理多个动作,而不是像以前那样一个控制器只能处理一个请求 第二:省略的在配置文件中对bean的声明和依赖注入,显著提高开

Spring声明式事务管理(基于注解方式实现)

----------------------siwuxie095 Spring 声明式事务管理(基于注解方式实现) 以转账为例 1.导入相关 jar 包(共 10 个包) (1)导入核心 jar 包和日志相关的 jar 包 (2)导入 JdbcTemplate 的 jar 包 (3)导入 MySQL 的 JDBC 驱动包 mysql-connector-java 下载链接: https://dev.mysql.com/downloads/connector/j/ (4)导入 AOP 的 jar

Spring事务管理-使用注解配置事务

一.概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下:为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects)支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用 提供比其他事务API如JTA更简单的编程式事务管理

spring的事务管理有几种方式实现 (转自:http://blog.csdn.net/bopzhou/article/details/7094108)

spring的事务管理有几种方式实现 标签: springhibernate数据库beanlistclass 2011-12-22 09:12 3883人阅读 评论(0) 收藏 举报 Spring+Hibernate的实质: 就是把Hibernate用到的数据源Datasource,Hibernate的SessionFactory实例,事务管理器HibernateTransactionManager,都交给Spring管理. 那么再没整合之前Hibernate是如何实现事务管理的呢? 通过Ser

spring 事务管理的配置方式

Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,Tra

spring,mybatis事务管理配置与@Transactional注解使用

spring,mybatis事务管理配置与@Transactional注解使用[转] 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects) 支持声明式事务管理,特别是基