7 Spring控制事务的开发

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&amp;allowPublicKeyRetrieval=true&amp;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>

至此配置完成了,之后直接编写代码即可

很简单就三步

  1. 指定要处理的方法(用注解方式)
  2. 配置事务
  3. 组装(说是通知也行)
上一篇:Spring 框架简述 (二)


下一篇:通过多态,反射,配置文件,工厂来解耦