MybatisPlus攔截器如何實(shí)現(xiàn)數(shù)據(jù)表分表
MybatisPlus攔截器實(shí)現(xiàn)數(shù)據(jù)表分表
很多項(xiàng)目都會(huì)存在一些數(shù)據(jù)量很大或者數(shù)據(jù)量增加很快的業(yè)務(wù)表,由于mysql的數(shù)據(jù)量達(dá)到一定量后會(huì)影響我們的查詢效率,為了避免該類問(wèn)題發(fā)生,我們需要在項(xiàng)目前期設(shè)計(jì)的時(shí)候針對(duì)這兩類情況做一個(gè)分表的設(shè)計(jì)。
這里的分表指的是水平拆分(只是表名不同,其余字段都一致,主鍵id不允許重復(fù)),對(duì)某一個(gè)數(shù)字取模運(yùn)算做為拆分后表的后綴名,具體要分多少?gòu)埍砜赏ㄟ^(guò)自己實(shí)際的項(xiàng)目情況確定。
首先創(chuàng)建請(qǐng)求參數(shù)傳遞的一個(gè)輔助類
/**
* 請(qǐng)求參數(shù)傳遞輔助類
*/
public class RequestDataHelper {
/**
* 請(qǐng)求參數(shù)存取
*/
private static final ThreadLocal<Map<String, Object>> REQUEST_DATA = new ThreadLocal<>();
/**
* 設(shè)置請(qǐng)求參數(shù)
*
* @param requestData 請(qǐng)求參數(shù) MAP 對(duì)象
*/
public static void setRequestData (Map<String, Object> requestData) {
REQUEST_DATA.set(requestData);
}
/**
* 獲取請(qǐng)求參數(shù)
*
* @return 請(qǐng)求參數(shù) MAP 對(duì)象
*/
public static Map<String, Object> getRequestData () {
return REQUEST_DATA.get();
}
}該輔助類主要作用有:
- a.設(shè)置請(qǐng)求參數(shù)
- b.將請(qǐng)求參數(shù)存取到線程變量中
- c.獲取請(qǐng)求參數(shù)
簡(jiǎn)單的說(shuō)就是在涉及到需要分表的數(shù)據(jù)操作時(shí),將請(qǐng)求參數(shù)放入線程變量中。
然后在攔截器里面獲取這個(gè)參數(shù),做特定的處理,找到我們具體要操作的那張表。
這里的請(qǐng)求參數(shù)大家可以把它理解成跟我們分表后的表名產(chǎn)生關(guān)聯(lián)的數(shù)據(jù)。
這里面的線程變量是僅在當(dāng)前線程下可使用的數(shù)據(jù),與其他線程做隔離。
在本文中不做詳細(xì)解釋。
在涉及到分表的數(shù)據(jù)層操作前(Mybatisplus或者M(jìn)ybatis增刪改查數(shù)據(jù)前)
將請(qǐng)求參數(shù)放入線程變量
RequestDataHelper.setRequestData(Collections.singletonMap("studentId", param.getStudentId()));
LambdaQueryWrapper<StudentRecordEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(StudentRecordEntity::getStudentId, param.getStudentId());
List<StudentRecordEntity> studentRecordEntityList = super.list(queryWrapper);Mybatisplus 攔截器代碼
/**
* Mybatis plus 攔截器
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//動(dòng)態(tài)表插件
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {
// 獲取參數(shù)方法
if (tableName.equalsIgnoreCase("t_student_record")) {
Map<String, Object> paramMap = RequestDataHelper.getRequestData();
long studentId= Long.parseLong(String.valueOf(paramMap.get("studentId")));
int mod = (int) (studentId% 16);
return tableName + "_" + mod;
} else {
return tableName;
}
});
interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
return interceptor;
}這里面t_student_record表就是要拆分的表,如果有多個(gè),在if里面寫多個(gè)。
studentId就是調(diào)用的時(shí)候傳入線程變量的請(qǐng)求參數(shù),對(duì)它%16就是分了16張表,根據(jù)實(shí)際業(yè)務(wù)情況,需要分多少?gòu)埦桶?后面的數(shù)字改為多少。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot+MybatisPlus實(shí)現(xiàn)sharding-jdbc分庫(kù)分表的示例代碼
- SpringBoot+Mybatis-plus+shardingsphere實(shí)現(xiàn)分庫(kù)分表的方案
- Mybatis-Plus集成Sharding-JDBC與Flyway實(shí)現(xiàn)多租戶分庫(kù)分表實(shí)戰(zhàn)
- SQL數(shù)據(jù)分表Mybatis?Plus動(dòng)態(tài)表名優(yōu)方案
- SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分庫(kù)分表
- springboot+mybatis-plus基于攔截器實(shí)現(xiàn)分表的示例代碼
- Mybatis-plus使用TableNameHandler分表詳解(附完整示例源碼)
- Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 實(shí)現(xiàn)分庫(kù)分表功能
- MyBatis-Plus使用動(dòng)態(tài)表名分表查詢的實(shí)現(xiàn)
相關(guān)文章
SQL?PRIMARY?KEY唯一標(biāo)識(shí)表中記錄的關(guān)鍵約束語(yǔ)句
這篇文章主要為大家介紹了SQL?PRIMARY?KEY唯一標(biāo)識(shí)表中記錄的關(guān)鍵約束語(yǔ)句詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
MySQL多表關(guān)聯(lián)查詢相關(guān)練習(xí)題
這篇文章主要給大家介紹了關(guān)于MySQL多表關(guān)聯(lián)查詢的相關(guān)資料,在MySQL中JOIN語(yǔ)句是實(shí)現(xiàn)多表關(guān)聯(lián)查詢的關(guān)鍵,它可以將多個(gè)表格中符合條件的數(shù)據(jù)連接在一起,從而提供一個(gè)完整的查詢結(jié)果,需要的朋友可以參考下2023-10-10
MySQL實(shí)現(xiàn)批量推送數(shù)據(jù)到Mongo
這篇文章主要為大家詳細(xì)介紹了MySQL如何實(shí)現(xiàn)批量推送數(shù)據(jù)到Mongo,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2023-05-05
mysql 8.0.15 版本安裝教程 連接Navicat.list
這篇文章主要為大家詳細(xì)介紹了mysql 8.0.15 版本安裝教程,連接Navicat.list,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
mysql創(chuàng)建存儲(chǔ)過(guò)程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法分析
這篇文章主要介紹了mysql創(chuàng)建存儲(chǔ)過(guò)程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法,結(jié)合實(shí)例形式對(duì)比分析了通過(guò)存儲(chǔ)過(guò)程新增字段相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
Windows(x86,64bit)升級(jí)MySQL 5.7.17免安裝版的詳細(xì)教程
這篇文章主要介紹了Windows(x86,64bit)升級(jí)MySQL 5.7.17免安裝版的詳細(xì)教程,需要的朋友可以參考下2017-02-02
Centos7下使用yum安裝mysql數(shù)據(jù)庫(kù)的詳細(xì)教程(增強(qiáng)版)
這篇文章主要介紹了Centos7下使用yum安裝mysql數(shù)據(jù)庫(kù)的詳細(xì)教程(增強(qiáng)版),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12

