mybatis-plus 动态表名简易使用

devtools/2024/9/23 6:31:32/

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

代码

依赖版本

        <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_21">mybatisplus配置类

java">/***  MybatisPlus 配置文件*/
@Configuration
@MapperScan({"com.xxx.dataana.mapper"})
public class MybatisPlusConfig {@Beanpublic 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*/@Overridepublic 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();}



参考:

  • Mybatis-Plus 之【动态表名】

http://www.ppmy.cn/devtools/16854.html

相关文章

VUE3与Uniapp 三 (Class变量和内联样式)

<template><!-- 通过class绑定开启或关闭某个CSS --><view class"box" :class"{box2:true}">box1</view><view class"box" :class"{box2:isActive}">box2</view><!-- 使用三元表达式实现开启关…

力扣爆刷第127天之动态规划五连刷(整数拆分、一和零、背包)

力扣爆刷第127天之动态规划五连刷&#xff08;整数拆分、一和零、背包&#xff09; 文章目录 力扣爆刷第127天之动态规划五连刷&#xff08;整数拆分、一和零、背包&#xff09;关于0 1 背包问题的总结01背包遍历顺序&#xff1a;完全背包遍历顺序&#xff1a; 一、343. 整数拆…

vue2实现字节流byte[]数组的图片预览

项目使用vantui框架&#xff0c;后端返回图片的字节流byte[]数组&#xff0c;在移动端实现预览&#xff0c;实现代码如下&#xff1a; <template><!-- 附件预览 --><div class"file-preview-wrap"><van-overlay :show"show"><…

js网络请求---fetch和XMLHttpRequest的用法

fetch 语法规则 let promise fetch(url, [options]) //url —— 字符串&#xff1a;要访问的 URL。 //options —— 对象&#xff1a;可选参数&#xff1a;method&#xff0c;header 等。 fetch函数返回一个promise&#xff0c;若存在网络问题&#xff0c;或网址不存在&…

先进制造aps专题四 计划型简单aps系统(plan)和排产型复杂aps系统(Scheduling)的区别

计划型算法很简单&#xff0c;只考虑产品和产线/车间&#xff0c;一个产线/车间对于一个产品&#xff0c;产线/车间24小时生产&#xff0c;没有休息时间段&#xff0c;java web类型的aps系统都是这种类型&#xff0c;这种其实是计划型的aps系统(plan) 要是排产考虑产品工序&am…

《架构风清扬-Java面试系列第27讲》Java中如何正确优雅关闭线程?

这道题也是容易答错的题目之一&#xff0c;原因是因为有一个stop方法容易误导大家 一般也是考核工作三年以内的小伙伴&#xff0c;不属于有难度的题目 但由于出现频率不低&#xff0c;所以&#xff0c;钊哥有必要跟小伙伴们聊一聊 来&#xff0c;老规矩&#xff0c;在往下看答案…

计算机视觉——两视图几何求解投影矩阵

上文我提到了通过图像匹配得到基本矩阵&#xff0c;接下来我们要接着求解投影矩阵。 计算投影矩阵思路 假设两个投影矩阵为规范化相机&#xff0c;因此采用基本矩阵进行恢复。在规范化相机下&#xff0c; P [ I ∣ 0 ] P[I|0] P[I∣0], P ′ [ M ∣ m ] P[M|m] P′[M∣m]。…

iOS 在OC旧项目中使用Swift进行混编

iOS 在OC旧项目中使用Swift进行混编 1、创建桥接文件 ​ 第一次在Swift创建OC文件&#xff0c;或者第一次OC创建Swift时&#xff0c;xcode会提示桥接&#xff0c;Creat Bridging Header即可,这个文件用于Swift调用OC文件&#xff0c;与OC调用Swift无关。 2、在TARGETS中设置D…