原生mybatis使用spring事物

之前我们介绍过原生jdbc使用spring事物,下面我们介绍原生mybatis使用spring事物。

代码:

/**
 * 使用TransactionAwareDataSourceProxy将原生mybatis与spring事物结合
 */
@Test
public void test7() throws Exception {
    //创建数据源
    SimpleDriverDataSource simpleDriverDataSource = new SimpleDriverDataSource();
    simpleDriverDataSource.setDriverClass(com.mysql.jdbc.Driver.class);
    simpleDriverDataSource.setPassword("test1234");
    simpleDriverDataSource.setUsername("root");
    simpleDriverDataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8");

    //创建数据源代理
    TransactionAwareDataSourceProxy transactionAwareDataSourceProxy = new TransactionAwareDataSourceProxy();
    transactionAwareDataSourceProxy.setTargetDataSource(simpleDriverDataSource);
    transactionAwareDataSourceProxy.afterPropertiesSet();

    //开启spring事物管理
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
    dataSourceTransactionManager.setDataSource(transactionAwareDataSourceProxy);
    dataSourceTransactionManager.afterPropertiesSet();
    DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();

    //使用mybatis提供的事物工厂
    JdbcTransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();
    //将数据源代理放到环境属性中
    Environment environment = new Environment("test", jdbcTransactionFactory, transactionAwareDataSourceProxy);
    
    //创建sqlSessionFactory
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    sqlSessionFactory.getConfiguration().setEnvironment(environment);
    //开启事物并创建链接,并设置事物属性,将链接放到ThreadLocal中
    TransactionStatus transaction = dataSourceTransactionManager.getTransaction(defaultTransactionDefinition);
    SqlSession session = sqlSessionFactory.openSession();
    try {

        UserMapper mapper = session.getMapper(UserMapper.class);

        mapper.getAll(1);
    } finally {
         /*
            事物提交会自动关闭链接,具体由DataSourceUtils.releaseConnection(this.connection, this.dataSource);这个方法关闭
            该方法广泛用于spring的jdbcTemplate(即spring jdbc中),mybatis-spring的SpringManagedTransaction,TransactionAwareDataSourceProxy,
            DataSourceTransactionManager
             */
        dataSourceTransactionManager.commit(transaction);
    }


}

 

为了方便,我们使用了TransactionAwareDataSourceProxy代理源数据源,将mybatis与spring事物进行关联,还有一种方式就是使用DataSourceUtils,不过那就比较麻烦了,我们自己要实现TransactionFactory,Transaction这两个接口,然后在Transaction实现类中的getConnection方法中使用DataSourceUtils.getConnection(this.dataSource);去获取连接。

 

mybatis-spring 就是使用了DataSourceUtils,它提供了SpringManagedTransactionFactory,SpringManagedTransaction这两个实现类用于关联spring事物,并且SpringManagedTransactionFactory是默认注入的,不需要我们自己配置,进而将mybatis与spring事物进行无缝连接。代码如下:

原生mybatis使用spring事物

原生mybatis使用spring事物