相关文章推荐
含蓄的汽水  ·  教育部 ...·  3 月前    · 
仗义的竹笋  ·  java - ...·  1 年前    · 
道上混的上铺  ·  Fabric.js 文本自动换行的实现方式 ...·  1 年前    · 
爱旅游的感冒药  ·  网络NAT类型导致无法使用P2P服务解决方法 ...·  1 年前    · 
聪明的花生  ·  福田汽车1100万倒计时,见证全球商用车新纪 ...·  1 年前    · 
Code  ›  Mybatis-Plus动态表名插件实现数据库分表查询-天翼云
https://www.ctyun.cn/zhishi/p-208434
奔跑的啄木鸟
11 月前

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 2024云享优惠·数智升级 NEW 爆款2核4G3M云服务器82.8元/年起
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 一键部署Llama3大模型学习机 0代码一键部署,预装最新主流大模型Llama3与StableDiffusion
  • 中小企业上云场景组合购 NEW 建站、域名等场景一站式购齐,组合购9元起!
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 云主机特惠 HOT 多款云主机新老同享,满足您的上云需求!
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城 进入云市场
办公协同
  • WPS云文档 EMM手机管家 智能商业平台 SSL证书 新域名服务 翼电子教室 翼智慧显示一体化解决方案 税务风控云 翼云智眼安消一体化解决方案 翼信息化运维服务 翼微信营销解决方案 翼视频云归档解决方案 云管家2.0 智慧工厂_生产流程管理解决方案 全栈混合云敏捷版(软件) 全栈混合云敏捷版(一体机)

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云技术合作伙伴
  • 天翼云OpenAPI中心 天翼云EasyCoding平台
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云培训认证
  • 天翼云学堂 天翼云市场商学院
天翼云服务合作伙伴
  • 天翼云MSP合作伙伴 天翼云集成商交付能力认证
天翼云合作计划
  • 央企云合作计划
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴 天翼云甄选商城合作伙伴
天翼云东升计划
  • 东升适配创新中心 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
资源与工具
  • 天翼云OpenAPI EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂 天翼云认证

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • OpenAPI中心 客户支持计划 专家技术服务

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云 天翼云4.0 天翼云APP 全球基础设施 分析师和白皮书 天翼云·创新直播间 2024智算云生态大会 2023云生态大会 2022云生态大会 天翼云中国行 支持与服务 了解天翼云
  • 站点切换
    • 中国站
  • 文档
  • 控制中心
  • 备案
  • 管理中心

Mybatis-Plus动态表名插件实现数据库分表查询

首页 知识中心 数据库 文章详情页

Mybatis-Plus动态表名插件实现数据库分表查询

2023-05-18 09:34:14 阅读次数:100

mybatis, 数据库

浮生若梦,就当它是梦,尽兴地梦它一场;世事如云,就当它是云,从容地观它千变万化。

Mybatis-Plus中提供了各种插件,乐观锁、多租户、动态表名。。。。今天来研究一下基于动态表名插件实现分表的案例

