mybatis-plus 动态表名简易使用

场景:由于有些表是分表的,需要给表名添加后缀才能正确地访问表,如sys_user_2024_01

代码

依赖版本

xml 复制代码
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.4</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-extension</artifactId>
            <version>3.4.3.4</version>
            <scope>compile</scope>
        </dependency>

mybatisplus配置类

java 复制代码
/**
 *  MybatisPlus 配置文件
 */
@Configuration
@MapperScan({"com.xxx.dataana.mapper"})
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        //动态表名实现
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        //可以传多个表名参数,指定哪些表使用TableNameSuffixHandler处理表名称
        dynamicTableNameInnerInterceptor.setTableNameHandler(new TableNameSuffixHandler("sys_user"));
        //以拦截器的方式处理表名称
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);

        return interceptor;
    }

TableNameSuffixHandler

java 复制代码
/**
 * mybatis-plus 成动态表名控制器
 */
public class TableNameSuffixHandler implements TableNameHandler {
    /**
     * 用于记录哪些表可以使用该动态表名处理器(即哪些表需要分表)
     */
    private final List<String> tableNames;

    /**
     * 构造函数,构造动态表名处理器的时候,传递tableNames参数
     * @param tableNames
     */
    public TableNameSuffixHandler(String... tableNames) {
        this.tableNames = Arrays.asList(tableNames);
    }

    /**
     * 每个请求线程维护一个suffix数据,避免多线程数据冲突。所以使用ThreadLocal
     */
    private static final ThreadLocal<String> TABLE_SUFFIX = new ThreadLocal<>();

    /**
     * 设置请求线程的表名后缀数据
     * @param tableNameSuffix
     */
    public static void setSuffix(String tableNameSuffix) {
        TABLE_SUFFIX.set(tableNameSuffix);
    }

    /**
     * 删除请求线程的表名后缀数据
     * 注: 使用完必须释放
     */
    public static void removeSuffix() {
        TABLE_SUFFIX.remove();
    }

    /**
     * 动态表名接口实现方法
     * @param sql
     * @param tableName
     * @return
     */
    @Override
    public String dynamicTableName(String sql, String tableName) {
        if (this.tableNames.contains(tableName)) {
            String suffix = TABLE_SUFFIX.get();
            if(suffix != null){
                //表名增加后缀
                return tableName + suffix;
            }
        }
        //表名原样返回
        return tableName;
    }
}

使用

java 复制代码
    public ServiceResponse deleteRelaEventByRelaId(String anaVerId, String relaId) {
        LambdaUpdateWrapper<SysUser> luw = Wrappers.lambdaUpdate(SysUser.class)
                .set(SysUser::getStatus, "0")
                .set(SysUser::getUpdateTime, new Date())
                .eq(SysUser::getId, relaId);
        TableNameSuffixHandler.setSuffix("_2024_01");
        this.update(luw);
        TableNameSuffixHandler.removeSuffix();
        return ServiceResponse.createSuccess();
    }

参考:

相关推荐
腻害兔4 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
维天说9 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane199410 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了11 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品11 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘11 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记11 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端