MybatisPlus设置动态表名

在这里插入图片描述

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

增加MyBatisPlus配置类

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();HashMap<String, TableNameHandler> map = new HashMap<>();map.put("my_test", (sql, tableName) -> DynamicTableTreadLocal.INSTANCE.getTableName());// 如果存在多张分表,则在下面添加多条记录dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map);mybatisPlusInterceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);return mybatisPlusInterceptor;}}
方法解析
MybatisPlusInterceptor

该插件是核心插件,目前代理了 Executor#queryExecutor#updateStatementHandler#prepare 方法

方法属性
private List<InnerInterceptor> interceptors = new ArrayList<>();
InnerInterceptor接口

目前已有的功能:

  • 自动分页: PaginationInnerInterceptor
  • 多租户: TenantLineInnerInterceptor
  • 动态表名: DynamicTableNameInnerInterceptor
  • 乐观锁: OptimisticLockerInnerInterceptor
  • sql 性能规范: IllegalSQLInnerInterceptor
  • 防止全表更新与删除: BlockAttackInnerInterceptor
注意事项

使用多个功能需要注意顺序关系,建议使用如下顺序

  • 多租户,动态表名
  • 分页,乐观锁
  • sql 性能规范,防止全表更新与删除

总结: 对 sql 进行单次改造的优先放入,不对 sql 进行改造的最后放入

增加本地动态线程设置表名

public enum DynamicTableTreadLocal {INSTANCE;private ThreadLocal<String> tableName = new ThreadLocal<>();public String getTableName() {return tableName.get();}public void setTableName(String tableName) {this.tableName.set(tableName);}public void remove() {tableName.remove();}
}

DynamicTableTreadLocal类的作用是为每个线程提供一个独立的tableName变量。每个线程可以通过调用getTableName方法获取自己的tableName变量的值,也可以通过调用setTableName方法设置自己的tableName变量的值。这样可以保证每个线程都有自己独立的tableName变量,不会相互干扰。

ThreadLocal在该类中的作用

ThreadLocal是Java中的一个类,它提供了线程本地变量的功能。在DynamicTableTreadLocal类中,通过创建一个ThreadLocal对象tableName,每个线程都可以通过这个对象来获取和设置自己的tableName变量。ThreadLocal保证了每个线程都有自己独立的变量副本,不会被其他线程访问或修改。

ThreadLocal应用场景

ThreadLocal的应用场景主要是在多线程环境下,需要为每个线程维护独立的变量副本的情况下使用。例如,在Web应用中,每个请求都会被分配给一个线程进行处理,如果需要在处理请求的过程中保存一些状态信息,可以使用ThreadLocal来实现。另外,ThreadLocal还可以用于线程池、数据库连接池等场景,保证每个线程都有自己独立的资源。

表对应的的实体类配置

@Data
@TableName("my_test")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MyTest implements Serializable {private static final long serialVersionUID = -65257563878624647L;@TableId("uuid")private String uuid;@JsonProperty("user_name")@TableField("user_name")private String userName;
}

在表对应的的实体类上,只需要配置没有分年月的表名@TableName("my_test")即可,无需指定分年月的表名;具体通过MyBatisPlusConfig类,根据DynamicTableTreadLocal类设置的表名自动切换要操作的表名

动态切换表的具体使用

设置表名
DynamicTableTreadLocal.INSTANCE.setTableName("mytest_202401");
获取表名
DynamicTableTreadLocal.INSTANCE.getTableName();
删除表名
DynamicTableTreadLocal.INSTANCE.remove();

最后总结

文章参考MyBatis-Plus官方文档,根据具体业务需求修改实现

官方文档地址
https://baomidou.com/
动态表名插件
https://gitee.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample-dynamic-tablename

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7.25扣...

思路&#xff1a;别的语言都可以不用辅助数组&#xff0c;我Java就得用&#xff01; c:先计算字符串中数字个数&#xff0c;然后利用双指针将原本字符串逆序从数组最后往前插入&#xff0c;若遇到数字则替换为逆序的“number”&#xff0c;这个过程会使新字符串从后往前覆盖&am…

为什么 Java 开发中时区设定用 Asia/Shanghai 而不是 GMT+8(防止踩雷)

在全球化的背景下&#xff0c;时区管理对于开发人员来说是个重要但复杂的问题。虽然中国的标准时间是 UTC8&#xff0c;但在实际开发中&#xff0c;特别是 Java 开发中&#xff0c;我们应尽量使用时区数据库中的区域/位置形式&#xff08;例如 Asia/Shanghai&#xff09;&#…

【View】Android 事件分发难道你还不会吗?

Android事件分发机制决定了触摸事件如何从顶层窗口传递到具体的视图。主要涉及到三个核心方法&#xff1a;dispatchTouchEvent(), onInterceptTouchEvent(), 和 onTouchEvent()。 1. dispatchTouchEvent() 这是事件分发的入口点。Activity, ViewGroup, 和 View 都重写了这个方…

UI界面卡顿检测工具--UIHaltDetector

引言&#xff1a; 在日常工作当中&#xff0c;我们经常会遇到软件的界面出现卡顿的问题&#xff0c;而为了确定卡顿原因&#xff0c;我特地写了一个UI界面卡顿的小工具&#xff1a;UIHaltDetector&#xff1b;该工具可以在检测到目标窗口出现卡顿的时候直接打印堆栈日志和输出…

iOS 获取mimetype

///根据地址 获取文件类型 (NSString *)mimeType:(NSURL *)url{NSURLRequest *request [NSURLRequest requestWithURL:url];NSURLResponse *response [[NSURLResponse alloc] init];[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:…

各种聚类方法的聚类思想介绍及其优缺点

