Mybatis-plus动态表名配置

一、pom文件依赖

        <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency>

二 、mybatis配置类

2.1 表名设置工具类 TableNameHelper

package com.example.boot.config;public class TableNameHelper {/*** 请求参数存取*/private static final ThreadLocal<String> TABLE_NAME = new ThreadLocal<>(); //保证线程安全/*** 批量语句*/private static final ThreadLocal<Integer> BATCH = new ThreadLocal<>();/*** 设置表名** @param tableName 请求的表名*/public static void setTableName(String tableName) {TABLE_NAME.set(tableName);BATCH.set(0);}/*** 设置批量更新的表名** @param tableName 表名*/public static void setBatchTableName(String tableName) {TABLE_NAME.set(tableName);BATCH.set(1);}/*** 移除表名*/public static void removeTableName() {TABLE_NAME.remove();BATCH.set(0);}/*** 获取表名** @return 请求的表名*/public static String getTableName() {String s = TABLE_NAME.get();if (BATCH.get() == null || BATCH.get() == 0) {TABLE_NAME.remove(); // 使用一次后就清除数据,防止后续表名被篡改}return s;}
}

2.2 mybatis config类  MybatisPlusConfig

package com.example.boot.config;import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @ClassName* @Description TODO* @Author 86136* Date 2023/8/17 11:02**/
@Configuration
@MapperScan("com.example.boot.mapper")
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor mybatisPlusInterceptor=new MybatisPlusInterceptor();// 配置查询动态表名的拦截器,使用时先在TableNameHelper设置要查询的动态表名,然后直接执行mybatisplus的查询方法。注意赋予的动态表名只在一次查询中有效DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();dynamicTableNameInnerInterceptor.setTableNameHandler(((sql, tableName) -> {//获取表名方法String newTableName = TableNameHelper.getTableName();if (StrUtil.isNotBlank(newTableName)){tableName = newTableName;}return tableName;}));mybatisPlusInterceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);//        分页配置mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return mybatisPlusInterceptor;}
}

设置动态表名时,实体类不需要写@TableName注解 需要在代码中手动设置表名。在代码中手动获取把时间拼接成表名,然后通过TableNameHelper.setTableName(),这样的话他会在config配置类中获取到我们设置的表名,从而实现动态表名的功能。

2.3 表名生成工具类 TableNameGenerator

