动态表表名规则 表名_关联表id
/**
* 按id参数,组成动态表名
*/
public class IdTableNameHandler implements TableNameHandler {
//用于记录哪些表可以使用该id动态表名处理器(即哪些表按id分表)
private List<String> tableNames;
//构造函数,构造动态表名处理器的时候,传递tableNames参数
public IdTableNameHandler(String ...tableNames) {
this.tableNames = Arrays.asList(tableNames);
}
//每个请求线程维护一个ID数据,避免多线程数据冲突。所以使用ThreadLocal
private static final ThreadLocal<String> ID_DATA = new ThreadLocal<>();
//设置请求线程的ID数据
public static void setData(String id) {
ID_DATA.set(id);
}
//删除当前请求线程的ID数据
public static void removeData() {
ID_DATA.remove();
}
//动态表名接口实现方法
@Override
public String dynamicTableName(String sql, String tableName) {
if (this.tableNames.contains(tableName)){
return tableName + "_" + ID_DATA.get(); //表名增加id份后缀
}else{
//表名原样返回
return tableName;
}
}
}
配置 MybatisPlusConfig
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
dynamicTableNameInnerInterceptor.setTableNameHandler(
//可以传多个表名参数,指定哪些表使用IdTableNameHandler处理表名称
new IdTableNameHandler("approve_process_content","approve_process_node")
);
//以拦截器的方式处理表名称
interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
//分页插件
interceptor.addInnerInterceptor(paginationInnerInterceptor());
//乐观锁插件
return interceptor;
}
使用
//此id为关联表id
IdTableNameHandler.setData(id);
//然后调用自己对应的的mapper方法即可,如
approveProcessNodeMapper.selectList();
//最后移除
IdTableNameHandler.removeData();