【常规】Spring Boot多表查询/修改的配置和快速使用

news/2024/11/20 0:42:57/

说明

在同一个数据库里边有多张表,后缀以日期分隔开。
例如有三张表:
map_record_202301
map_record_202302
map_record_202303
由于mapper对应的是一张表,但是现在表结构是完全相同的,如何指定操作某一张表呢?在mybatisplus如何与实体类映射呢?请往下看

参与使用的依赖/库

MybatisPlus 3.4.3.4

具体操作

1、添加依赖

        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.4</version></dependency>

2、添加MybatisPlus拦截器

import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
import lombok.extern.log4j.Log4j;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
/*** 在mybatisPlus执行SQL语句之前修改表的名字*/
@Log4j
public class MonthTableNameHandler implements TableNameHandler {//用于记录哪些表可以使用该月份动态表名处理器(即哪些表按月分表)private List<String> tableNames;//构造函数,构造动态表名处理器的时候,传递tableNames参数public MonthTableNameHandler(String ...tableNames) {this.tableNames = Arrays.asList(tableNames);}//每个请求线程维护一个month数据,避免多线程数据冲突。所以使用ThreadLocalpublic static final ThreadLocal<String> MONTH_DATA = new ThreadLocal<>();//设置请求线程的month数据public static void setData(String month) {MONTH_DATA.set(month);}//删除当前请求线程的month数据public static void removeData() {MONTH_DATA.remove();}@Overridepublic String dynamicTableName(String sql, String tableName) {if (this.tableNames.contains(tableName)){if (MONTH_DATA.get()==null){// 绝对不会走这里,因为在操作表的时候都会提前设置好表名,MONTH_DATA.get()一定不为nullLocalDate date = LocalDate.now();return tableName + "_" + date.format(DateTimeFormatter.ofPattern("yyyyMM"));  //表名增加月份后缀}return MONTH_DATA.get(); // 返回自定义的表名}else{return tableName;   //表名原样返回}}
}

3、使用

只需要在操作某张表的时候,之前传入正确的表名即可。

如果需要创建表,例如新建一张map_record_202304表,创建表的语句需要自己实现,例子请看 附录

// 静态的,无论在哪里都可以这样用 
// 表示要操作map_record_202301表
MONTH_DATA.set(“map_record_202301”);
// recordMapper是MybatisPlus的mapper
List<MapRecord> recordList1 = recordMapper.selectList(null);

4、附录

Mapper

注意:MapRecord是实体类,对应的是map_record_202301 表(是这一类表,并不只是对应这一张表)

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@Mapper
public interface MapRecordMapper extends BaseMapper<MapRecord> {
}

实体类MapRecord

@NoArgsConstructor
@AllArgsConstructor
@Data
public class MapRecord implements Serializable {@TableId(value = "id", type = IdType.AUTO)private Integer id;/*** uuid*/private String uuid;
}

创建新表 map_record_202304 例子

注意:要用 ${tableName} 而不是 #{tableName},因为传入表名的时候要连接符而不能用占位符。

@Mapper
public interface MapRecordMapper extends BaseMapper<MapRecord> {@Select("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'chikycloud'")List<String> listTables();/*** 根据参数tableName建 map_record 表语句* 例如 传入的参数为 map_record202303,那么表名就是 map_record202303** @param tableName 表名*/@Update("CREATE TABLE `${tableName}`  (\n" +"  `id` int(50) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键索引',\n" +"  `uuid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '唯一标识 也是唯一索引',\n" +"  PRIMARY KEY (`id`, `uuid`) USING BTREE,\n" +"  UNIQUE INDEX `uuid_index`(`uuid`) USING BTREE\n" +");")void createTable(@Param("tableName") String tableName);

END

人生苦短,
何必念念不忘,
放下心中包袱,
从容向前走。


http://www.ppmy.cn/news/66824.html

相关文章

【C++】第13章: 类继承

文章目录 第十三章 类继承13.1 一个简单的基类13.1.1 派生一个类13.1.2 构造函数&#xff1a;访问权限的考虑13.1.3 使用派生类13.1.4 派生类和基类之间的特殊关系 13.2 继承&#xff1a;is-a关系13.3 多态公有继承13.4 静态联编与动态联编13.4.1 指针和引用类型的兼容性13.4.2…

前端:20 个常见的前端算法题

现在面试中&#xff0c;算法出现的频率越来越高了&#xff0c;大厂基本必考 今天给大家带来 20 个常见的前端算法题&#xff0c;重要的地方已添加注释&#xff0c;如有不正确的地方&#xff0c;欢迎多多指正 &#x1f495; 1、两数之和 题目&#xff1a; 给定一个数组 nums …

电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、工程交易等业务的企业

招投标管理系统-适合于招标代理、政府采购、企业采购、工程交易等业务的企业 招投标管理系统是一个用于内部业务项目管理的应用平台。以项目为主线&#xff0c;从项目立项&#xff0c;资格预审&#xff0c;标书编制审核&#xff0c;招标公告&#xff0c;项目开标&#xff0c;项…

Linux shell编程 数组

数组定义 数组内数据类型可以为数值也可以为字符串。 若字符串类型需要使用 " " 包含以免空格扰乱数组。 方法1 空格分隔直接定义数组 arr(10 20 30 40 50) arr1(zhangsan lisi wangwu) 方法2 指定元素下标定义&#xff0c;若跳过元素不设置会显示为空 arr([0]1…

C++笔记—— 第十七篇 智能指针 C++11来了(下)

目录 1. 为什么需要智能指针 2. 内存泄漏 2.1 什么是内存泄漏&#xff0c;内存泄漏的危害 2.2 内存泄漏分类 2.3如何避免内存泄漏 3.智能指针的使用及原理 3.1 RAII 3.2 智能指针的原理 3.3 std::auto_ptr 3.4 std::unique_ptr 3.5 std::shared_ptr shared_ptr的线…

每周一算法:差分算法

差分算法 差分是一种常见的算法&#xff0c;用于快速修改数组中某一段区间的值。其基本思想就是预处理出数组的差分数组&#xff0c;然后修改区间时&#xff0c;只需要修改两个位置的值&#xff0c;即可快速完成区间修改。最后再通过差分数组求出原数组。差分算法在区间加、区…

小米刷机小白教程最新详细版

★本篇为线刷&#xff08;以修补boot的方式刷入面具&#xff09; 如果你用的是小米手机&#xff0c;想获取面具root&#xff0c;看这一篇就够了&#xff0c;即使你是小白 必应搜索醉里博客http://202271.xyz?xiaomi 原创不易&#xff0c;谢绝转载&#xff0c;如果本教程有帮…

git 解决 “fatal: Could not read from remote repository.“

现象 在使用Git将本地仓库推送到远程仓库的时候&#xff0c;发生了如下错误&#xff1a;“fatal: Could not read from remote repository.” 原因 出现这错误一般是以下两种原因&#xff1a; 客户端与服务端未生成 ssh key客户端与服务端的ssh key不匹配 为解决以上问题&a…