package com.skywalk.zktx.skywalk.common.mybatis.config;import lombok.extern.slf4j.Slf4j;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;@Slf4j
public class TableNameGenerator {/*** @param baseTableName 基础表名* @param startTime     开始时间* @param endTime       结束时间* @param subtableType  分表类型<SubtableType>* @return tableNames 表名集合* @description: 按照 分表类型 和 时间范围 获取表名集合* @author xxz*/public static List<String> generateTables(String baseTableName, LocalDateTime startTime, LocalDateTime endTime, SubtableType subtableType) {List<String> tableNames = new ArrayList<>();if (startTime == null || endTime == null) {log.error("无法生成[{}]表名,开始时间[{}]或结束时间[{}]为null!", baseTableName, startTime, endTime);return tableNames;}if (startTime.isAfter(endTime)) {log.error("无法生成[{}]表名,开始时间[{}]在结束时间[{}]之后!", baseTableName, startTime, endTime);return tableNames;}DateTimeFormatter formatter;LocalDateTime current = startTime;switch (subtableType) {case BY_YEAR:current = current.withMonth(1).withDayOfMonth(1).truncatedTo(ChronoUnit.DAYS);formatter = DateTimeFormatter.ofPattern("yyyy");break;case BY_MONTH:current = current.withDayOfMonth(1).truncatedTo(ChronoUnit.DAYS);formatter = DateTimeFormatter.ofPattern("yyyyMM");break;case BY_DAY:current = current.truncatedTo(ChronoUnit.DAYS);formatter = DateTimeFormatter.ofPattern("yyyyMMdd");break;default:throw new IllegalArgumentException("Invalid SubtableType");}while (!current.isAfter(endTime)) {String tableName = baseTableName + "_" + current.format(formatter);tableNames.add(tableName);current = incrementDateTime(current, subtableType);}return tableNames;}private static LocalDateTime incrementDateTime(LocalDateTime dateTime, SubtableType subtableType) {switch (subtableType) {case BY_YEAR:return dateTime.plusYears(1);case BY_MONTH:return dateTime.plusMonths(1);case BY_DAY:return dateTime.plusDays(1);default:throw new IllegalArgumentException("Invalid SubtableType");}}public static void main(String[] args) {// 示例用法String baseTableName = "base";LocalDateTime startTime1 = LocalDateTime.of(2023, 7, 1, 0, 0, 0);LocalDateTime endTime1 = LocalDateTime.of(2023, 7, 1, 0, 0, 0);List<String> tables1 = generateTables(baseTableName, startTime1, endTime1, SubtableType.BY_DAY);System.out.println(tables1);LocalDateTime startTime2 = LocalDateTime.of(2023, 7, 18, 10, 27, 35);LocalDateTime endTime2 = LocalDateTime.of(2023, 8, 1, 0, 0, 0);List<String> tables2 = generateTables(baseTableName, startTime2, endTime2, SubtableType.BY_MONTH);System.out.println(tables2);LocalDateTime startTime3 = LocalDateTime.of(2021, 8, 1, 10, 27, 35);LocalDateTime endTime3 = LocalDateTime.of(2023, 7, 3, 16, 18, 53);List<String> tables3 = generateTables(baseTableName, startTime3, endTime3, SubtableType.BY_YEAR);System.out.println(tables3);}
}


 

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

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

相关文章

React-hook-form-mui(二):表单数据处理

前言 在上一篇文章中&#xff0c;我们介绍了react-hook-form-mui的基础用法。本文将着表单数据处理。 react-hook-form-mui提供了丰富的表单数据处理功能&#xff0c;可以通过watch属性来获取表单数据。 Demo 下面是一个使用watch属性的例子&#xff1a; import React from…

【Redis交响乐】Redis中的数据类型/内部编码/单线程模型

文章目录 一. Redis中的数据类型和内部编码二. Redis的单线程模型面试题: redis是单线程模型,为什么效率之高,速度之快呢? 在上一篇博客中我们讲述了Redis中的通用命令,本篇博客中我们将围绕每个数据结构来介绍相关命令. 一. Redis中的数据类型和内部编码 type命令实际返回的…

【MATLAB】EMD_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 EMD-LSTM神经网络时序预测算法是一种结合了经验模态分解&#xff08;EMD&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09;的时间序列预测方法。 EMD是一种处理非平稳信号的…

Linux的引导过程与服务控制

一.开机启动的完整过程 引导过程&#xff1a; 1.bios加电自检 检测硬件是否正常&#xff0c;然后根据bios中的启动项设置&#xff0c;去找内核文件 服务器主机开机以后&#xff0c;将根据主板BIOS中的设置对CPU、内存、显卡、键盘灯设备进行初步检测&#xff0c;检测成功后根…

stable diffusion 基础教程-图生图

界面 图生图大概有以下几个功能: 图生图涂鸦绘制局部绘制局部绘制(涂鸦蒙版)其常用的也就上面四个,接下来逐步讲解。 以图反推提示词 图生图可以根据反推提示词来获取相应图片的提示词,目前3种主流方式,如下: CLIP反推提示词:推导出的文本倾向于自然语言的描述方式,…

openmediavault(OMV) (26)网络(1)ddns-go

简介 "ddns-go" 是一个动态域名解析(Dynamic DNS)工具,用于更新域名的IP地址。它可以自动检测你的公共IP地址,并将其更新到指定的域名解析服务商,以确保你的域名始终与最新的IP地址相匹配。 安装 hub.docker.com上下载ddns-go镜像 配置compose文件 --- versio…

C++系列十一:C++指针

C指针 1. 指针的声明和初始化2. 指针的运算3. 指针与数组4. 指针与函数参数传递5. 指针与动态内存分配6. 指针与多维数组7. 指针与函数返回值8. 指针与内存管理9. 指针的高级应用 指针是C中一个非常重要的概念&#xff0c;它是指向变量、数组或对象的内存地址的引用。通过指针&…

LeetCode 466. 统计重复个数,循环字符串匹配优化

一、题目 1、题目描述 定义 str [s, n] 表示 str 由 n 个字符串 s 连接构成。 例如&#xff0c;str ["abc", 3] "abcabcabc" 。 如果可以从 s2 中删除某些字符使其变为 s1&#xff0c;则称字符串 s1 可以从字符串 s2 获得。 例如&#xff0c;根据定义&a…

在 sealos 上使用 redisinsight 完美管理 redis

先起一个 redis 集群&#xff0c;在 sealos 上可以点点鼠标就搞定&#xff1a; 简单两步&#xff0c;redis 集群搞定。 再启动 RedisInsight, 是一个 redis 的可视化管理工具。 就可以看到部署后的地址了。进去之后填写 redis 的链接信息即可&#xff1a; 链接信息在数据库的…

STM32MP157/linux驱动学习记录

1. uboot烧录 2.linux安装nfs服务 sudo apt-get install nfs-kernel-server rpcbind安装nfs服务 在用户根目录下创建一个名为“linux”的文件夹&#xff0c;以后所有的东西都放到这个“linux”文件夹里面&#xff0c;在“linux”文件夹里面新建一个名为“nfs”的文件夹&#…

【Rust日报】2024-01-01 使用 Rust 构建生产级微服务

使用 Rust 构建生产级微服务 这个由sanyi编写的博客系列 “在Rust中构建生产就绪微服务” 涵盖了Rust中构建生产就绪微服务的过程。以下是每篇博客的主要主题总结&#xff1a; 设置工作空间&#xff1a; 为Rust应用程序设置多包工作空间。 添加CLI子命令&#xff1a; 实现一种简…

Android 车联网——CarPropertyService介绍(三)

一、简介 Android CarPropertyService 是一个用于与车辆系统通信的服务。它是 Android Auto 中的一个重要组件,绝大部分与车辆硬件功能相关联的属性,如空调、座舱功能、车辆传感器等都是通过 CarPropertyService 来读取或者设置的。 CarPropertyManager 是 CarPropertyServic…

代码训练营Day.22 | 235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先 1. LeetCode链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2. 题目描述 3. 解法 利用二叉搜索树的特性进行公共节点的判断&#xff1a; 1. 此节点为公共节点&#xff1a;p、q恰好在此节点的左右棵子树上。即…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-8Lag Compensator滞后补偿器

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-8Lag Compensator滞后补偿器 从稳态误差入手&#xff08;steady state Error&#xff09; 误差 Error &#xff1a; E ( s ) R ( s ) − X ( s ) R ( s ) − E ( s ) ⋅ K G …

Android 车联网——CarManager管理器续(五)

上篇文章介绍了中的车辆信息服务、车辆传感服务、车内空调系统服务,这一篇我们继续分析剩下的座舱服务、制造商扩展服务。 一、管理器介绍 1、座舱服务 源码位置:/packages/services/Car/car-lib/src/android/car/hardware/cabin/CarCabinManager.java CarCabinManager 提…

Open3D 最小二乘拟合平面——拉格朗日乘子法

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接Open3D 最小二乘拟合平面——拉格朗日乘子法。爬虫自重。 一、算法原理 设拟合出的平面方程为: a x + b y +

c# 编程点滴--元组

1. 元组 Tuple 是 C# 中表示元组&#xff08;Tuple&#xff09;的数据结构。元组是一个用于存储一组有序元素的数据结构&#xff0c;每个元素可以是不同类型的数据。在 C# 中&#xff0c;元组是值类型&#xff0c;允许存储多个值&#xff0c;并且可以通过索引或者具名字段访问…

声明式管理方(yaml)文件

声明式管理方(yaml)文件: 1、适合对资源的修改操作 2、声明式管理依赖于yaml文件&#xff0c;所有的内容都在yaml文件当中。 3、编辑好的yaml文件需要依靠陈述是还是要依靠陈述式的命令发布到k8s集群当中 create只能创建&#xff0c;不能更新。从指定yaml文件中读取配置&#…

【视野提升】软硬件融合

个体和系统 凯文凯利在他的《失控》一书中提到了一个非常有意思的概念——涌现&#xff0c;简单来说&#xff0c;就是众多个体的集合会涌现出超越个体特征的某些高级的特征。 例如&#xff0c;通过把个体的计算机连接到一个网络&#xff0c;涌现出了互联网这个新兴事物&#x…

unity C# 中通俗易懂LINQ使用案例

文章目录 1. 从数组或列表中查询元素**&#xff1a;2. **排序与分组**&#xff1a;3. **连接多个数据源**&#xff1a;4. **聚合操作**&#xff1a;5. **分页查询**&#xff1a;6. **多条件查询**&#xff1a;7. **转换和投影&#xff08;Select&#xff09;**&#xff1a;8. *…