聚类是一种无监督学习方法&#xff0c;旨在将数据集中的样本划分为若干个组&#xff0c;使得同一组内的样本相似度最大&#xff0c;而不同组之间的样本相似度最小。以下是几种常见的聚类方法及其思想、优缺点的介绍&#xff1a; 1. K-means 聚类 聚类思想&#xff1a; K-mea…

MySQL SQL 编程练习

目录 创建表并插入数据 查看表结构 创建触发器 创建INSERT 触发器 创建DELETE 触发器 创建更新触发器 创建存储过程 创建提取emp_new表所有员工姓名和工资的存储过程s1 创建存储过程s2&#xff0c;实现输入员工姓名后返回员工的年龄 创建一个存储过程s3&#xff0c;有2个参数&…

spring-from表单

在spring boot当中,from表单怎样开发(name=value) 先列出接口所需信息(抓包得到请求信息),将这些必要信息以注解的方式表达出来 步骤: 梳理前置条件(请求地址,请求header,请求方法,请求数据,响应结果)编辑一个普通类,在类上标记注解@Controller: 标记在类上,让类…

springboot校园商店配送系统-计算机毕业设计源68448

摘要 本文详细阐述了基于Spring Boot框架的校园商店配送系统的设计与实现过程。该系统针对校园内的用户需求&#xff0c;整合了用户注册与登录、商品浏览与购买、订单管理、配送追踪、用户反馈收集以及后台管理等功能&#xff0c;为校园内的普通用户、商家、配送员和管理员提供…

深入理解 SQL 中的 DATEDIFF 函数

DATEDIFF 是 SQL 中的一个常用函数&#xff0c;用于计算两个日期之间的天数差异。它非常有用&#xff0c;特别是在需要根据日期进行条件筛选或计算时间间隔的场景中。以下是对 DATEDIFF 函数的详细介绍&#xff0c;包括其语法和实用例子。 1. DATEDIFF 函数概述 DATEDIFF 函数…

算法与算法分析

目录 一.前言 二.算法的特性和要求 三.分析算法--时间效率 四. 分析算法--空间效率 一.前言 算法就是对特定问题求解方法和步骤的一种描述&#xff0c;它是指令的有限序列。其中&#xff0c;每个指令表示一个或多个操作。总而言之&#xff0c;我们数据结构就是通过算法实现操…

学习SQL如何使用CASE语句查询分析设备状态

学习SQL如何使用CASE语句查询分析设备状态 一、前言1. 问题背景2. SQL查询分析3. SQL查询解析 二、结论 一、前言 在实际应用中&#xff0c;经常需要对设备的状态进行监控和分析。通过SQL查询&#xff0c;我们可以有效地从数据库中提取和计算设备的状态信息。本文将介绍如何编…

FPGA实现LCD1602控制

目录 注意&#xff01; 本工程采用野火征途PRO开发板&#xff0c;外接LCD1602部件进行测试。 有偿提供代码&#xff01;&#xff01;&#xff01;可以定制功能&#xff01;&#xff01;&#xff01; 联系方式见底部 一、基础知识 1.1 引脚信息 1.2 指令 1.2.1 清屏 1.…

【有效的括号】

有效的括号 一、题目二、思路三、代码 一、题目 二、思路 利用栈先进后出的特点存储左括号&#xff1a;后面遍历遇到的左括号要先闭合 用map存储左括号与右括号的对应关系&#xff0c;利用键值对快速查找右括号进行匹配 三、代码 使用.has()方法判断当前遍历的字符是否是右括…

项目架构知识点总结

项目架构知识点总结 【一】重要注解【1】SpringBootApplication&#xff08;1&#xff09;⭐️ComponentScan 注解&#xff08;2&#xff09;⭐️EnableAutoConfiguration 注解&#xff08;3&#xff09;⭐️SpringBootConfiguration 注解&#xff08;4&#xff09;Inherited 注…

vite+cesium+天地图

创建vite项目 直接在地址栏输入cmd进入命令行&#xff08;vite项目默认为vue3&#xff09; # yarn yarn create vite 项目名称 --template vue 创建成功后依次执行 yarn install yarn dev 安装cesium和vite-plugin-cesium 没有加版本号默认为最新版本 加版本号如cesium1.1…

vue3——两种利用自定义指令实现防止按钮重复点击的方法

方法一&#xff1a;利用定时器设置时间&#xff0c;下方代码设置时间为1秒 但是有个缺点&#xff1a;请求如果很慢&#xff0c;1秒钟还没有好&#xff0c;那么该方法就没用了 // 利用定时器&#xff1a;1秒之后才能再次点击app.directive(preventReClick, {mounted: (el, bind…

sql注入的专项练习 sqlilabs(含代码审计)

在做题之前先复习了数据库的增删改查&#xff0c;然后自己用本地的环境&#xff0c;在自己建的库里面进行了sql语句的测试&#xff0c;主要是回顾了一下sql注入联合注入查询的语句和sql注入的一般做题步骤。 1.获取当前数据库 2.获取数据库中的表 3.获取表中的字段名 一、sql…

WordPress 后台开发技巧:向文章发布页右侧添加自定义菜单项

案例图片 这个案例向你介绍了如何在文章发布页的右侧边栏增加一个新的自定义菜单项。具体用它实现什么功能&#xff0c;就看你的需要了。 代码 function add_custom_menu_item() { add_meta_box(custom_menu_item, 这里是菜单项名称, display_custom_menu_item, post, side, …

基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(1)-项目搭建(前期准备工作)

这是项目的初始页面 接下来我先写下我的初始项目搭建 技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 首先我们打开页面&#xff0c;准备搭建项目的初始准备 1.New Project 2.随后点击Next&#xff0c;勾…