Spring 事务详解
实现购买股票案例:
一、引入JAR文件:

二、开始搭建分层架构---创建账户(Account)和股票(Stock)实体类
Account:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/* * 账户 */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:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
/* * 股票 */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:
|
1
2
3
4
5
6
|
public interface IAccountDao { //添加账户 public int addAccount(Account account); //修改账户 public int updateAccount(int aid,int money,boolean isBuyOrNot);<br> |
//查询余额
public int selectMoney(int aid);
|
1
|
} |
IStockDao:
|
1
2
3
4
5
6
7
|
public interface IStockDao { //添加股票 public int addStock(Stock stock); //修改股票 public int updateStock(int aid,int num,boolean isBuyOrNot);} |
AccountDaoImpl:实现类。继承自JdbcDaoSupport并实现IAccountDao接口,在这里需要用到JDBC模板的getJdbcTemplate(),通过该方法实现对SQL语句增删改查。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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:实现类同理
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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。以及金额,股数
|
1
2
3
4
5
6
7
8
9
|
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,抛出异常

|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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
|
1
2
|
<!-- 注解 --> <tx:annotation-driven transaction-manager="mytx"/> |

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

测试类:
|
1
2
3
4
5
6
7
8
9
|
public class Test01 {@Testpublic void addTest() throws StockException{ ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); IStockService service = (IStockService)ctx.getBean("stockService"); service.buyStock(1, 800, 1, 2);} |
Spring 事务详解的更多相关文章
- spring事务详解(五)总结提高
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.概念 ...
- spring事务详解(四)测试验证
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- spring事务详解(二)简单样例
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- spring事务详解(三)源码详解
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- spring事务详解(一)初探事务
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 引子 很多 ...
- Spring、Spring事务详解;使用XML配置事务
@Transactional可以设置以下参数: @Transactional(readOnly=false) // 指定事务是否只读的 true/false @Transactional(rollba ...
- spring事务详解(转载+高亮)
spring提供的事务管理可以分为两类:编程式的和声明式的.编程式的,比较灵活,但是代码量大,存在重复的代码比较多:声明式的比编程式的更灵活.编程式主要使用transactionTemplate.省略 ...
- spring事务详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt122 Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式 ...
- JAVA框架之Spring【Spring事务详解】
spring提供的事务管理可以分为两类:编程式的和声明式的.编程式的,比较灵活,但是代码量大,存在重复的代码比较多:声明式的比编程式的更灵活.编程式主要使用transactionTemplate.省略 ...
- spring事务详解(二)实例
在Spring中,事务有两种实现方式: 编程式事务管理: 编程式事务管理使用底层源码可实现更细粒度的事务控制.spring推荐使用TransactionTemplate,典型的模板模式. 申明式事务管 ...
随机推荐
- Android自定义View之圆环交替 等待效果
学习了前面两篇的知识,对于本篇实现的效果,相信大家都不会感觉太困难,我要实现的效果是什么样呢?下面请先看效果图: 看上去是不很炫的样子,它的实现上也不是很复杂,重点在与onDraw()方法的绘制. 首 ...
- knockout+echarts实现图表展示
一.需要学习的知识 knockout, require, director, echarts, jquery.简单的入一下门,网上的资料很多,最直接就是进官网校习. 二.效果展示 三.require的 ...
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...
- 前端MVC学习总结(二)——AngularJS验证、过滤器、指令
一.验证 angularJS中提供了许多的验证指令,可以轻松的实现验证,只需要在表单元素上添加相应的ng属性,常见的如下所示: <input Type="text" ng-m ...
- 妥协与取舍,解构C#中的小数运算
题外话 正文开始之前,我首先要感谢博客园提供的这个优秀的平台.通过在这个优秀的平台上和很多志同道合的朋友交流,互相帮助,我也很荣幸的获得了15年的微软MVP的奖项.也使我更加坚信了代码改变世界.感激! ...
- unity3d 免费好用的数据库处理框架 数据库直连框架
一.概述 前不久有一个哥们做PC游戏开发的.使用到Unity3d, 正好找到我. 我给他提供了Unity3d如何Moon.Orm来智能化编程的方式. 我们先看看怎么更加便捷sqlite. http:/ ...
- MahApps.Metro打造拉风的桌面应用程序
官网:http://mahapps.com/ github:https://github.com/MahApps/MahApps.Metro
- IntelliJ IDEA使用(二):tomcat和jetty配置
上一讲用idea创建了maven web项目,接下来我们把项目发布到tomcat和jetty运行,以便进一步地开发和调试 配置tomcat 第一.打开菜单栏 第二.点击设置按钮,添加应用服务器,选择t ...
- win10 安装visual studio 2015遇到的坑
最近win7系统不知啥原因无法访问域中的网络文件,打算升级到win10体验一下.结果发现这一路有太多的坑.首先安装win10基本上算顺利,但是当进入系统后,菜单模式对于PC的鼠标来说,用起来感觉不顺手 ...
- js数组转换问题
一维数组转多维数组 var arr=[1,2,3,4,5,6,7,8,9,10]; function splitArray(arr,size){ var result = []; var tempAr ...