From 35086138f9b82134e6b384b1d3b8360bc48f22cd Mon Sep 17 00:00:00 2001 From: life <13122192336@163.com> Date: Thu, 3 Aug 2023 09:24:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dissuse(https://gitee.com/myba?= =?UTF-8?q?tis-flex/mybatis-flex/issues/I7HJ4J)=E4=BB=A5=E5=8F=8A=E5=A4=9A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90JdbcTemplate=E4=BA=8B=E5=8A=A1?= =?UTF-8?q?=E4=B8=8B=E4=BD=BF=E7=94=A8=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/FlexSpringTransaction.java | 70 +++++++++++++++++++ .../spring/FlexSqlSessionFactoryBean.java | 6 +- .../spring/FlexTransactionFactory.java | 39 +++++++++++ .../test/controller/AccountController.java | 13 +++- 4 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexSpringTransaction.java create mode 100644 mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexTransactionFactory.java diff --git a/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexSpringTransaction.java b/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexSpringTransaction.java new file mode 100644 index 00000000..00dd330f --- /dev/null +++ b/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexSpringTransaction.java @@ -0,0 +1,70 @@ +package com.mybatisflex.spring; + +import com.mybatisflex.core.datasource.DataSourceKey; +import com.mybatisflex.core.datasource.FlexDataSource; +import com.mybatisflex.core.transaction.TransactionContext; +import com.mybatisflex.core.transaction.TransactionalManager; +import com.mybatisflex.core.util.StringUtil; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import javax.sql.DataSource; +import org.apache.ibatis.session.TransactionIsolationLevel; +import org.apache.ibatis.transaction.Transaction; +import org.springframework.util.StringUtils; + +/** + * spring事务支持,解决issusehttps://gitee.com/mybatis-flex/mybatis-flex/issues/I7HJ4J + * @author life + */ +public class FlexSpringTransaction implements Transaction { + + DataSource dataSource; + + boolean isTransaction; + + TransactionIsolationLevel level; + boolean autoCommit; + + + public FlexSpringTransaction(DataSource dataSource, TransactionIsolationLevel level, + boolean autoCommit) { + this.dataSource = dataSource; + this.level = level; + this.autoCommit = autoCommit; + } + + @Override + public Connection getConnection() throws SQLException { + if (dataSource instanceof FlexDataSource) { + return dataSource.getConnection(); + }else{ + throw new SQLException("The datasource must be FlextDataSource"); + } + + + } + + @Override + public void commit() throws SQLException { + getConnection().commit(); + } + + @Override + public void rollback() throws SQLException { + getConnection().rollback(); + } + + @Override + public void close() throws SQLException { + getConnection().close(); + } + + @Override + public Integer getTimeout() throws SQLException { + return getConnection().getNetworkTimeout(); + } +} diff --git a/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexSqlSessionFactoryBean.java b/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexSqlSessionFactoryBean.java index 071dca49..9eea1ccc 100644 --- a/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexSqlSessionFactoryBean.java +++ b/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexSqlSessionFactoryBean.java @@ -89,6 +89,7 @@ import static org.springframework.util.StringUtils.tokenizeToStringArray; * @author Jens Schauder * @author 王帅 * @author miachel + * @author life */ public class FlexSqlSessionFactoryBean extends SqlSessionFactoryBean implements FactoryBean, InitializingBean, ApplicationListener { @@ -595,9 +596,12 @@ public class FlexSqlSessionFactoryBean extends SqlSessionFactoryBean // 事务由 flex 管理了,无需使用 SpringManagedTransactionFactory,否则会造成在同一个事务下,无法切换数据源的问题 // fixed https://gitee.com/mybatis-flex/mybatis-flex/issues/I70QWU + // 兼容SpringManagedTransactionFactory否则在使用JdbcTemplate,多数据源使用JdbcTemplate报错 + //fixed https://gitee.com/mybatis-flex/mybatis-flex/issues/I7HJ4J targetConfiguration.setEnvironment(new Environment(this.environment, // this.transactionFactory == null ? new SpringManagedTransactionFactory() : this.transactionFactory, - this.transactionFactory == null ? new JdbcTransactionFactory() : this.transactionFactory, +// this.transactionFactory == null ? new JdbcTransactionFactory() : this.transactionFactory, + this.transactionFactory == null ? new FlexTransactionFactory() : this.transactionFactory, dataSource instanceof FlexDataSource ? dataSource : new FlexDataSource(FlexConsts.NAME, dataSource))); diff --git a/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexTransactionFactory.java b/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexTransactionFactory.java new file mode 100644 index 00000000..1641a41d --- /dev/null +++ b/mybatis-flex-spring/src/main/java/com/mybatisflex/spring/FlexTransactionFactory.java @@ -0,0 +1,39 @@ +package com.mybatisflex.spring; + +import java.sql.Connection; +import java.util.Properties; +import javax.sql.DataSource; +import org.apache.ibatis.session.TransactionIsolationLevel; +import org.apache.ibatis.transaction.Transaction; +import org.mybatis.spring.transaction.SpringManagedTransaction; +import org.mybatis.spring.transaction.SpringManagedTransactionFactory; + +/** + * @author life + */ +public class FlexTransactionFactory extends SpringManagedTransactionFactory { + + /** + * {@inheritDoc} + */ + @Override + public Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit) { + return new FlexSpringTransaction(dataSource,level,autoCommit); + } + + /** + * {@inheritDoc} + */ + @Override + public Transaction newTransaction(Connection conn) { + throw new UnsupportedOperationException("New Spring transactions require a DataSource"); + } + + /** + * {@inheritDoc} + */ + @Override + public void setProperties(Properties props) { + // not needed in this version + } +} diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/controller/AccountController.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/controller/AccountController.java index 7f9ed421..d60279c1 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/controller/AccountController.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/java/com/mybatisflex/test/controller/AccountController.java @@ -26,6 +26,7 @@ import com.mybatisflex.test.mapper.MyAccountMapper; import com.mybatisflex.test.model.Account; import com.mybatisflex.test.model.AccountDto; import com.mybatisflex.test.service.AccountService; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; @@ -47,9 +48,19 @@ public class AccountController { @Resource AccountService accountService; + @Resource + JdbcTemplate jdbcTemplate; + @PostMapping("/account/add") - String add(@RequestBody Account account) { + @Transactional + public String add(@RequestBody Account account) { + jdbcTemplate.queryForObject("select count(*) from tb_account",Integer.class); + DataSourceKey.use("ds2"); + jdbcTemplate.update("INSERT INTO `flex_test`.`tb_account` ( `user_name`, `age`, `birthday`, `gender`, `is_delete`) VALUES ( '王五', 18, '2023-07-04 15:00:26', NULL, 000);"); + DataSourceKey.use("ds3333"); + accountMapper.insert(account); + DataSourceKey.use("ds2"); accountMapper.insert(account); return "add ok!"; }