MybatisPlus动态修改表名或增加库名

MyBatis-Plus动态表名:灵活实现分表与多租户 动态表名是指在运行时根据一定的规则或条件,动态地改变SQL语句中的表名。应用场景描述示例📅 分表按时间、业务等维度将数据分散到多个表🏢 多租户不同租户的数据存储在不同的表中🔄 读写分离读操作和写操作使用不同的表user_readuser_write💡提示:MyBatis-Plus提供了动态表名插件,可以在不修改SQL语句的情况下,轻松实现表名的动态切换。 阅读详情

背景

 在数据库操作过程中,经常有修改表名的需求,例如:分表时,修改表名加上分表前后缀;多数据库一个实例,表名前面加上库名,实现本地跨库事务等等。
 我用到的场景是后者,动态加库名。由于使用了MybatisPlus,整个开发过程中不会自己写sql,也没办法通过硬编码修改表名。

解决方案

 MybatisPlus中只需要一个配置类即可自定义,动态修改表名,代码如下:

@Configuration
public class MybatisPlusConfig {
    List<String> tables = Lists.newArrayList("user","class");
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
        dynamicTableNameParser.setTableNameHandlerMap(new HashMap<String, ITableNameHandler>() {{
            tables.forEach(tableTitle -> put(tableTitle,(metaObject, sql, tableName) -> "db01." + tableName ));
        }});
        paginationInterceptor.setSqlParserList(Collections.singletonList(dynamicTableNameParser));
        return paginationInterceptor;
    }
}

代码说明:
 两个核心类:DynamicTableNameParser 动态解析表名,ITableNameHandler 表名处理。
  DynamicTableNameParser会根据当前sql的tableName获取对应的ITableNameHandler,上面用拉姆达表达式,实现了ITableNameHandler中的dynamicTableName方法,拼上前缀。
ITableNameHandler源码如下:


    /**
     * 表名 SQL 处理
     *
     * @param metaObject 元对象
     * @param sql        当前执行 SQL
     * @param tableName  表名
     * @return
     */
    default String process(MetaObject metaObject, String sql, String tableName) {
        String dynamicTableName = dynamicTableName(metaObject, sql, tableName);
        if (null != dynamicTableName && !dynamicTableName.equalsIgnoreCase(tableName)) {
            // 直接替换字符串对于 SQL 操作是不那么好做,这里修复只能尽可能的保证处理没问题
            String regex = "(?<=\\s)\\Q" + tableName + "\\E(?=\\s)";
            return sql.replaceAll(regex, dynamicTableName);
        }
        return sql;
    }

    /**
     * 生成动态表名,无改变返回 NULL
     *
     * @param metaObject 元对象
     * @param sql        当前执行 SQL
     * @param tableName  表名
     * @return String
     */
    String dynamicTableName(MetaObject metaObject, String sql, String tableName);

进一步优化方案

 这里的方案,哪些表需要重写表名,需要硬编码到代码中,自定义表名列表。如何做成自动的呢?
 1. 将需要使用不同表的mapper接口,分目录存放。
 2. 自定义的tableNameHandlerMap,保存为静态对象,随时可以修改。
 3. 在mybatis的Interceptor中,根据当前sql的目录路径和表名,动态设置tableNameHandlerMap。
 目前项目只用到了几张表,优化方案,暂未提供代码例子。有更好方案,欢迎评论区交流,谢谢。

飞塔防火墙之Link Monitor Link Monitor类似于SLA,飞塔防火墙线路质量探测的一个功能。 阅读详情

相关推荐

美团外卖 mtgsig 1.2 逆向工程与补环境实战指南

本文深入解析了美团外卖核心风控参数mtgsig 1.2的生成机制与逆向实战。通过拆解其复杂的JSON结构,揭示了设备指纹、环境信息加密等关键字段。重点阐述了在Node.js中模拟浏览器环境(补环境)的核心方法,包括DOM/BOM对象、本地存储及Canvas/WebGL等高级指纹的模拟技巧,为安全研究和合规自动化测试提供了一套完整的技术指南。

uber9的博客 410

mybatis plus 动态修改表名,添加后缀

【代码】mybatis plus 动态修改表名,添加后缀。

HouYing 1563

Qt C++:跨平台开发利器

