Skip to content

动态表名

动态表名指的是用户在对数据进行 增删改查 的时候,传入表名能够根据上下文信息(比如用户信息、应用信息)等,动态修改当前的表。

使用场景

  • 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;
    }

}