前言:
- 本文讲解Spring的事务管理(XML配置文件方式)实现
- 本文是通过一步步创建项目的方式讲解
- 本文主要是讲具体的操作,对于事务管理的原理并不会深入讲解
环境:
- Intellij IDEA 2017 CI
具体步骤
1、新建Spring项目
具体项目名、类名及路径:
不清楚怎么创建Spring项目的?猛点Intellij IDEA创建Spring的Hello World项目
OrdersDao类:
package spring.dao;
import org.springframework.jdbc.core.JdbcTemplate;
public class OrdersDao {
// 注入jdbcTemplate
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
/*
做对数据库的操作,不写业务操作
*/
//减少金额
public void lessMoney(){
String sql = "update account set salary=salary-? where name=?";
jdbcTemplate.update(sql,100,"Tom");
}
//增加金额
public void moreMoney(){
String sql = "update account set salary=salary+? where name=?";
jdbcTemplate.update(sql,100,"John");
}
}
如果不清楚上面类中方法的内容的,或者对Spring中的Bean管理,注入属性不是很明白的,可以看下本人的这几篇文章
- Spring的Bean管理(XML配置文件方式)
- Spring属性注入【一】 注入方式介绍
- Spring属性注入【二】 注入对象类型属性
- Spring属性注入【三】 复杂类型注入
- Spring入门之C3P0连接池
OrdersService类:
package spring.service;
import spring.dao.OrdersDao;
public class OrdersService {
private OrdersDao ordersDao;
public void setOrdersDao(OrdersDao ordersDao) {
this.ordersDao = ordersDao;
}
//调用dao方法
/* 业务逻辑层 */
//转账业务
public void accountMonry(){
ordersDao.lessMoney(); //减少金额
int i = 10/0; //模拟出现异常
ordersDao.moreMoney(); //增加金额
}
}
注:本例只是为了说明事务管理,其中的方法在实际项目中并没有什么意思
TestService类:
package spring.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.service.OrdersService;
public class TestService {
@Test
public void testService(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
OrdersService ordersService = (OrdersService) applicationContext.getBean("ordersService");
ordersService.accountMonry();
}
}
applicationContext.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置C3P0连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--注入属性值-->
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///test"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!--service注入dao-->
<bean class="spring.service.OrdersService" id="ordersService">
<property name="ordersDao" ref="ordersDao"></property>
</bean>
<!--dao注入jdbcTemplate-->
<bean class="spring.dao.OrdersDao" id="ordersDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<!--jdbcTemplate注入数据源-->
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
2、配置事务管理器
<!--第一步 配置事务管理器-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源,指定对哪个数据库进行操作-->
<property name="dataSource" ref="dataSource"></property>
</bean>
3、配置事务增强
<!--第二步 配置事务增强-->
<tx:advice id="txadvice" transaction-manager="dataSourceTransactionManager">
<!--做事务操作-->
<tx:attributes>
<!--设置进行事务操作的方法匹配规则-->
<tx:method name="account*"/>
</tx:attributes>
</tx:advice>
4、配置切面
<!--第三步 配置切面-->
<aop:config>
<!--切入点-->
<aop:pointcut id="pointcut1" expression="execution(* spring.service.OrdersService.*(..))"></aop:pointcut>
<!--切面-->
<aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"></aop:advisor>
</aop:config>
applicationContext.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置C3P0连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--注入属性值-->
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///test"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!--第一步 配置事务管理器-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源,指定对哪个数据库进行操作-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--第二步 配置事务增强-->
<tx:advice id="txadvice" transaction-manager="dataSourceTransactionManager">
<!--做事务操作-->
<tx:attributes>
<!--设置进行事务操作的方法匹配规则-->
<tx:method name="account*"/>
</tx:attributes>
</tx:advice>
<!--第三步 配置切面-->
<aop:config>
<!--切入点-->
<aop:pointcut id="pointcut1" expression="execution(* spring.service.OrdersService.*(..))"></aop:pointcut>
<!--切面-->
<aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"></aop:advisor>
</aop:config>
<!--service注入dao-->
<bean class="spring.service.OrdersService" id="ordersService">
<property name="ordersDao" ref="ordersDao"></property>
</bean>
<!--dao注入jdbcTemplate-->
<bean class="spring.dao.OrdersDao" id="ordersDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<!--jdbcTemplate注入数据源-->
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
5、测试
测试前:
测试中断,因为我们模拟了异常的发生。
数据库中:
结果表明,在异常发生后,事务回滚,并没有更改数据库中的数据