mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-07 17:18:24 +08:00
添加动态表名的文档
This commit is contained in:
parent
47f41d4e05
commit
43a5e08959
@ -87,6 +87,7 @@ export default defineConfig({
|
|||||||
{text: '字段加密', link: '/zh/core/columns-encrypt'},
|
{text: '字段加密', link: '/zh/core/columns-encrypt'},
|
||||||
{text: '字典回写', link: '/zh/core/columns-dict'},
|
{text: '字典回写', link: '/zh/core/columns-dict'},
|
||||||
{text: '枚举属性', link: '/zh/core/enum-property'},
|
{text: '枚举属性', link: '/zh/core/enum-property'},
|
||||||
|
{text: '动态表名', link: '/zh/core/dynamic-table'},
|
||||||
{text: '多租户', link: '/zh/core/multi-tenancy'},
|
{text: '多租户', link: '/zh/core/multi-tenancy'},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
46
docs/zh/core/dynamic-table.md
Normal file
46
docs/zh/core/dynamic-table.md
Normal 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 有效。
|
||||||
@ -22,21 +22,14 @@ import java.util.Map;
|
|||||||
|
|
||||||
public class TableManager {
|
public class TableManager {
|
||||||
|
|
||||||
private static DynamicSchemaProcessor dynamicSchemaProcessor;
|
|
||||||
private static DynamicTableProcessor dynamicTableProcessor;
|
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>> tableNameMappingTL = ThreadLocal.withInitial(HashMap::new);
|
||||||
private static final ThreadLocal<Map<String, String>> schemaMappingTL = 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() {
|
public static DynamicTableProcessor getDynamicTableProcessor() {
|
||||||
return dynamicTableProcessor;
|
return dynamicTableProcessor;
|
||||||
}
|
}
|
||||||
@ -45,6 +38,13 @@ public class TableManager {
|
|||||||
TableManager.dynamicTableProcessor = dynamicTableProcessor;
|
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) {
|
public static void setHintTableMapping(String tableName, String mappingTable) {
|
||||||
tableNameMappingTL.get().put(tableName, mappingTable);
|
tableNameMappingTL.get().put(tableName, mappingTable);
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import com.mybatisflex.core.dialect.LimitOffsetProcessor;
|
|||||||
import com.mybatisflex.core.dialect.impl.CommonsDialectImpl;
|
import com.mybatisflex.core.dialect.impl.CommonsDialectImpl;
|
||||||
import com.mybatisflex.core.query.CPI;
|
import com.mybatisflex.core.query.CPI;
|
||||||
import com.mybatisflex.core.query.QueryWrapper;
|
import com.mybatisflex.core.query.QueryWrapper;
|
||||||
|
import com.mybatisflex.core.table.DynamicTableProcessor;
|
||||||
import com.mybatisflex.core.table.TableInfo;
|
import com.mybatisflex.core.table.TableInfo;
|
||||||
import com.mybatisflex.core.table.TableInfoFactory;
|
import com.mybatisflex.core.table.TableInfoFactory;
|
||||||
import com.mybatisflex.core.table.TableManager;
|
import com.mybatisflex.core.table.TableManager;
|
||||||
@ -51,7 +52,12 @@ public class AccountSqlTester {
|
|||||||
.where(ACCOUNT01.ID.ge(100))
|
.where(ACCOUNT01.ID.ge(100))
|
||||||
.and(ACCOUNT.SEX.eq(1));
|
.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");
|
TableManager.setDynamicTableProcessor(original -> original+"_01");
|
||||||
|
|
||||||
System.out.println(query.toDebugSQL());
|
System.out.println(query.toDebugSQL());
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user