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

参考:

相关推荐
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang3 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi3 天前
mysql 查询所有表名并授权
java
ProcessOn官方账号3 天前
java函数式编程--入门基础
java·编程·函数式编程