package net.shapelight.common.handler; import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler; import java.util.Arrays; import java.util.List; /** * 按自定义字段参数,组成动态表名 */ public class CustomizeTableNameHandler implements TableNameHandler { //用于记录哪些表可以使用该月份动态表名处理器(即哪些表可以分表) private List tableNames; //构造函数,构造动态表名处理器的时候,传递tableNames参数 public CustomizeTableNameHandler(String ...tableNames) { this.tableNames = Arrays.asList(tableNames); } //每个请求线程维护一个分表字段数据,避免多线程数据冲突。所以使用ThreadLocal private static final ThreadLocal CELL_DATA = new ThreadLocal<>(); //设置请求线程的month数据 public static void setData(String month) { CELL_DATA.set(month); } //删除当前请求线程的month数据 public static void removeData() { CELL_DATA.remove(); } //动态表名接口实现方法 @Override public String dynamicTableName(String sql, String tableName) { if (this.tableNames.contains(tableName)){ return tableName + "_" + CELL_DATA.get(); //表名增加分表字段后缀 }else{ return tableName; //表名原样返回 } } }