关于Spring事务管理的基础实例
1.准备工作(环境:idea)
我是用dbcp连接池连接的,所以必须的jar包除了Spring的基础包外还得有aspectweaver,mysqlconnector,commons-dbcp2,commons-pool2的包。
2.框架结构
A)Dao层
BookShopDao
package com.laola.dao;public interface BookShopDao { //通过编号查询书的价格public int findBookPriceByIsbn(String Isbn);//通过编号查询书的库存public void updateBookStock(String Isbn);//通过名字查余额public void updateBalance(String username,int price); }
Cashier
package com.laola.dao;import java.util.List;public interface Cashier {void checkout(String username, List<String> isbns); }
实现类
BookServiceImpl
package com.laola.Impl;import com.laola.dao.BookShopDao; import com.laola.service.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;//@Transactional (这里定义一个事务。注:如果不想配置XML文件可以用这些注解) //@Service public class BookServiceImpl implements BookService {//@Autowiredprivate BookShopDao bookShopDao;public void setBookShopDao(BookShopDao bookShopDao) {this.bookShopDao = bookShopDao;}@Overridepublic void purchase(String username, String Isbn) { //获取价格int price=bookShopDao.findBookPriceByIsbn(Isbn); //更新库存bookShopDao.updateBookStock(Isbn); //更新余额bookShopDao.updateBalance(username,price);} }
BookShopDaoImpl
package com.laola.Impl;import com.laola.dao.BookShopDao; 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 {//@Autowiredprivate JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}//实现价格查询@Overridepublic int findBookPriceByIsbn(String isbn) {String sql="select price from book where Isbn = ?";return jdbcTemplate.queryForObject(sql,Integer.class,isbn);}//实现库存更新@Overridepublic void updateBookStock(String isbn) {String sql2="select stock from stock where Isbn = ?";Integer stock = jdbcTemplate.queryForObject(sql2, Integer.class, isbn);if(stock<0){ //当库存不足时,抛出异常并回滚throw new RuntimeException("库存不足!");}String sql="update stock set stock=stock-1 where Isbn=?";jdbcTemplate.update(sql,isbn);}//实现余额更新@Overridepublic void updateBalance(String username, int price) {String sql2="select balance from account where username=?";Integer balance = jdbcTemplate.queryForObject(sql2, Integer.class, username);if(balance<price){ //当余额不足时,抛出异常并回滚throw new RuntimeException("余额不足!");}String sql="update account set balance=balance-? where username=?";jdbcTemplate.update(sql,price,username);} }
CashierImpl
package com.laola.Impl;import com.laola.dao.Cashier; import com.laola.service.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import java.util.List;//事务的传播 //@Transactional //@Service public class CashierImpl implements Cashier {//@Autowiredprivate BookService bookService;public void setBookService(BookService bookService) {this.bookService = bookService;}@Overridepublic void checkout(String username, List<String> isbns) { //遍历购买的书,事务的传播for(String isbn:isbns){bookService.purchase(username,isbn);}} }
Service层
BookService
package com.laola.service;public interface BookService {void purchase(String username,String Isbn); }
XML配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><context:component-scan base-package="com.laola" /><context:property-placeholder location="db.properties"/> <!--定义连接池的bean--><bean name ="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"><property name="username" value="${user}" /><property name="password" value="${password}"/><property name="url" value="${url}"/><property name="driverClassName" value="${driver}"/></bean> <!--定义jdbc模板--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean> <!--定义事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><tx:annotation-driven transaction-manager="transactionManager"/><bean id="bookShopDao" class="com.laola.Impl.BookShopDaoImpl"><property name="jdbcTemplate" ref="jdbcTemplate"/></bean><bean id="bookService" class="com.laola.Impl.BookServiceImpl"><property name="bookShopDao" ref="bookShopDao"/></bean><bean id="cashier" class="com.laola.Impl.CashierImpl"><property name="bookService" ref="bookService"/></bean> <!-- 配置事务属性--><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*"/></tx:attributes></tx:advice> <!-- 配置事务切点--><aop:config><aop:pointcut id="txpointcut" expression="execution(* com.laola.service.BookService.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="txpointcut"/></aop:config></beans>
Test类
package com.laola.test;import com.laola.dao.BookShopDao; import com.laola.dao.Cashier; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.Arrays;public class BookShopTest {public static void main(String[] args) {ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");BookShopDao bookShopDao=(BookShopDao) ac.getBean(BookShopDao.class);//int price = bookShopDao.findBookPriceByIsbn("1");Cashier bean = ac.getBean(Cashier.class); //将用户购买的书放在集合,然后封装到请求参数中bean.checkout("tom", Arrays.asList("1","2"));//System.out.println(price); } }
转载于:https://www.cnblogs.com/jiujianyaoge/p/10751193.html
关于Spring事务管理的基础实例相关推荐
- Spring事务管理的总结
1.事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销.Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring ...
- Spring事务管理理解
文章目录 一.事务认识 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability) 二.事务的传播特性 三.事务的隔离级别 四.spr ...
- Spring事务管理之几种方式实现事务
1.事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销.Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring ...
- Spring事务管理(详解+实例)
写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: ...
- Spring进阶(五):Spring事务管理(详解+实例)
文章目录 一.前言 二.核心接口 2.1 事务管理器 2.1.1 JDBC事务 2.1.2 Hibernate事务 2.1.3 Java持久化API事务(JPA) 2.1.4 Java原生API事务 ...
- Spring 事务管理
http://www.redsaga.com/spring_ref/2.0/html/transaction.html#transaction-declarative 9.1. 简介 Spring框架 ...
- 分析Spring事务管理原理及应用
目录 一.Spring事务管理介绍 (一)基本理论 (二)实际工作中的举例 (三)简单应用举例 二.Spring事务配置介绍 (一)Spring事务属性介绍 传播属性(传播行为)可选值说明 (二)声明 ...
- Spring事务管理 与 SpringAOP
1,Spring事务的核心接口 Spring事务管理的实现有许多细节,如果对整个接口框架有个大体了解会非常有利于我们理解事务,下面通过讲解Spring的事务接口来了解Spring实现事务的具体策略. ...
- Spring 事务管理高级应用难点剖析
Spring 事务管理高级应用难点剖析: 第 1 部分 http://www.ibm.com/developerworks/cn/java/j-lo-spring-ts1/index.html htt ...
最新文章
- Vue项目中公用footer组件底部位置的适配问题
- javascript计算小数保留两位小数,多位小数的方法
- xgboost: 速度快效果好的boosting模型
- 深入浅出Hibernate 笔记一(面向应用的持久层设计)
- php解析json里的hson_这种json字符串PHP如何解析?
- CSS + jQuery 实现的超 Sexy 下拉菜单
- memcpy的用法与strcpy的区别及纯c语言实现
- 【总结】1292- 分享几个 VSCode 的高级调试与使用技巧
- 爬取京东网页的通用代码框架及其问题(MOOC)
- php对mysql的增删改
- linux 137错误,linux引导报错问题
- 亨利气体溶解度优化算法(Matlab代码实现)
- windows中java环境变量配置
- Ecology Letters:生物多样性的多维性、尺度依赖性及稀疏曲线的深度认知
- 回忆杀--致敬八零后的六一儿童节
- QT 声音频率和振幅以及相位
- Qcom平台 TC358840 调试指南
- 数据库几个事务相关的知识点(脏读幻读不可重复读以及如何避免)
- 华北理工大学计算机专业录取分数线,华北理工大学2019年本科分省分专业录取分数线...
- 史蒂芬柯维经典之作《第三选择》听后感和思维导图