mybatis-flex/docs/zh/core/dynamic-table.md

78 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 动态表名
动态表名指的是用户在对数据进行 增删改查 的时候,传入表名能够根据上下文信息(比如用户信息、应用信息)等,动态修改当前的表。
## 使用场景
- 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
try{
TableManager.setHintTableMapping("tb_account", "tb_account_01");
//这里写您的业务逻辑
} finally {
TableManager.clear();
}
```
那么此时,当前线程不再通过 `DynamicTableProcessor` 去获取。
## 动态 Schema
动态 Schema 和动态表名类似,通过 `TableManager.setDynamicSchemaProcessor()` 配置动态 Schema 处理器 `DynamicSchemaProcessor` 即可,如下代码所示:
```java
TableManager.setDynamicSchemaProcessor(new DynamicSchemaProcessor() {
@Override
public String process(String schema, String table) {
return schema + "_01";
}
});
```
动态 Schema 的配置,只对使用了注解 `@Table(schema="xxx")` 的 Entity 有效。
## SpringBoot 支持
在 SpringBoot 项目下,直接通过 `@Configuration` 即可使用:
```java
@Configuration
public class MyConfiguration {
@Bean
public DynamicTableProcessor dynamicTableProcessor(){
DynamicTableProcessor processor = new ....;
return processor;
}
@Bean
public DynamicSchemaProcessor dynamicSchemaProcessor(){
DynamicSchemaProcessor processor = new ....;
return processor;
}
}
```