7 Spring控制事务的开发
1.常见的控制事务的方法
-
JDBC
Connection.setAutoCommit(fales); Connection.commit(); Connection.rollback();
-
Mybaits
Mybaits自动开启事务 SqlSession(Connection).commit(); SqlSession(Connection).rollback();
相同点:都是使用Connection对象操作事务
2.Spring控制事务
1.传统的事务开发,使用拦截器
public Object invoke(MethodInvocation invocation){
try{
Connection.setAutoCommit(fales);
Connection.commit();
Object ret =invocation.proceed();
Connection.rollback();
}catch(Exception e){
Connection.rollback();
}
return ret;
}
2.使用DataSourceTransactionManager开发
原理:Spring是通过AOP的方式控制事务
那我们就通过AOP的开发步骤来为我们的方法添加事务
AOP的开发步骤
- 原始对象
- 额外方法
- 切入点
- 组装切面
1.原始对象
就是普通业务层的Service的接口实现类
例如:
Service接口
注:StudentEntity是实体
package org.StudentService;
import org.Mybatis.StudentEntity;
public interface Service {
void InsertStudentinfo(StudentEntity studentEntity);
}
Service实现类
注意点:
要调用DAO层的对象的话要声明为成员变量
为其提供set/get方法
@Transactional注解后面解释
package org.StudentService;
import org.Mybatis.StudentDAO;
import org.Mybatis.StudentEntity;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public class ServiceImpl implements Service{
private StudentDAO studentDAO;
@Override
public void InsertStudentinfo(StudentEntity studentEntity){
studentDAO.InsertStuinfo(studentEntity);
//throw new RuntimeException();
}
public StudentDAO getStudentDAO() {
return studentDAO;
}
public void setStudentDAO(StudentDAO studentDAO) {
this.studentDAO = studentDAO;
}
}
2.额外方法
使用Spring提供的DataSourceTransactionManager
它提供的实现类似于传统的事务开发,使用拦截器。
由于是事务开发所以必有Connection对象,那么我们就需要指定出Connection,这指定之前创建的连接池dataSourse的连接对象
在配置文件中如下配置:
<!--为这个DAO实现添加事务-->
<bean id="service" class="org.StudentService.ServiceImpl">
<property name="studentDAO" ref="studentDAO"/>
</bean>
<!--配置事务-->
<bean id="dataSourceTransationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourse"/>
</bean>
3.切入点
在需要添加事务的方法添加@Transactional注解
4.组装切面
必须注意这个标签是schema/tx下的
在配置文件如下配置DataSourceTransationManager的ID
也就是指定上面的
<tx:annotation-driven transaction-manager="dataSourceTransationManager" proxy-target-class="false"/>
proxy-target-class指定是JDK 还是CGlib动态代理
5.配置文件完整代码
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--连接池配置-->
<bean id="dataSourse" class="com.alibaba.druid.pool.DruidDataSource" >
<property name="username" value="root"/>
<property name="url" value="jdbc:mysql://localhost:3306/jdbc_test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"/>
<property name="password" value="123456"/>
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
</bean>
<!--sqlseesion工厂创建-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--指定数据源-->
<property name="dataSource" ref="dataSourse"/>
<!--类型别名,日后直接用类名充当-->
<property name="typeAliases" value="org.Mybatis.StudentEntity"/>
<property name="mapperLocations" >
<list>
<value>
<!--通配写法,按照这个命名规范书写-->
classpath:Mapper/*Mapper.xml
</value>
</list>
</property>
</bean>
<!--创建DAO 对象-->
<bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--对应上面的SqlSessionFactoryBean的名字-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
<!--MapperScannerConfigurer到DAO下的包自动的找到对应DAO接口来创建对象-->
<!--注意!在通过Spring工厂获取对象时使用的时接口名首字母小写,我们在接口命名时就需要约定接口名首字母大写-->
<property name="basePackage" value="org.Mybatis"/>
</bean>
<!--为这个DAO实现添加事务-->
<bean id="service" class="org.StudentService.ServiceImpl">
<property name="studentDAO" ref="studentDAO"/>
</bean>
<!--配置事务-->
<bean id="dataSourceTransationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourse"/>
</bean>
<tx:annotation-driven transaction-manager="dataSourceTransationManager" proxy-target-class="false"/>
</beans>
至此配置完成了,之后直接编写代码即可
很简单就三步
- 指定要处理的方法(用注解方式)
- 配置事务
- 组装(说是通知也行)