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();
    }

参考:

相关推荐
华仔啊7 分钟前
MyBatis-Plus 让你开发效率翻倍!新手也能5分钟上手!
java·后端·mybatis
武子康19 分钟前
Java-167 Neo4j CQL 实战:CREATE/MATCH 与关系建模速通 案例实测
java·开发语言·数据库·python·sql·nosql·neo4j
小坏讲微服务27 分钟前
Nginx集群与SpringCloud Gateway集成Nacos的配置指南
spring boot·nginx·spring cloud·gateway
乌暮35 分钟前
JavaEE入门--计算机是怎么工作的
java·后端·java-ee
Z3r4y39 分钟前
【代码审计】RuoYi-4.2 五处安全问题分析
java·web安全·代码审计·若依4.2·ruoyi-4.2
代码栈上的思考42 分钟前
Spring MVC 中 @RequestMapping 路径映射与请求处理全流程
java·spring·mvc
WZTTMoon1 小时前
Spring MVC 核心工作原理:DispatcherServlet 全流程深度解析
java·spring·mvc
金銀銅鐵1 小时前
[Java] 用 Swing 生成一个最大公约数计算器(展示计算过程)
java·后端·数学
计算机学姐1 小时前
基于SpringBoot的新闻管理系统【协同过滤推荐算法+可视化统计】
java·vue.js·spring boot·后端·spring·mybatis·推荐算法
2201_757830871 小时前
泛型的细节
java·开发语言·数据结构