之前我们介绍过原生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事物进行无缝连接。代码如下: