添加动态表名的文档

This commit is contained in:
开源海哥 2023-05-30 15:42:35 +08:00
parent 47f41d4e05
commit 43a5e08959
4 changed files with 63 additions and 10 deletions

View File

@ -87,6 +87,7 @@ export default defineConfig({
{text: '字段加密', link: '/zh/core/columns-encrypt'},
{text: '字典回写', link: '/zh/core/columns-dict'},
{text: '枚举属性', link: '/zh/core/enum-property'},
{text: '动态表名', link: '/zh/core/dynamic-table'},
{text: '多租户', link: '/zh/core/multi-tenancy'},
]
},

View File

@ -0,0 +1,46 @@
# 动态表名
动态表名指的是用户在对数据进行 增删改查 的时候,传入表名能够根据上下文信息(比如用户信息、应用信息)等,动态修改当前的表。
## 使用场景
- 1、多租户不同的租户拥有不同的表
- 2、分库分表减轻数据压力
## 如何使用
在应用启动时,通过调用 `TableManager.setDynamicTableProcessor()` 配置动态表名处理器 `DynamicTableProcessor` 即可,如下代码所示:
```java
TableManager.setDynamicTableProcessor(new DynamicTableProcessor() {
@Override
public String process(String tableName) {
return tableName + "_01";
}
});
```
通过以上配置后我们对数据库进行增删改查MyBatis-Flex 都会调用 `DynamicTableProcessor.process` 方法,获得最新的表名进行 SQL 构建操作。因此,我们应该在 `process` 方法中,
判断当前的上下文(用户信息、应用信息)等,动态的返回对应的表名。
在某些情况下,我们临时修改映射关系,而非通过 `DynamicTableProcessor.process` 方法获取,可以通过如下配置:
```java
TableManager.setHintTableMapping("tb_account", "tb_account_01")
```
那么此时,当前线程不再通过 `DynamicTableProcessor` 去获取。
## 动态 Schema
动态 Schema 和动态表名类似,通过 `TableManager.setDynamicSchemaProcessor()` 配置动态 Schema 处理器 `DynamicSchemaProcessor` 即可,如下代码所示:
```java
TableManager.setDynamicSchemaProcessor(new DynamicSchemaProcessor() {
@Override
public String process(String schema) {
return schema + "_01";
}
});
```
动态 Schema 的配置,只对使用了注解 `@Table(schema="xxx")` 的 Entity 有效。

View File

@ -22,21 +22,14 @@ import java.util.Map;
public class TableManager {
private static DynamicSchemaProcessor dynamicSchemaProcessor;
private static DynamicTableProcessor dynamicTableProcessor;
private static DynamicSchemaProcessor dynamicSchemaProcessor;
private static final ThreadLocal<Map<String, String>> tableNameMappingTL = ThreadLocal.withInitial(HashMap::new);
private static final ThreadLocal<Map<String, String>> schemaMappingTL = ThreadLocal.withInitial(HashMap::new);
public static DynamicSchemaProcessor getDynamicSchemaProcessor() {
return dynamicSchemaProcessor;
}
public static void setDynamicSchemaProcessor(DynamicSchemaProcessor dynamicSchemaProcessor) {
TableManager.dynamicSchemaProcessor = dynamicSchemaProcessor;
}
public static DynamicTableProcessor getDynamicTableProcessor() {
return dynamicTableProcessor;
}
@ -45,6 +38,13 @@ public class TableManager {
TableManager.dynamicTableProcessor = dynamicTableProcessor;
}
public static DynamicSchemaProcessor getDynamicSchemaProcessor() {
return dynamicSchemaProcessor;
}
public static void setDynamicSchemaProcessor(DynamicSchemaProcessor dynamicSchemaProcessor) {
TableManager.dynamicSchemaProcessor = dynamicSchemaProcessor;
}
public static void setHintTableMapping(String tableName, String mappingTable) {
tableNameMappingTL.get().put(tableName, mappingTable);

View File

@ -6,6 +6,7 @@ import com.mybatisflex.core.dialect.LimitOffsetProcessor;
import com.mybatisflex.core.dialect.impl.CommonsDialectImpl;
import com.mybatisflex.core.query.CPI;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.table.DynamicTableProcessor;
import com.mybatisflex.core.table.TableInfo;
import com.mybatisflex.core.table.TableInfoFactory;
import com.mybatisflex.core.table.TableManager;
@ -51,7 +52,12 @@ public class AccountSqlTester {
.where(ACCOUNT01.ID.ge(100))
.and(ACCOUNT.SEX.eq(1));
TableManager.setDynamicTableProcessor(original -> original+"_01");
TableManager.setDynamicTableProcessor(new DynamicTableProcessor() {
@Override
public String process(String tableName) {
return tableName+"_01";
}
});
TableManager.setDynamicTableProcessor(original -> original+"_01");
System.out.println(query.toDebugSQL());