mybatisPlus动态表前缀
基于若依springboot3
配置类
@Configuration
public class MybatisPlusConfig {private static final Set<String> LOGIC_TABLES = Set.of("companyinfo","departinfo","areainfo","shopinfo","shopdevice","orderinfo","businessinfo");@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 乐观锁interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());// 防止全表更新与删除
// interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());// ① 动态表名拦截器DynamicTableNameInnerInterceptor dynamic = new DynamicTableNameInnerInterceptor();dynamic.setTableNameHandler((sql, logic) -> {if (!LOGIC_TABLES.contains(logic)) { // 其它表直接返回return logic;}// ThreadLocal 控制String prefix = DynamicTableContext.getPrefix(); // "center" / "stock" / nullif (prefix == null) {return "merge_" + logic;}return prefix + "_" + logic; // 源表});interceptor.addInnerInterceptor(dynamic);return interceptor;}}
DynamicTableContext
package com.dhServer.framework.config.mybatisplus;public class DynamicTableContext {private static final ThreadLocal<String> TL = new ThreadLocal<>();public static void setPrefix(String p) { TL.set(p); }public static String getPrefix() { return TL.get(); }public static void clear() { TL.remove(); }
}
使用
使用时只需要想当前的 ThreadLocal 中设置前缀即可
DynamicTableContext.setPrefix(server);mapper.delete(entity);