摘要: Qt C++是基于C++的跨平台开发框架,通过元对象系统、信号槽机制及模块化架构实现"一次编写,多端部署"。核心特性包括: 跨平台能力:覆盖桌面(Windows/macOS/Linux)、移动端(iOS/Android)、嵌入式及WebAssembly; 信号与槽:替代传统回调,实现对象间高效通信; UI组件库:200+预制组件支持QSS样式定制; 工具链:Qt Creator集成开发环境提供可视化设计、调试及多平台编译。 广泛应用于工业控制、车载系统、医疗设备及跨平台应用开发,

2202_75382767的博客 1682

mybatisplus 各版本动态表名

使用threadlocal的原因是该配置类是单例,调用动态表名时是多线程.每次调用都会产生一个threadlocal的副本单独给线程来设置动态表名的后缀,否则就会每次调用都会同一个后缀了.使用DynamicTableNameInnerInterceptor,但要用setTableNameHandler方法,因为该版本setTableNameHandlerMap已经废弃了。动态表名要放在分页插件里处理,无论是否使用分页都有效,调用时先设置一下表名后缀.执行查询时就自动加上后缀了.

4094

Anaconda+清华源加速PyTorch GPU环境安装与CUDA版本匹配指南

深度学习环境管理常面临依赖冲突与下载缓慢问题,通过虚拟环境隔离与镜像源加速可显著提升效率。Anaconda利用conda机制创建独立Python环境,避免包版本冲突;清华源通过国内镜像同步大幅提高下载速度。GPU版PyTorch安装需严格匹配CUDA、cuDNN与显卡驱动版本,否则易出现CUDA不可用错误。该方案适用于图像分割、目标检测等需多版本PyTorch并存的场景,能快速搭建稳定GPU训练环境。本文详解Anaconda安装、清华源配置及PyTorch GPU版安装全流程。

weixin_30522983的博客 236

如何使用AutoDl平台跑自己的模型(纯干货,步骤很详细)

记录我使用AutoDL云服务器来跑自己模型的全过程

qq_45073592的博客 3万+

mybatisplus查询时动态表后缀

TABLE_ID等于当前线程保存的值,可以认为是表后缀,执行sql的时候 只需要setData即可,就可以实现动态切换表,分表的情况 tableName就是你的表。dynamicTableName 可以添加自己的逻辑,很多玩法,这里只实现了最简单的 方便理解。每次使用完调用 完使用 TABLE_ID.remove();这个时候可以定一个注解和一个aop,就不用手动去加入和清除了。mybatisPlusInterceptor 中即可。1.话不多说,上代码,首先写一个配置类,接口接入。

A98927的博客 851

从零开始利用MATLAB进行FPGA设计(六)用ADC采集信号教程1

用AN9238采集信号的方法(1),包含PLL、FIFO、ILA的基础教程。

WZT725的博客 3094

Java --- mybatis动态设置表名

无

qq_46093575的博客 6266

LangChain面试内容整理-知识点27:LangChain性能调优

LLM应用可能面临响应慢、成本高等性能问题。LangChain提供了一些优化方法和经验来提升性能和效率。

不务正业的猿 327

医疗影像配准与融合: 使用MATLAB对医学影像进行配准和融合,实现不同影像模态之间的对准和结构信息融合等

医疗影像配准与融合是医学影像处理的重要技术,它用于将不同来源、不同时间或不同模态的医学影像进行配准和融合,以获得更加完整、准确的患者解剖信息。基于MATLAB的医疗影像配准与融合可以帮助医生更准确地诊断疾病,制定更有效的治疗方案。医疗影像配准与融合是医学影像处理的关键技术,它对于提高医学影像诊断和治疗的准确性至关重要。MATLAB是一种功能强大的数学和科学计算软件,它可以为医疗影像配准与融合提供强大的工具和支持。

走向CTO的路上... 713

MyBatis拦截器修改sql表名

通过Mybatis拦截器、自定义注解、获取参数来修改表名

weixin_50545075的博客 4387

【温室气体】GOSAT 数据产品

【温室气体】GOSAT 数据产品

WW、forever的博客 238

MybatisPlus动态修改表名

