原生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事物进行无缝连接。代码如下: