开发工具及软件
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