mybatisPlus 动态表名解决方案

888 阅读1分钟

增加mybatisplus 的配置 增加一个拦截器

@Configuration
@MapperScan("com.baomidou.mybatisplus.samples.dytablename.mapper")
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        dynamicTableNameInnerInterceptor.setTableNameHandler(
        new ClientProTableNameHandler("dynamic_table_name") //当匹配到对应的表名时根据动态设置的后缀来定位到对应的表
        );
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
        // 3.4.3.2 作废该方式
        // dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map);
        return interceptor;
    }
}

mybatis 提供的接口


package com.baomidou.mybatisplus.extension.plugins.handler;

public interface TableNameHandler {
    String dynamicTableName(String sql, String tableName);
}

创建一个类实现 TableNameHandler

public class ClientProTableNameHandler implements TableNameHandler {
    public ClientProTableNameHandler() {
    }

    public ClientProTableNameHandler(String tableName) {
        this.tableName = tableName;
    }

    private String tableName;

    //每个请求线程维护一个month数据,避免多线程数据冲突。所以使用ThreadLocal
    private  static final ThreadLocal<String> TABLEID=new ThreadLocal<>();

    public static void setTableId(String tableId){
        TABLEID.set(tableId);
    }
    public static void removeTableId(){
        TABLEID.remove();
    }

    @Override
    public String dynamicTableName(String sql, String tableName) {
        if(this.tableName.equals(tableName)){
            return tableName+"_"+TABLEID.get();
        }else{
            return tableName;
        }
    }
}