From aacdbfaa085cc67080f08d52996cf057729691be Mon Sep 17 00:00:00 2001 From: noear Date: Mon, 30 Dec 2024 10:35:31 +0800 Subject: [PATCH 1/4] =?UTF-8?q?mybatis-flex-solon:=20MybatisMapperIntercep?= =?UTF-8?q?tor=20=E6=96=B9=E6=A1=88=E6=8D=A2=E6=88=90=20MybatisSessionTemp?= =?UTF-8?q?late=20=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solon/MybatisFlexAutoConfiguration.java | 11 +- .../transaction/MybatisMapperInterceptor.java | 31 ---- .../transaction/MybatisSessionTemplate.java | 174 ++++++++++++++++++ 3 files changed, 178 insertions(+), 38 deletions(-) delete mode 100644 mybatis-flex-solon-plugin/src/main/java/com/mybatisflex/solon/transaction/MybatisMapperInterceptor.java create mode 100644 mybatis-flex-solon-plugin/src/main/java/com/mybatisflex/solon/transaction/MybatisSessionTemplate.java diff --git a/mybatis-flex-solon-plugin/src/main/java/com/mybatisflex/solon/MybatisFlexAutoConfiguration.java b/mybatis-flex-solon-plugin/src/main/java/com/mybatisflex/solon/MybatisFlexAutoConfiguration.java index ab1cac78..363e8351 100644 --- a/mybatis-flex-solon-plugin/src/main/java/com/mybatisflex/solon/MybatisFlexAutoConfiguration.java +++ b/mybatis-flex-solon-plugin/src/main/java/com/mybatisflex/solon/MybatisFlexAutoConfiguration.java @@ -6,8 +6,8 @@ import com.mybatisflex.core.MybatisFlexBootstrap; import com.mybatisflex.core.mybatis.FlexConfiguration; import com.mybatisflex.core.mybatis.FlexSqlSessionFactoryBuilder; import com.mybatisflex.core.row.RowMapperInvoker; -import com.mybatisflex.solon.transaction.MybatisMapperInterceptor; import com.mybatisflex.solon.transaction.SolonManagedTransactionFactory; +import com.mybatisflex.solon.transaction.MybatisSessionTemplate; import org.apache.ibatis.builder.xml.XMLMapperBuilder; import org.apache.ibatis.executor.ErrorContext; import org.apache.ibatis.io.Resources; @@ -171,13 +171,10 @@ public class MybatisFlexAutoConfiguration { public void mapperPublish(FlexConfiguration flexConfiguration, FlexGlobalConfig globalConfig, SqlSessionFactory sqlSessionFactory) { - for (Class mapperClz : flexConfiguration.getMapperRegistry().getMappers()) { - MybatisMapperInterceptor handler = new MybatisMapperInterceptor(sqlSessionFactory, mapperClz); + MybatisSessionTemplate sqlSessionTemplate = new MybatisSessionTemplate(sqlSessionFactory); - Object mapperProxy = Proxy.newProxyInstance( - mapperClz.getClassLoader(), - new Class[]{mapperClz}, - handler); + for (Class mapperClz : flexConfiguration.getMapperRegistry().getMappers()) { + Object mapperProxy = sqlSessionTemplate.getMapper(mapperClz); //推入容器,之后可以被注入 appContext.wrapAndPut(mapperClz, mapperProxy); diff --git a/mybatis-flex-solon-plugin/src/main/java/com/mybatisflex/solon/transaction/MybatisMapperInterceptor.java b/mybatis-flex-solon-plugin/src/main/java/com/mybatisflex/solon/transaction/MybatisMapperInterceptor.java deleted file mode 100644 index c2eaf868..00000000 --- a/mybatis-flex-solon-plugin/src/main/java/com/mybatisflex/solon/transaction/MybatisMapperInterceptor.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.mybatisflex.solon.transaction; - -import org.apache.ibatis.session.SqlSession; -import org.apache.ibatis.session.SqlSessionFactory; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; - -/** - * Mybatis Mapper Interceptor - * - * @author noear - * @since 1.6 - */ -public class MybatisMapperInterceptor implements InvocationHandler { - private SqlSessionFactory factory; - private Class mapperClz; - - public MybatisMapperInterceptor(SqlSessionFactory factory, Class mapperClz) { - this.factory = factory; - this.mapperClz = mapperClz; - } - - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - try (SqlSession session = factory.openSession(true)) { - Object mapper = session.getMapper(mapperClz); - return method.invoke(mapper, args); - } - } -} diff --git a/mybatis-flex-solon-plugin/src/main/java/com/mybatisflex/solon/transaction/MybatisSessionTemplate.java b/mybatis-flex-solon-plugin/src/main/java/com/mybatisflex/solon/transaction/MybatisSessionTemplate.java new file mode 100644 index 00000000..add106f9 --- /dev/null +++ b/mybatis-flex-solon-plugin/src/main/java/com/mybatisflex/solon/transaction/MybatisSessionTemplate.java @@ -0,0 +1,174 @@ +package com.mybatisflex.solon.transaction; + +import org.apache.ibatis.cursor.Cursor; +import org.apache.ibatis.executor.BatchResult; +import org.apache.ibatis.session.*; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.sql.Connection; +import java.util.List; +import java.util.Map; + +/** + * @author noear 2024/12/30 created + * @since 3.0 + */ +public class MybatisSessionTemplate implements SqlSession { + private final SqlSessionFactory sqlSessionFactory; + private final ExecutorType executorType; + private final SqlSession sqlSessionProxy; + + public MybatisSessionTemplate(SqlSessionFactory sqlSessionFactory) { + this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType()); + } + + public MybatisSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType) { + this.sqlSessionFactory = sqlSessionFactory; + this.executorType = executorType; + this.sqlSessionProxy = (SqlSession) Proxy.newProxyInstance(SqlSessionFactory.class.getClassLoader(), new Class[]{SqlSession.class}, new SqlSessionInterceptor()); + } + + public SqlSessionFactory getSqlSessionFactory() { + return this.sqlSessionFactory; + } + + public ExecutorType getExecutorType() { + return this.executorType; + } + + public T selectOne(String statement) { + return (T) this.sqlSessionProxy.selectOne(statement); + } + + public T selectOne(String statement, Object parameter) { + return (T) this.sqlSessionProxy.selectOne(statement, parameter); + } + + public Map selectMap(String statement, String mapKey) { + return this.sqlSessionProxy.selectMap(statement, mapKey); + } + + public Map selectMap(String statement, Object parameter, String mapKey) { + return this.sqlSessionProxy.selectMap(statement, parameter, mapKey); + } + + public Map selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) { + return this.sqlSessionProxy.selectMap(statement, parameter, mapKey, rowBounds); + } + + public Cursor selectCursor(String statement) { + return this.sqlSessionProxy.selectCursor(statement); + } + + public Cursor selectCursor(String statement, Object parameter) { + return this.sqlSessionProxy.selectCursor(statement, parameter); + } + + public Cursor selectCursor(String statement, Object parameter, RowBounds rowBounds) { + return this.sqlSessionProxy.selectCursor(statement, parameter, rowBounds); + } + + public List selectList(String statement) { + return this.sqlSessionProxy.selectList(statement); + } + + public List selectList(String statement, Object parameter) { + return this.sqlSessionProxy.selectList(statement, parameter); + } + + public List selectList(String statement, Object parameter, RowBounds rowBounds) { + return this.sqlSessionProxy.selectList(statement, parameter, rowBounds); + } + + public void select(String statement, ResultHandler handler) { + this.sqlSessionProxy.select(statement, handler); + } + + public void select(String statement, Object parameter, ResultHandler handler) { + this.sqlSessionProxy.select(statement, parameter, handler); + } + + public void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler) { + this.sqlSessionProxy.select(statement, parameter, rowBounds, handler); + } + + public int insert(String statement) { + return this.sqlSessionProxy.insert(statement); + } + + public int insert(String statement, Object parameter) { + return this.sqlSessionProxy.insert(statement, parameter); + } + + public int update(String statement) { + return this.sqlSessionProxy.update(statement); + } + + public int update(String statement, Object parameter) { + return this.sqlSessionProxy.update(statement, parameter); + } + + public int delete(String statement) { + return this.sqlSessionProxy.delete(statement); + } + + public int delete(String statement, Object parameter) { + return this.sqlSessionProxy.delete(statement, parameter); + } + + public T getMapper(Class type) { + return (T) this.getConfiguration().getMapper(type, this); + } + + public void commit() { + throw new UnsupportedOperationException("Manual commit is not allowed over a Solon managed SqlSession"); + } + + public void commit(boolean force) { + throw new UnsupportedOperationException("Manual commit is not allowed over a Solon managed SqlSession"); + } + + public void rollback() { + throw new UnsupportedOperationException("Manual rollback is not allowed over a Solon managed SqlSession"); + } + + public void rollback(boolean force) { + throw new UnsupportedOperationException("Manual rollback is not allowed over a Solon managed SqlSession"); + } + + public void close() { + throw new UnsupportedOperationException("Manual close is not allowed over a Solon managed SqlSession"); + } + + public void clearCache() { + this.sqlSessionProxy.clearCache(); + } + + public Configuration getConfiguration() { + return this.sqlSessionFactory.getConfiguration(); + } + + public Connection getConnection() { + return this.sqlSessionProxy.getConnection(); + } + + public List flushStatements() { + return this.sqlSessionProxy.flushStatements(); + } + + public void destroy() throws Exception { + } + + private class SqlSessionInterceptor implements InvocationHandler { + private SqlSessionInterceptor() { + } + + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + try (SqlSession sqlSession = MybatisSessionTemplate.this.sqlSessionFactory.openSession(MybatisSessionTemplate.this.executorType)) { + return method.invoke(sqlSession, args); + } + } + } +} -- Gitee From b9e045b6a806f538e4e9a7c7e1663aaea91ba63d Mon Sep 17 00:00:00 2001 From: noear Date: Tue, 31 Dec 2024 22:46:22 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=B7=BB=E5=8A=A0=20solo?= =?UTF-8?q?n=20=E9=85=8D=E7=BD=AE=E7=9B=B8=E5=85=B3=E7=9A=84=E5=86=85?= =?UTF-8?q?=E5=AE=B9=EF=BC=88=E8=A1=A5=E5=9C=A8=20spring=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E6=A1=A3=E4=B8=8A=E3=80=82=E7=8E=B0=E5=9C=A8?= =?UTF-8?q?=E5=87=A0=E4=B9=8E=E4=B8=80=E6=A0=B7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/base/configuration.md | 8 ++++---- docs/zh/core/multi-datasource.md | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/zh/base/configuration.md b/docs/zh/base/configuration.md index 2e4e0e8f..fa9ab33c 100644 --- a/docs/zh/base/configuration.md +++ b/docs/zh/base/configuration.md @@ -1,6 +1,6 @@ -# SpringBoot 配置文件 +# SpringBoot 或 Solon 配置文件 -SpringBoot 配置文件(`application.yml` 等)主要是用于对 MyBatis 原生以及 MyBatis-Flex 的 `FlexGlobalConfig` 进行配置。 +SpringBoot 配置文件(`application.yml` 等);Solon 配置文件(`app.yml` 等)。主要是用于对 MyBatis 原生以及 MyBatis-Flex 的 `FlexGlobalConfig` 进行配置。 示例如下: @@ -26,7 +26,7 @@ mybatis-flex: - 类型:`Map>` - 默认值:`null` -MyBatis-Flex 多数据源配置,参考 [多数据源配置](../core/multi-datasource.md#更多的-spring-yaml-配置支持)。 +MyBatis-Flex 多数据源配置,参考 [多数据源配置](../core/multi-datasource.md#更多的-yaml-配置支持)。 ### config-location @@ -203,7 +203,7 @@ mybatis-flex: ### seata-mode -- 类型:`com.mybatisflex.spring.boot.MybatisFlexProperties.SeataMode` +- 类型:`com.mybatisflex.spring.boot.MybatisFlexProperties.SeataMode`,或者 `com.mybatisflex.solon.MybatisFlexProperties.SeataMode` - 默认值:`AT` 使用 Seata AT 模式代理数据源。 diff --git a/docs/zh/core/multi-datasource.md b/docs/zh/core/multi-datasource.md index 1f614431..3a8b95db 100644 --- a/docs/zh/core/multi-datasource.md +++ b/docs/zh/core/multi-datasource.md @@ -18,7 +18,7 @@ mybatis-flex: 在以上配置中,`ds1` 和 `ds2` 是由用户自定义的,我们可以理解为数据源的名称,或者数据源的 `key`,这个在动态切换数据库中非常有用。 -在无 Spring 框架的场景下,代码如下: +在无 Spring 或 Solon 框架的场景下,代码如下: ```java DataSource dataSource1 = new HikariDataSource(); @@ -72,7 +72,7 @@ MyBatis-Flex 提供了 4 种方式来配置数据源: - 3、`@UseDataSource("dataSourceName")` 在 Mapper 方法上,添加注解,用于指定使用哪个数据源。 - 4、`@Table(dataSource="dataSourceName")` 在 Entity 类上添加注解,该 Entity 的增删改查请求默认使用该数据源。 -> 在 SpringBoot 项目上,`@UseDataSource("dataSourceName")` 也可用于在 Controller 或者 Service 上。若是 Spring 项目(非 SpringBoot), +> 在 SpringBoot 或 Solon 项目上,`@UseDataSource("dataSourceName")` 也可用于在 Controller 或者 Service 类上。若是 Spring 项目(非 SpringBoot), > 用户需要参考 `MultiDataSourceAutoConfiguration` 进行配置后才能使用。 @@ -123,7 +123,7 @@ public class Account { `DataSourceKey.use()` > `@UseDataSource()在方法上` > `@UseDataSource()在类上` >`@Table(dataSource="...")` ::: -## 更多的 Spring Yaml 配置支持 +## 更多的 Spring 或 Solon Yaml 配置支持 ```yaml mybatis-flex: datasource: -- Gitee From fac0c9c33feeaa78c228474d1c3c5ba635c9a86a Mon Sep 17 00:00:00 2001 From: noear Date: Tue, 31 Dec 2024 23:00:30 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=B7=BB=E5=8A=A0=20solo?= =?UTF-8?q?n=20=E9=85=8D=E7=BD=AE=E7=9B=B8=E5=85=B3=E7=9A=84=E5=86=85?= =?UTF-8?q?=E5=AE=B9=EF=BC=88=E8=A1=A5=E5=9C=A8=20spring=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E6=A1=A3=E4=B8=8A=E3=80=82=E7=8E=B0=E5=9C=A8?= =?UTF-8?q?=E5=87=A0=E4=B9=8E=E4=B8=80=E6=A0=B7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mybatis-flex-test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mybatis-flex-test/pom.xml b/mybatis-flex-test/pom.xml index 3f7539fb..81aa320c 100644 --- a/mybatis-flex-test/pom.xml +++ b/mybatis-flex-test/pom.xml @@ -19,7 +19,7 @@ mybatis-flex-spring-test mybatis-flex-spring-boot-test mybatis-flex-spring-cloud-test - + mybatis-flex-solon-test -- Gitee From 3eaa27cc0ba32065be7cc5ab4e0e1ce56d6feb40 Mon Sep 17 00:00:00 2001 From: noear Date: Tue, 31 Dec 2024 23:02:14 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=B7=BB=E5=8A=A0=20solo?= =?UTF-8?q?n=20=E9=85=8D=E7=BD=AE=E7=9B=B8=E5=85=B3=E7=9A=84=E5=86=85?= =?UTF-8?q?=E5=AE=B9=EF=BC=88=E8=A1=A5=E5=9C=A8=20spring=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E6=A1=A3=E4=B8=8A=E3=80=82=E7=8E=B0=E5=9C=A8?= =?UTF-8?q?=E5=87=A0=E4=B9=8E=E4=B8=80=E6=A0=B7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/base/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/base/configuration.md b/docs/zh/base/configuration.md index fa9ab33c..5348db74 100644 --- a/docs/zh/base/configuration.md +++ b/docs/zh/base/configuration.md @@ -26,7 +26,7 @@ mybatis-flex: - 类型:`Map>` - 默认值:`null` -MyBatis-Flex 多数据源配置,参考 [多数据源配置](../core/multi-datasource.md#更多的-yaml-配置支持)。 +MyBatis-Flex 多数据源配置,参考 [多数据源配置](../core/multi-datasource.md#更多的 Spring 或 Solon Yaml 配置支持)。 ### config-location -- Gitee