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事务管理的基础实例相关推荐

  1. Spring事务管理的总结

    1.事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销.Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring ...

  2. Spring事务管理理解

    文章目录 一.事务认识 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability) 二.事务的传播特性 三.事务的隔离级别 四.spr ...

  3. Spring事务管理之几种方式实现事务

    1.事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销.Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring ...

  4. Spring事务管理(详解+实例)

    写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: ...

  5. Spring进阶(五):Spring事务管理(详解+实例)

    文章目录 一.前言 二.核心接口 2.1 事务管理器 2.1.1 JDBC事务 2.1.2 Hibernate事务 2.1.3 Java持久化API事务(JPA) 2.1.4 Java原生API事务 ...

  6. Spring 事务管理

    http://www.redsaga.com/spring_ref/2.0/html/transaction.html#transaction-declarative 9.1. 简介 Spring框架 ...

  7. 分析Spring事务管理原理及应用

    目录 一.Spring事务管理介绍 (一)基本理论 (二)实际工作中的举例 (三)简单应用举例 二.Spring事务配置介绍 (一)Spring事务属性介绍 传播属性(传播行为)可选值说明 (二)声明 ...

  8. Spring事务管理 与 SpringAOP

    1,Spring事务的核心接口 Spring事务管理的实现有许多细节,如果对整个接口框架有个大体了解会非常有利于我们理解事务,下面通过讲解Spring的事务接口来了解Spring实现事务的具体策略.  ...

  9. Spring 事务管理高级应用难点剖析

    Spring 事务管理高级应用难点剖析: 第 1 部分 http://www.ibm.com/developerworks/cn/java/j-lo-spring-ts1/index.html htt ...

最新文章

  1. Vue项目中公用footer组件底部位置的适配问题
  2. javascript计算小数保留两位小数,多位小数的方法
  3. xgboost: 速度快效果好的boosting模型
  4. 深入浅出Hibernate 笔记一(面向应用的持久层设计)
  5. php解析json里的hson_这种json字符串PHP如何解析?
  6. CSS + jQuery 实现的超 Sexy 下拉菜单
  7. memcpy的用法与strcpy的区别及纯c语言实现
  8. 【总结】1292- 分享几个 VSCode 的高级调试与使用技巧
  9. 爬取京东网页的通用代码框架及其问题(MOOC)
  10. php对mysql的增删改
  11. linux 137错误,linux引导报错问题
  12. 亨利气体溶解度优化算法(Matlab代码实现)
  13. windows中java环境变量配置
  14. Ecology Letters:生物多样性的多维性、尺度依赖性及稀疏曲线的深度认知
  15. 回忆杀--致敬八零后的六一儿童节
  16. QT 声音频率和振幅以及相位
  17. Qcom平台 TC358840 调试指南
  18. 数据库几个事务相关的知识点(脏读幻读不可重复读以及如何避免)
  19. 华北理工大学计算机专业录取分数线,华北理工大学2019年本科分省分专业录取分数线...
  20. 史蒂芬柯维经典之作《第三选择》听后感和思维导图

热门文章

  1. Vue 使用 v-show 失效
  2. 人人都在讲数据治理而不问业务,这很危险
  3. 超越Excel,这才是报表的正确打开方式,可惜90%的人都没用过
  4. 手把手教你做酷炫的数据可视化大屏,零基础的你仅需6步
  5. JQuery动态循环绑定事件
  6. c语言一年日历程序,c语言日历程序
  7. 2020运动相机推荐_2020年优秀户外运动相机推荐
  8. LCDM--商品潜在互补性发现模型
  9. 七牛切片视频php,音视频切片(HLS)
  10. Scrapy爬虫框架入门