数据库建三张表测试

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user_0
-- ----------------------------
DROP TABLE IF EXISTS `user_0`;
CREATE TABLE `user_0` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(2) NULL DEFAULT NULL,
`email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for user_1
-- ----------------------------
DROP TABLE IF EXISTS `user_1`;
CREATE TABLE `user_1` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(2) NULL DEFAULT NULL,
`email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for user_2
-- ----------------------------
DROP TABLE IF EXISTS `user_2`;
CREATE TABLE `user_2` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(2) NULL DEFAULT NULL,
`email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

pom依赖

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
server:
port: 8099

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/my_user?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai
username: root
password: root
#取模分表 格式 表名&表总数量(多个,分隔)。这里随便怎么定义和解析规则对应即可
modTables: user&3
# Logger Config
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

请求参数传递辅助类,就是根据什么去分表,这里是根据id

public class RequestDataHelper {
/**
* 请求参数存取
*/
private static final ThreadLocal<Long> REQUEST_DATA = new ThreadLocal<>();

/**
* 设置请求参数
*
* @param requestData 请求参数 Long
*/
public static void setRequestData(Long requestData) {
REQUEST_DATA.set(requestData);
}

/**
* 获取请求参数
*
* @param param 请求参数
* @return 请求参数 MAP 对象
*/
public static <T> T getRequestData(String param) {
Long id = getRequestData();
if (null != id) {
return (T) id;
}
return null;
}

/**
* 获取请求参数
*
* @return 请求参数 MAP 对象
*/
public static Long getRequestData() {
return REQUEST_DATA.get();
}
}

注入插件,并且程序初始化时解析分表配置

@Configuration
@MapperScan("com.sample.mapper") //和你包名一致,别问我你的怎么报错了
public class MybatisPlusConfig {

private static String modTables;
private static Map<String, Integer> tableMap = new HashMap<>(16);


@Value("${spring.datasource.modTables:null}")
public void setModTables(String modTables) {
MybatisPlusConfig.modTables = modTables;
}
@PostConstruct
public void init() throws Exception {
String[] split = modTables.split(",");
for (String s : split) {
String[] split1 = s.split("&");
if (split1.length < 2) {
throw new RuntimeException("分表配置错误");
}
MybatisPlusConfig.tableMap.put(split1[0], Integer.valueOf(split1[1]));
}
}


@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {


Integer integer = tableMap.get(tableName);
if (integer != null) {
// 获取参数方法
Long id = RequestDataHelper.getRequestData();
if(id == null){
throw new RuntimeException("未设置分表配置");
}
long l = Math.floorMod(id, Long.parseLong(integer.toString()));
return tableName + "_" + l;
}

return tableName;
});
interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
// 3.4.3.2 作废该方式
// dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map);
return interceptor;
}
}
@Data
@Accessors(chain = true)
@TableName(value = "user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}

mapper

/**
* @author: yh
* @Description: 支持不需要 UserMapper.xml 这个模块演示内置 CRUD 咱们就不要 XML 部分了
* @date: 2022/6/6 12:24
*/

public interface UserMapper extends BaseMapper<User> {
}

现在就可以测试啦,编写一个测试方法

@Resource
private UserMapper userMapper;

/**
* 分表测试
* 执行后观察打印sql
* @author yh
* @date 2022/6/6
*/
@Test
public void test1() {
RequestDataHelper.setRequestData(1L);
userMapper.selectList(null);

RequestDataHelper.setRequestData(2L);
userMapper.selectList(null);

RequestDataHelper.setRequestData(3L);
userMapper.selectList(null);

RequestDataHelper.setRequestData(4L);
userMapper.selectList(null);
}

不同的业务id按照​ ​user_​ ​​ 加 ​ ​id取模​ ​,组成表名查询。这里的分表规则随便怎么定义 时间、id、字符串hash都可以。

完整代码已上传​​Gitee Spring整合常用组件​​

到此,本章内容就介绍完啦

版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_14452299/6019736,作者:鱼找水需要时间,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

上一篇: 用好HugePage,告别Linux性能故障

下一篇: 用MySQL Workbench工具分析OSSIM数据库

相关文章

2024-06-13 08:59:42

oracle学习32-plsql版本低需到配置文件中添加配置

oracle学习32-plsql版本低需到配置文件中添加配置

2024-06-13 08:59:42
oracle 2024-06-13 08:59:42

linux篇-rpm包安装mysql数据库

linux篇-rpm包安装mysql数据库

2024-06-13 08:59:42
linux mysql 2024-06-13 08:18:27

项目开发计划(GB856T——88)基于协同的在线表格forture-sheet

项目开发计划(GB856T——88)基于协同的在线表格forture-sheet

2024-06-13 08:18:27
2024-06-13 08:12:14

SQL SERVER 表分区造成插入慢?

SQL SERVER 表分区造成插入慢?

2024-06-13 08:12:14
sqlserver table 2024-06-13 08:07:37

SQL SERVER - 使用MERGE语句完成单向表同步

SQL SERVER - 使用MERGE语句完成单向表同步

2024-06-13 08:07:37
2024-06-13 08:07:37

如何将excel数据导入sqlite中致命的编码不统一

如何将excel数据导入sqlite中致命的编码不统一

2024-06-13 08:07:37
sqlite 2024-06-12 09:30:16

项目报错“BeanInitializationException: com.xxxxx.xx.dao.data.Dao can‘t get a sessionFactory“

项目报错“BeanInitializationException: com.xxxxx.xx.dao.data.Dao can‘t get a sessionFactory“

2024-06-12 09:30:16
2024-06-12 09:30:16

Mysql创建新用户控制权限信息

Mysql创建新用户控制权限信息

2024-06-12 09:30:16
mysql 2024-06-12 09:26:30

Java实体类(entity)作用

Java实体类(entity)作用

2024-06-12 09:26:30
2024-06-12 09:26:30

mysql列存储引擎-宣讲-第二讲-一条SQL在Tianmu引擎中的运行

mysql列存储引擎-宣讲-第二讲-一条SQL在Tianmu引擎中的运行

2024-06-12 09:26:30
mysql
查看更多
推荐标签

作者介绍

天翼云小翼
天翼云用户

文章

21549

阅读量

2112679

查看更多

最新文章

linux篇-rpm包安装mysql数据库

2024-06-13 08:59:42

SQL SERVER 表分区造成插入慢?

2024-06-13 08:12:14

SQL SERVER - 使用MERGE语句完成单向表同步

2024-06-13 08:07:37

如何将excel数据导入sqlite中致命的编码不统一

2024-06-13 08:07:37

项目报错“BeanInitializationException: com.xxxxx.xx.dao.data.Dao can‘t get a sessionFactory“

2024-06-12 09:30:16

Mysql创建新用户控制权限信息

2024-06-12 09:30:16

查看更多

热门文章

Nacos数据持久化到MySQL

2023-05-12 07:20:56

MySQL的间隙锁

2023-05-12 07:20:56

​云原生微服务K8s容器编排第七章之ETCD的使用及备份

2023-03-16 07:45:55

django-连接数据库mysql

2023-04-28 02:37:51

MySQL----MySQL将数据从一个数据导入到另一个数据库

2023-04-21 02:59:42

解决Mongodb认证auth error: sasl conversation error: unable to authenticate using mechanism “SCRAM-SHA-1“

2023-04-17 10:54:33

查看更多

热门标签

mysql MySQL redis oracle python linux Oracle leetcode
查看更多

相关产品

弹性云主机

随时自助获取、弹性伸缩的云服务器资源

天翼云电脑(公众版)

便捷、安全、高效的云电脑服务

对象存储

高品质、低成本的云上存储服务

云硬盘

为云上计算资源提供持久性块存储

查看更多

随机文章

数据库|MySQL数据库基础(一)

oracle数据库dba_hist等视图中的Delta相关字段介绍

数据库按时间点恢复

数据库|如何将MySQL完全卸载

【OracleDB】CentOS 7.5中安装Oracle Database 19c单实例过程

oracle学习80-oracle之单行函数之多表查询值之课后练习

  • 7*24小时售后
  • 无忧退款
  • 免费备案
  • 专家服务
售前咨询热线
400-810-9889转1
  • 天翼云APP
    天翼云APP
 
推荐文章
含蓄的汽水  ·  教育部 国家语委关于启动中国语言资源保护工程的通知_政策文件_上海市教育委员会
3 月前
仗义的竹笋  ·  java - 有个api方法接受泛型对象参数,如何通过反射调用该方法? - SegmentFault 思否
1 年前
道上混的上铺  ·  Fabric.js 文本自动换行的实现方式 - 德育处主任 - OSCHINA - 中文开源技术交流社区
1 年前
爱旅游的感冒药  ·  网络NAT类型导致无法使用P2P服务解决方法-腾讯云开发者社区-腾讯云
1 年前
聪明的花生  ·  福田汽车1100万倒计时,见证全球商用车新纪录_中华新能源汽车网
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号