一、引入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 {
@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事务-三种实现方式的更多相关文章

  1. spring ioc三种注入方式

    spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...

  2. Spring IOC 三种注入方式

    1.    接口注入 2.    setter注入 3.    构造器注入 对象与对象之间的关系可以简单的理解为对象之间的依赖关系:A类需要B类的一个实例来进行某些操作,比如在A类的方法中需要调用B类 ...

  3. Spring IOC三种注入方式(接口注入、setter注入、构造器注入)(摘抄)

    IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转, Spring 框架的核心基于控制反转原理. 什么是控制反转?控制反转是一种将组件依赖关系的创建和管理置于程序外部的技 ...

  4. Spring的三种注入方式(Setter、构造函数和自动注入)

    一.Setter注入 这里我是希望在Student.java中调用Course.java中的内容. public class Course { public String name = "数 ...

  5. Spring bean三种创建方式

    spring共提供了三种实例化bean的方式:构造器实例化(全类名,反射).工厂方法(静态工厂实例化   动态工厂实例化)和FactoryBean ,下面一一详解: 1.构造器实例化 City.jav ...

  6. Spring IOC 三种注入方式(构造器,setter,接口)

    Spring的依赖注入有三种方式: 1,构造器注入 2,setter注入 3,接口注入 下面我给大家介绍一下这三种注入 1.构造器注入 构造器注入主要是依赖于构造方法去实现,构造方法可以是有参也可以是 ...

  7. spring的三种注入方式

    接口注入(不推荐) 构造器注入(死的应用) getter,setter方式注入(比较常用) Type1 接口注入 我们常常借助接口来将调用者与实现者分离.如: public class ClassA  ...

  8. Spring MVC三种返回方式

    spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void. 下面一一进行说明: 1.ModelAndV ...

  9. spring Bean的三种配置方式

    Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java Config 添加spring的maven repository <dependency> ...

随机推荐

  1. Object layout in C++ and access control

    The variables are guaranteed to be laid out contiguously, as in C. However, the access blocks may no ...

  2. 网页登陆校验码C#版代码

    [DefaultProperty("Text")] [ToolboxData("<{0}:ValidateCode runat=server></{0} ...

  3. Python快速排序

    快排,取一个key值,一般取第一个即可,将小于key的放到左边,大于key的放到右边,递归实现 import random def quicksort(data, low = 0, high = No ...

  4. 读书笔记-《Training Products of Experts by Minimizing Contrastive Divergence》

    Training Products of Experts by Minimizing Contrastive Divergence(以下简称 PoE)是 DBN 和深度学习理论的 肇始之篇,最近在爬梳 ...

  5. DELPHI TMS Advanced Charts 3.8.0.3 Full Source D6-XE6 控件分享

    仅供大家学习使用,请大家支持正版!! TMS Advanced Charts 3.8.0.3 Full Source D6-XE6 该控件用来画图标,压缩包里还有FOR INTRAWEB的版本 链接: ...

  6. c/c++的函数参数压栈顺序

    整理日:2015年3月18日 为了这句话丢了很多次人.无所谓了,反正咱脸皮厚. 总结一下 编译出来的c/c++程序的参数压栈顺序只和编译器相关! 下面列举了一些常见的编译器的调用约定 VC6 调用约定 ...

  7. http server v0.1_http_server.c

    /**************************************************************** filename: http_server.c author: xx ...

  8. [BZOJ 2049] [Sdoi2008] Cave 洞穴勘测 【LCT】

    题目链接:BZOJ - 2049 题目分析 LCT的基本模型,包括 Link ,Cut 操作和判断两个点是否在同一棵树内. Link(x, y) : Make_Root(x); Splay(x); F ...

  9. 【NOIP 2011】 观光公交

    题目描述 Description 风景迷人的小城 Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号 ...

  10. Warm up 2

    hdu4619:http://acm.hdu.edu.cn/showproblem.php?pid=4619 题意:题目大意:给你两种纸牌 ,一种水平放置共有n张 ,一种竖直放置共有m张.水平放置的纸 ...