MybatisPlus实现动态表名

(一) 业务背景

  1. 一张表不易存放超大量数据, 进行分表操作
  2. 多张表结构基本一致, 只是前缀/后缀不同

(二) 功能核心

<1> 代码说明

使用MP自带拦截器实现该业务功能(MP演示版本:3.4.2)
MybatisPlusInterceptor DynamicTableNameInnerInterceptor

目标: 动态向T_LOG_A, T_LOG_B 表添加数据
两张表数据结构相同, 只是后缀有区分, 比如A/B表
实体类: TargetLog, 即MP默认会监听target_log

<2> 代码展示

@Configuration
public class MybatisPlusConfig {

    private static final ThreadLocal<String> localTable = new ThreadLocal<>();
    // 监视表: 注意监视表为小写
    private static final String TARGET_TABLE_KEY = "target_log";
    // 数据库表
    private static final String TARGET_TABLE_NAME_PREFIX = "T_LOG_";

    @Bean
    public MybatisPlusInterceptor paginationInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.ORACLE));

        // 再此扔入监听表-赋值操作 可监听多个, 存放入 Map 集合中即可
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        Map<String, TableNameHandler> handlerMap = new HashMap<>();
        handlerMap.put(TARGET_TABLE_KEY, (sql, tableName) -> TARGET_TABLE_NAME_PREFIX + localTable.get());
        dynamicTableNameInnerInterceptor.setTableNameHandlerMap(handlerMap);

        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
        return interceptor;
    }

    /**
     * 暴露方法-设置动态表名后缀
     * @param suffix 后缀
     */
    public static void setDynamicTableName(String suffix) {
        localTable.set(suffix);
    }

    /**
    * @Description: 清除ThreadLocal (finally执行即可-防止内存溢出)
    * @Params: []
    * @Return void
    */
    public static void removeThreadLocal() {
        localTable.remove();
    }
}

<3> 业务代码

// 根据业务实际情况, 获取后缀应该使用哪一个, 直接调用接口赋值
MybatisPlusConfig.setDynamicTableName(suffix);
// 以下直接保存入库即可!
......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值