一,业务背景 业务上要求存储数据的时候根据某个字段动态的选择数据要存储的表. 如根据code字段: code->[1001,1002]来进行选择存储的表: 经过下面的配置实现动态表名如 --> table1_1001,table_1002的效果.以此动态生成表名的效果. 二,解决方案 使用mybatis-plus中的动态表名插件,而且版本必须是3.1.2以上版本。 需求,将数据按照月份放在不同的表中,2022年1月份数据放在monitor_accelerometer_rapid20220

斧头湖懒客 8753

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MybatisPlus设置动态表名

对于一些数据量比较大的表,为了提高查询性能,我们一般将表拆分成多张表,常见的是根据数据量,按年分表或者按月分表;分表虽然太高了查询性能,但是在查询的时候,如何才能查询执行分表数据呢,这里整理了一下,使用MybatisPlus设置动态表名的功能实现增加MyBatisPlus配置类登录后复制 import com.baomi...

cnzzs的博客 1563

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Tdengine实现动态表名

时序数据库实现手动动态表名

qq_51409941的博客 999

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

MyBatis-Plus动态更改查询的表名或字段名

MyBatis-Plus根据不同条件查询不同的表名、列名

lxyker的博客 4968

mybatis-plus 实现查询表名的动态修改

通过 mybatis-plus 实现表名的动态替换,即通过配置或入参动态选择不同的表。下面通过一个例子来说明该需求: 我们需要为学校开发一个成绩管理系统,需要建立三张表: 学生表、科目表和成绩表,表的 ER 图如下所示。现在又来了一个新需求,我们的这套成绩查询系统需要部署在不同学校的服务器上,因为每个学校的学生表和成绩表都要同步到教育局的服务器中,因此需要为这两个表添加学校前缀,ER 图如下所示。

wlym123的专栏 1340

Mybatis-Plus入门系列(5)- MybatisPlus之动态表名插件DynamicTableNameInnerInterceptor

动态表名 描述: Sql查询时,动态的修改表名 简单业务场景: 日志或者其他数据量大的表,通过日期进行了水平分表,需要通过日期参数,动态的查询数据。 测试案例 案例目标:根据传入的月份参数,动态的查询xx_月份的表 复制几张表,并插入一些测试数据 实现TableNameHandler接口 public class MyTableNameHandler implements TableNameHandler { /** * @param sql 原始SQL

记录知识、锤炼自我 1万+

MyBatis-Plus 实体类实现动态表名

项目中使用了 MyBatis-Plus 简化开发,在项目中,对数据库表的操作,可以通过在数据表实体类中添加@TableName("table_name") 来指定该实体所对应的表,如下: @TableName("user") @Data public class User implements Serializable { private static final long serialVersionUID = 4462743168115185463L; } 在业务中有这么个需求,在Us

章全蛋的博客 1万+

mybatisPlus拦截器使用;拦截器动态修改sql增加权限

mybatisPlus拦截器使用demo

奔跑的菜鸡 4022

MyBatis-Plus(二十一)动态表名

动态表名 1、业务场景 有时我们希望存储或读取数据的时候能够根据情况、或根据传入参数来动态的选择对应的表。比如我们数据库里的用户信息表通过年份拆分(使用年份做后缀) 而对应的实体类是不包含年份后缀的: @Data public class UserInfo { private Integer id; private String userName; private String passWord; private Integer age; } 2、样例代码 首先

Zack_tzh的博客 3万+

MyBatis Plus 动态表名失效问题

在配置动态表名拦截器时,如果代码如下: 我们期望的值在运行时根据不同的上下文发生变化,但实际运行时发现,动态表名始终使用方法初始化时的值,而不会响应的后续变化。SpringBean的生命周期Lambda表达式的执行时机表名处理逻辑的实现为了解决上述问题,可以将获取动态表名的逻辑直接写入Lambda表达式中,确保表名是动态获取的。以下是推荐的实现方式: 关键点解析 动态获取表名日志验证多表支持以下是一个完整的动态表名实现示例,包括表名上下文的线程安全处理: 动态表名

qq_74219059的博客 1222

SpringBoot MybatisPlus 配置动态表名&多数据源

配置分页,在下面配置,否则不是动态表名。

Lyndon的专栏 1885
上一篇: 线程池正确用法
下一篇: 一条sql造成死锁
鲫鱼哥
博客等级 码龄10年 18粉丝 36原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值