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);
}
时间: 2024-10-24 19:30:31

Spring事务之详解--三种实现方式的相关文章

Spring事务Transaction配置的五种注入方式详解

Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ??? 总结如下: ??? Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. ???DataSou

spring事务配置详解

spring的事务配置一直感觉都比较的模糊,没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部分只是会根据数据访问方式有所变化.但总的来说都是对Connection的封装,变化基本上可以忽略

Spring 事务机制详解

Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,仅供学习参考. Spring声明式事务让我们从复杂的事务处理中得到解脱.使得我们再也无需要去处理获得连接.关闭连接.事务提交和回滚等这些操作.再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码.我们在使用Spring声明式事务时,有一个非常重要的概念就是事务属性.事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成.我们在进行事

spring 事务管理详解 学习心得

今天,我终于登上了你的诺曼底,spring事务. 在此之前,一谈起spring我就没底,虽然用的很顺手,但是其中的AOP和事务一直未理解和掌握,数次尝试突破都未成功,之前看过很多网上的相关文章和书籍,要么基于的版本不同,有的基于spring2有的基于spring3:要么切入点不同,有的讲的太低级,我都懂,有的讲的太庞杂,我晕了...... 从这周一开始,我决定在试一下.计划每天的上午专门学习,横扫各大网站,收集文章,然后对其分类,整理记笔记,到周二坚持一个一个的看,规整,理解,熟记,本子下写下了

这可能是最漂亮的Spring事务管理详解

事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事物的特性(ACID): 原子性: 事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用: 一致性: 执行事务前后,数据保持一致: 隔离性: 并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的: 持久性: 一个事务被提交之后.它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响. Spring事务管理接口介绍 Spring事务管理接口:

一文解析Spring事务管理详解;通俗易懂,轻松掌握!

事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事物的特性(ACID): 原子性:?事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用: 一致性:?执行事务前后,数据保持一致: 隔离性:?并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的: 持久性:?一个事务被提交之后.它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响. Spring事务管理接口介绍 Spring事务管理接口:

详解三种java实现多线程的方式

java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class thread1 extends Thread {    public void run() {        for (int i = 0; i < 10000; i++) {            System.out.println("我是线程"+

详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)

在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候,使用新页面的时候,就释放旧的页面空间,把新页面缓存起来,以便下次使用同样的页面的时候方便调用. 缓存调度流程图 缓存机制就是上面所说的那样,但是实现的过程以及淘汰旧页面的机制不同,所以会有不同缓存调度方法,就常见的就是FIFO,LRU,LFU缓存过期策略. 1.FIFO(First In First

Spring随笔 —— IOC配置的三种不同方式简介

在spring framework中,IOC的配置是最基础的部分,常见的配置方式有基于xml文件和基于注解的配置方式.除了这两种配置方式之外,今天这里再介绍另一种配置方式,先用小demo重温下我们熟悉的两种配置方式. UserService调用UserDao中的login(String username, String password)方法. 一.基于XML配置文件的方式 UserDao.java 1 package org.lizf.demo; 2 3 public class UserDa