增加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;
}
}
}