@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//prevent delete All
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());//防止改、删全表
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
dynamicTableNameInnerInterceptor.setTableNameHandler(new MyTableNameHandler());//动态表名插件
interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//分页插件
// 2.添加分页插件
PaginationInnerInterceptor pageInterceptor = new PaginationInnerInterceptor();
// 设置数据库方言类型
pageInterceptor.setDbType(DbType.MYSQL);
// 下面配置根据需求自行设置
// 设置请求的页面大于最大页后操作,true调回到首页,false继续请求。默认false
pageInterceptor.setOverflow(false);
// 单页分页条数限制,默认无限制
pageInterceptor.setMaxLimit(500L);
interceptor.addInnerInterceptor(pageInterceptor);
//3.乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
public class MyTableNameHandler implements TableNameHandler {
//每个请求线程维护一个数据,避免多线程数据冲突。所以使用ThreadLocal
private static final ThreadLocal<String> SUFFIX = new ThreadLocal<>();
//设置请求线程的month数据
public static void setData(String suffix) {
SUFFIX .set(suffix);
}
@Override
public String dynamicTableName(String sql, String tableName) {
System.err.println("sql:" + sql );
String suffix = SUFFIX .get();
if(StringUtils.isNotBlank(suffix)){
SUFFIX .remove();
System.err.println("suffix:" + suffix );
System.err.println("动态查询表:" + tableName + suffix);
return tableName + suffix;
}
return tableName;
}
}
@Override
public Page<Student> selectByPage() {
Page<Student> page = PageController.getPageByRequest(request);
MyTableNameHandler.setData("_2021");//此处调用方法
return this.baseMapper.selectPage(page, null);
}
插件源码 DynamicTableNameInnerInterceptor.class
核心思想
- 在mybatis-plus 拦截器组件(mybatisPlusInterceptor)中引入 表名替换的拦截器组件(dynamicTableNameInnerInterceptor)
- 表名拦截器组件(dynamicTableNameInnerInterceptor)该组件需要添加表名拦截替换的规则 组件。如 MyTableNameHandler
- 组件 MyTableNameHandler,实现 TableNameHandler接口,然后自己根据自己的业务需要进行重写映射规则。
- 在业务方法中调用MyTableNameHandler 组件,加入 分表业务参数,比如date,uid等,以便根据这个 参数,在 MyTableNameHandler 中进行各种逻辑处理匹配新表。
版本在 3.4.3以上才可以