Spring——编程式事务管理


开发工具及软件
IntelliJ IDEA 2017 + Maven + Spring + MySQL

Spring编程式事务管理需要手动编写代码来进行事务管理
这里用一个简单转账Demo来举例

1.配置文件

pom.xml


  4.0.0
  spring_transaction
  spring_transaction
  war
  1.0-SNAPSHOT
  spring_transaction Maven Webapp
  http://maven.apache.org
  

    
    
      junit
      junit
      4.12
    

    
    
      org.springframework
      spring-context
      4.3.10.RELEASE
    

    
    
      org.springframework
      spring-core
      4.3.10.RELEASE
    

    
    
      org.springframework
      spring-beans
      4.3.10.RELEASE
    

    
    
      org.springframework
      spring-web
      4.3.10.RELEASE
    

    
    
      org.springframework
      spring-tx
      4.3.10.RELEASE
    

    
    
      org.springframework
      spring-jdbc
      4.3.10.RELEASE
    

    
    
      org.springframework
      spring-expression
      4.3.10.RELEASE
    

    
    
      org.springframework
      spring-aspects
      4.3.10.RELEASE
    

    
    
      mysql
      mysql-connector-java
      5.1.38
    

    
    
      commons-logging
      commons-logging
      1.1.1
    

    
    
      log4j
      log4j
      1.2.17
    

    
    
      com.mchange
      c3p0
      0.9.5.2
    

    
    
      org.aspectj
      aspectjweaver
      1.8.10
    

    
    
      org.springframework
      spring-test
      4.3.10.RELEASE
    

    
    
      aopalliance
      aopalliance
      1.0
    


  

  
    spring_transaction
  


log4j.properties

# Configure logging for testing: optionally with log file
log4j.rootLogger=WARN, stdout
# log4j.rootLogger=WARN, stdout, logfile

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

mysql.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/pay?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

pay.sql

CREATE TABLE `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `money` double DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `account` VALUES ('1', 'aaa', '1000');
INSERT INTO `account` VALUES ('2', 'bbb', '1000');
INSERT INTO `account` VALUES ('3', 'ccc', '1000');

2、接口设置

通常我们使用Spring是基于接口开发的,所以这里先创建一个Service接口和一个DAO层接口:

AccountService.java

package com.zbnfy.demo1.service;
/**
 * Created by zbnfy on 2017/10/7.
 * 转账案例的业务接口
 */
public interface AccountService {
    /**
     * @param out 转出账号
     * @param in  转入账号
     * @param money  转账金额
     */
    public void transfer(String out,String in,Double money);
}

AccountDao.java

package com.zbnfy .demo1.dao;

/**
 * Created by zbnfy on 2017/10/7.
 */
public interface AccountDao {
    /**
     * @param out 转出账号
     * @param money  转出金额
     */
    public void outMonry(String out,Double money);

    /**
     * @param in  转入账号
     * @param money  转入金额
     */
    public void inMoney(String in,Double money);  
}

3.实现类

AccountServiceImpl.java

package com.zbnfy.demo1.service;

import com.zbnfy.demo1.dao.AccountDao;
import org.springframework.transaction.support.TransactionTemplate;

/**
 * Created by zbnfy on 2017/10/7.
 * 转账案例的实现类
 */
public class AccountServiceImpl implements AccountService {

    private AccountDao accountDao;

    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }


    //注入事务管理的模板
    private TransactionTemplate transactionTemplate;

    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }

    /**
     * @param out 转出账号
     * @param in  转入账号
     * @param money  转账金额
     */
    public void transfer(final String out,final String in,final Double money) {
        accountDao.outMonry(out,money);
        accountDao.inMoney(in,money);
    }
}

AccountDaoImpl.java

package com.zbnfy.demo1.dao;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

/**
 * Created by zbnfy on 2017/10/7.
 */
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao{
    /**
     * @param out 转出账号
     * @param money  转出金额
     */
    public void outMonry(String out, Double money) {
        String sql = "update account set money = money - ? where name = ?";
        this.getJdbcTemplate().update(sql,money,out);
    }

    /**
     * @param in  转入账号
     * @param money  转入金额
     */
    public void inMoney(String in, Double money) {
        String sql = "update account set money = money + ? where name = ?";
        this.getJdbcTemplate().update(sql,money,in);
    }
}

4.测试类

package com.zbnfy.demo1.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

/**
 * Created by zbnfy on 2017/10/7.
 * Spring编程式测试类
 */

@RunWith(SpringJUnit4ClassRunner.class)  //JUnit4测试
@ContextConfiguration("classpath:spring-context.xml")  //Spring配置文件
public class SpringDemo1 {
    //测试业务层
    @Resource(name = "accountService")
    private AccountService accountService;

    @Test
    public void demo1() {
        accountService.transfer("aaa","bbb",200d);
    }
}

5.Spring配置

spring-context.xml




    
    

    
    
        
        
        
        
    

    
    
          //业务层控制DAO层
        
        
    

    
    
          //控制数据库连接池
    

    
    
           //控制数据库连接池
    

    
    
          //事务模板类控制事务管理器
    



6.总结

编程式事务管理方法允许在源代码编程的方式下管理事务。基于TransactionTemplate编程,虽然带来了极大地灵活性,但是难以维护。所以实际开发中一般不用这种方式。


参考资料:
慕课网http://www.imooc.com/video/9331

你可能感兴趣的:(Spring——编程式事务管理)