diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts
index 3d77c868..c4d6f1f0 100644
--- a/docs/.vitepress/config.ts
+++ b/docs/.vitepress/config.ts
@@ -50,6 +50,7 @@ export default defineConfig({
{ text: '数据填充', link: '/zh/fill' },
{ text: '数据脱敏', link: '/zh/mask' },
{ text: 'SQL 审计', link: '/zh/audit' },
+ { text: '多数据源', link: '/zh/multi-datasource' },
]
},
{
diff --git a/docs/zh/multi-datasource.md b/docs/zh/multi-datasource.md
new file mode 100644
index 00000000..f7cf6083
--- /dev/null
+++ b/docs/zh/multi-datasource.md
@@ -0,0 +1,24 @@
+# 多数据源
+
+MyBaits-Flex 内置了功能完善的多数据源支持,不需要借助第三方插件或者依赖,开箱即用,
+支持包括 `druid`、`hikaricp`、`dbcp2`、`beecp` 在内的任何数据源,MyBatis-Flex 多数据源配置如下:
+
+```yaml
+mybatis-flex:
+ datasource:
+ ds1:
+ url: jdbc:mysql://127.0.0.1:3306/db
+ username: root
+ password: 123456
+ ds2:
+ url: jdbc:mysql://127.0.0.1:3306/db2
+ username: root
+ password: 123456
+```
+
+在以上配置中,`ds1` 和 `ds2` 是由用户自定义的,我们可以理解为数据源的名称,或者数据源的 `key`,这个在动态切换数据库中非常有用。
+
+## 通过注解指定数据源
+
+
+## 编码动态切换数据源
\ No newline at end of file
diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/MybatisFlexBootstrap.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/MybatisFlexBootstrap.java
index e59c64d8..858edd7e 100644
--- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/MybatisFlexBootstrap.java
+++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/MybatisFlexBootstrap.java
@@ -67,6 +67,7 @@ public class MybatisFlexBootstrap {
protected DbType dbType;
protected SqlSessionFactory sqlSessionFactory;
protected Class extends Log> logImpl;
+
private Map, Object> mapperObjects = new ConcurrentHashMap<>();
private ThreadLocal sessionThreadLocal = new ThreadLocal<>();
diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexConfiguration.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexConfiguration.java
index a3f01593..5fcc33ed 100644
--- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexConfiguration.java
+++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/FlexConfiguration.java
@@ -22,7 +22,7 @@ import com.mybatisflex.core.keygen.MybatisKeyGeneratorUtil;
import com.mybatisflex.core.keygen.RowKeyGenerator;
import com.mybatisflex.core.row.RowMapper;
import com.mybatisflex.core.table.TableInfo;
-import com.mybatisflex.core.table.TableInfos;
+import com.mybatisflex.core.table.TableInfoFactory;
import com.mybatisflex.core.util.CollectionUtil;
import com.mybatisflex.core.util.StringUtil;
import org.apache.ibatis.executor.Executor;
@@ -244,7 +244,7 @@ public class FlexConfiguration extends Configuration {
String mapperClassName = ms.getId().substring(0, ms.getId().lastIndexOf("."));
try {
Class> mapperClass = Class.forName(mapperClassName);
- return TableInfos.ofMapperClass(mapperClass);
+ return TableInfoFactory.ofMapperClass(mapperClass);
} catch (ClassNotFoundException e) {
return null;
}
diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/ProviderUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/ProviderUtil.java
index 28565200..43914c68 100644
--- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/ProviderUtil.java
+++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/ProviderUtil.java
@@ -20,7 +20,7 @@ import com.mybatisflex.core.exception.FlexExceptions;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.row.Row;
import com.mybatisflex.core.table.TableInfo;
-import com.mybatisflex.core.table.TableInfos;
+import com.mybatisflex.core.table.TableInfoFactory;
import com.mybatisflex.core.util.StringUtil;
import org.apache.ibatis.builder.annotation.ProviderContext;
@@ -83,7 +83,7 @@ class ProviderUtil {
}
public static TableInfo getTableInfo(ProviderContext context){
- return TableInfos.ofMapperClass(context.getMapperType());
+ return TableInfoFactory.ofMapperClass(context.getMapperType());
}
public static Object getEntity(Map params) {
diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/Row.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/Row.java
index c0c37d0e..2ec0966f 100644
--- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/Row.java
+++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/Row.java
@@ -18,7 +18,7 @@ package com.mybatisflex.core.row;
import com.mybatisflex.core.javassist.ModifyAttrsRecord;
import com.mybatisflex.core.query.QueryColumn;
import com.mybatisflex.core.table.TableInfo;
-import com.mybatisflex.core.table.TableInfos;
+import com.mybatisflex.core.table.TableInfoFactory;
import com.mybatisflex.core.util.ArrayUtil;
import com.mybatisflex.core.util.SqlUtil;
import com.mybatisflex.core.util.StringUtil;
@@ -139,7 +139,7 @@ public class Row extends HashMap implements ModifyAttrsRecord {
public T toEntity(Class entityClass) {
- TableInfo tableInfo = TableInfos.ofEntityClass(entityClass);
+ TableInfo tableInfo = TableInfoFactory.ofEntityClass(entityClass);
return tableInfo.newInstanceByRow(this);
}
diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java
index 4622b81f..89d0c4b6 100644
--- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java
+++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java
@@ -43,6 +43,7 @@ public class TableInfo {
private String tableName; //表名
private Class> entityClass; //实体类
private boolean camelToUnderline = true;
+ private String dataSource;
//逻辑删除数据库列名
private String logicDeleteColumn;
@@ -120,6 +121,14 @@ public class TableInfo {
this.camelToUnderline = camelToUnderline;
}
+ public String getDataSource() {
+ return dataSource;
+ }
+
+ public void setDataSource(String dataSource) {
+ this.dataSource = dataSource;
+ }
+
public String getLogicDeleteColumn() {
return logicDeleteColumn;
}
diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfos.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java
similarity index 98%
rename from mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfos.java
rename to mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java
index da9661e2..a82fb403 100644
--- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfos.java
+++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java
@@ -42,7 +42,7 @@ import java.time.chrono.JapaneseDate;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
-public class TableInfos {
+public class TableInfoFactory {
private static final Set> defaultSupportColumnTypes = CollectionUtil.newHashSet(
@@ -112,6 +112,9 @@ public class TableInfos {
tableInfo.setOnUpdateListener(ClassUtil.newInstance(table.onUpdate()));
}
+ if (StringUtil.isNotBlank(table.dataSource())){
+ tableInfo.setDataSource(table.dataSource());
+ }
} else {
//默认为类名转驼峰下划线
String tableName = StringUtil.camelToUnderline(entityClass.getSimpleName());
diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/test/AccountSqlTester.java b/mybatis-flex-core/src/test/java/com/mybatisflex/test/AccountSqlTester.java
index 83b66488..599f3322 100644
--- a/mybatis-flex-core/src/test/java/com/mybatisflex/test/AccountSqlTester.java
+++ b/mybatis-flex-core/src/test/java/com/mybatisflex/test/AccountSqlTester.java
@@ -7,7 +7,7 @@ import com.mybatisflex.core.dialect.LimitOffsetProcesser;
import com.mybatisflex.core.query.CPI;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.table.TableInfo;
-import com.mybatisflex.core.table.TableInfos;
+import com.mybatisflex.core.table.TableInfoFactory;
import org.junit.Test;
import java.util.Arrays;
@@ -241,7 +241,7 @@ public class AccountSqlTester {
@Test
public void testDeleteSql() {
IDialect dialect = new CommonsDialectImpl();
- TableInfo tableInfo = TableInfos.ofEntityClass(Account.class);
+ TableInfo tableInfo = TableInfoFactory.ofEntityClass(Account.class);
String sql = dialect.forDeleteEntityById(tableInfo);
System.out.println(sql);
}
diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/test/ArticleSqlTester.java b/mybatis-flex-core/src/test/java/com/mybatisflex/test/ArticleSqlTester.java
index 8bcad14a..4605b1ac 100644
--- a/mybatis-flex-core/src/test/java/com/mybatisflex/test/ArticleSqlTester.java
+++ b/mybatis-flex-core/src/test/java/com/mybatisflex/test/ArticleSqlTester.java
@@ -4,7 +4,7 @@ import com.mybatisflex.core.dialect.CommonsDialectImpl;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.table.TableInfo;
-import com.mybatisflex.core.table.TableInfos;
+import com.mybatisflex.core.table.TableInfoFactory;
import com.mybatisflex.core.util.CollectionUtil;
import org.junit.Test;
@@ -31,7 +31,7 @@ public class ArticleSqlTester {
article.setContent("aaa");
IDialect dialect = new CommonsDialectImpl();
- TableInfo tableInfo = TableInfos.ofEntityClass(Article.class);
+ TableInfo tableInfo = TableInfoFactory.ofEntityClass(Article.class);
String sql = dialect.forInsertEntity(tableInfo, article);
System.out.println(sql);
}
@@ -47,7 +47,7 @@ public class ArticleSqlTester {
article2.setContent("bbb");
IDialect dialect = new CommonsDialectImpl();
- TableInfo tableInfo = TableInfos.ofEntityClass(Article.class);
+ TableInfo tableInfo = TableInfoFactory.ofEntityClass(Article.class);
String sql = dialect.forInsertEntityBatch(tableInfo, CollectionUtil.newArrayList(article1, article2));
System.out.println(sql);
}
@@ -56,7 +56,7 @@ public class ArticleSqlTester {
@Test
public void testDeleteSql() {
IDialect dialect = new CommonsDialectImpl();
- TableInfo tableInfo = TableInfos.ofEntityClass(Article.class);
+ TableInfo tableInfo = TableInfoFactory.ofEntityClass(Article.class);
String sql = dialect.forDeleteEntityById(tableInfo);
System.out.println(sql);
}
@@ -65,7 +65,7 @@ public class ArticleSqlTester {
@Test
public void testDeleteByIdsSql() {
IDialect dialect = new CommonsDialectImpl();
- TableInfo tableInfo = TableInfos.ofEntityClass(Article.class);
+ TableInfo tableInfo = TableInfoFactory.ofEntityClass(Article.class);
String sql = dialect.forDeleteEntityBatchByIds(tableInfo, new Object[]{1, 2, 3});
System.out.println(sql);
}
@@ -79,7 +79,7 @@ public class ArticleSqlTester {
article.setVersion(1L);
IDialect dialect = new CommonsDialectImpl();
- TableInfo tableInfo = TableInfos.ofEntityClass(Article.class);
+ TableInfo tableInfo = TableInfoFactory.ofEntityClass(Article.class);
String sql = dialect.forUpdateEntity(tableInfo, article, true);
System.out.println(sql);
}
@@ -96,7 +96,7 @@ public class ArticleSqlTester {
.where(ARTICLE.ID.ge(100));
IDialect dialect = new CommonsDialectImpl();
- TableInfo tableInfo = TableInfos.ofEntityClass(Article.class);
+ TableInfo tableInfo = TableInfoFactory.ofEntityClass(Article.class);
String sql = dialect.forUpdateEntityByQuery(tableInfo, article, true, queryWrapper);
System.out.println(sql);
}