Spring事务之详解--三种实现方式
实现购买股票案例:
一、引入JAR文件:

二、开始搭建分层架构---创建账户(Account)和股票(Stock)实体类
Account:
/*
* 账户
*/
public class Account { private int aid;//账户编号
private String aname;//账户名称
private double balance;//账户金额 public int getAid() {
return aid;
}
public void setAid(int aid) {
this.aid = aid;
}
public String getAname() {
return aname;
}
public void setAname(String aname) {
this.aname = aname;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
Stock:
/*
* 股票
*/
public class Stock { private int sid;//股票编号
private String sname;//名称
private int count;//股数 public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
三、创建Dao层,定义账户以及股票的接口,自定义新增和修改的方法,实现类实现该接口,重写方法
IAccountDao:
public interface IAccountDao {
//添加账户
public int addAccount(Account account);
//修改账户
public int updateAccount(int aid,int money,boolean isBuyOrNot);
//查询余额
public int selectMoney(int aid);
}
IStockDao:
public interface IStockDao {
//添加股票
public int addStock(Stock stock);
//修改股票
public int updateStock(int aid,int num,boolean isBuyOrNot);
}
AccountDaoImpl:实现类。继承自JdbcDaoSupport并实现IAccountDao接口,在这里需要用到JDBC模板的getJdbcTemplate(),通过该方法实现对SQL语句增删改查。
public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao{
//添加
public int addAccount(Account account) {
String sql="insert into account(aid,aname,balance) values(?,?,?)";
int count=this.getJdbcTemplate().update(sql, account.getAid(),account.getAname(),account.getBalance());
return count;
}
//修改
public int updateAccount(int aid, int money, boolean isBuyOrNot) {
String sql=null;
if(isBuyOrNot){
sql="update account set balance=balance-? where aid=?";
}
else{
sql="update account set balance=balance+? where aid=?";
}
int count=this.getJdbcTemplate().update(sql, money,aid);
return count;
}
StockDaoImpl:实现类同理
public class StockDaoImpl extends JdbcDaoSupport implements IStockDao{
//添加股票
public int addStock(Stock stock) {
String sql="insert into stock(sid,sname,count) values(?,?,?)";
int count=this.getJdbcTemplate().update(sql, stock.getSid(),stock.getSname(),stock.getCount());
return count;
}
//修改
public int updateStock(int aid, int num, boolean isBuyOrNot) {
String sql=null;
if(isBuyOrNot){
sql="update stock set count=count+? where sid=?";
}
else{
sql="update stock set count=count-? where sid=?";
}
int count=this.getJdbcTemplate().update(sql, num,aid);
return count;
}
四、业务逻辑层:service
定义接口IStockService,并实现添加账户,股票,以及购买股票的方法.购买股票需要传入账户的id,股票的id。以及金额,股数
public interface IStockService {
//添加账户
public int addAccount(Account account);
//添加股票
public int addStock(Stock stock);
//购买股票
public void buyStock(int aid,int money,int sid,int num) throws StockException;
}
实现类:StockServiceImpl。重写方法。并植入Dao。以及自定义StockException异常,用于判定用户的余额小于0,抛出异常

public class StockServiceImpl implements IStockService{
//植入dao
private IAccountDao accountDao;
private IStockDao stockDao;
//添加账户
public int addAccount(Account account) {
return accountDao.addAccount(account);
}
//添加股票
public int addStock(Stock stock) {
return stockDao.addStock(stock);
}
//购买一股票
public void buyStock(int aid, int money, int sid, int num) throws StockException {
boolean isBuy=true;
accountDao.updateAccount(aid, money, isBuy);
if(accountDao.selectMoney(aid)<=0){
throw new StockException("捕获异常!!!");
}
stockDao.updateStock(aid, num, isBuy);
}
五、Spring配置文件。[重点]
方式一:通过事务代理工厂bean进行配置[XML方式]
①引入一系列的约束头文件以及标签

②配置C3P0数据源以及DAO、Service

③配置事务管理器以及事务代理工厂Bean。测试类getBean获取的是代理工厂id

方式二:注解。测试类getBean获取的id是原始对象service
<!-- 注解 -->
<tx:annotation-driven transaction-manager="mytx"/>

方式三:Aspectj AOP配置事务 。同理 测试类getBean方法id获取的是原始对象

测试类:
public class Test01 {
@Test
public void addTest() throws StockException{
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
IStockService service = (IStockService)ctx.getBean("stockService");
service.buyStock(1, 800, 1, 2);
}
Spring事务之详解--三种实现方式的更多相关文章
- Spring事务Transaction配置的五种注入方式详解
Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学 ...
- spring事务管理(详解和实例)
原文地址: 参考地址:https://blog.csdn.net/yuanlaishini2010/article/details/45792069 写这篇博客之前我首先读了<Spring in ...
- 可能是最漂亮的Spring事务管理详解
Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么 ...
- 可能是最漂亮的Spring事务管理详解 专题
微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事物的特性(ACID): 原子性: 事务是最小的执行单位,不允 ...
- 最漂亮的Spring事务管理详解
SnailClimb 2018年05月21日阅读 7245 可能是最漂亮的Spring事务管理详解 Java面试通关手册(Java学习指南):github.com/Snailclimb/- 微信阅读地 ...
- (转)Spring事务管理详解
背景:之前一直在学习数据库中的相关事务,而忽略了spring中的事务配置,在阿里面试时候基本是惨败,这里做一个总结. 可能是最漂亮的Spring事务管理详解 https://github.com/Sn ...
- spring事务配置详解
一.前言 好几天没有在对spring进行学习了,由于这几天在赶项目,没有什么时间闲下来继续学习,导致spring核心架构详解没有继续下去,在接下来的时间里面,会继续对spring的核心架构在继续进行学 ...
- Spring学习日记01_IOC_xml的三种注入方式
什么是IOC 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 使用IOC目的:为了耦合度降低 做入门案例就是IOC实现 IOC底层原理 xml解析 工厂模式 反射 原始方式 cla ...
- Spring 事务机制详解
原文出处: 陶邦仁 Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,仅供学习参考. Spring声明式事务让我们从复杂的事务处理中得到 ...
随机推荐
- Ninesky源代码从Codeplex迁移到开源中国
原来Ninesky代码一直发在Codeplex.com上,最近两三个星期了代码一直迁入不上去,网站访问也经常出错. 所以把代码放到开源中国去了,项目地址https://git.oschina.net/ ...
- Android之自定义View的实现
对于学习Android开发的小童鞋对于自定义View一定不会陌生,相信大家对它是又爱又恨,爱它可以跟随我们的心意设计出漂亮的效果:恨它想要完全流畅掌握,需要一定的功夫.对于初学者来说确实很不容易,网上 ...
- SQL Server-分页方式、ISNULL与COALESCE性能分析(八)
前言 上一节我们讲解了数据类型以及字符串中几个需要注意的地方,这节我们继续讲讲字符串行数同时也讲其他内容和穿插的内容,简短的内容,深入的讲解,Always to review the basics. ...
- ASP.NET MVC Html.BeginForm 设置 timeout
示例代码: @using (Html.BeginForm("PublishSubmit", "Blog", FormMethod.Post, new { id ...
- Linux平台oracle 11g单实例 安装部署配置 快速参考
1.重建主机的Oracle用户 组 统一规范 uid gid 以保证共享存储挂接或其他需求的权限规范 userdel -r oracle groupadd -g 7 oinstall groupadd ...
- TFS工作项数据统计及相关数据库结构分析
今天为客户的质量管理部门人员提供TFS咨询过程中,客户的质量管理专家基于TFS提出了一个比较棘手的数据统计需求.需求是这样,客户的数十个软件项目通过质量管理部按照年度版本计划进行软件产品系统的发布,因 ...
- parseInt实例详解
parseInt() 函数可解析一个字符串,并返回一个整数. parseInt(string, radix) 参数 描述 string 必需.要被解析的字符串. radix 可选.表示要解析的数字的基 ...
- Rafy 框架 - 流水号插件
Rafy 框架又添新成员:流水号插件.本文将解释 Rafy 框架中的流水插件的场景.使用方法. 场景 在开发各类数据库应用系统时,往往需要生成从一开始的流水号,有时还需要按月或者按日进行独立生成,如下 ...
- 【原创】Kafka Consumer多线程实例
Kafka 0.9版本开始推出了Java版本的consumer,优化了coordinator的设计以及摆脱了对zookeeper的依赖.社区最近也在探讨正式用这套consumer API替换Scala ...
- POI操作Excel
POI和Excel简介 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作 ...