MyBatis-Plus使用動態(tài)表名分表查詢的實現(xiàn)
更新時間:2025年11月28日 10:56:19 作者:彭于晏Yan
本文主要介紹了MyBatis-Plus使用動態(tài)表名分表查詢,主要是動態(tài)修改表名的幾種常見場景,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
動態(tài)修改表名的場景通常用于:
- 分表策略:根據不同的條件(如年份、月份、區(qū)域等)來選擇查詢不同的表。
- 多租戶系統(tǒng):根據租戶的不同,查詢不同的表。
- 歷史數(shù)據管理:查詢歷史表的數(shù)據時,動態(tài)決定表名(例如每年有一個對應的表,table_2021, table_2022 等)。
1. 引入依賴
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
注意:版本須使用3.5.3以上,否則無法使用DynamicTableNameInnerInterceptor類中的setTableNameHandler方法
2. mybatis-plus配置
@Configuration
@Slf4j
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
// 數(shù)據權限
//mybatisPlusInterceptor.addInnerInterceptor(new DataFilterInterceptor());
// 樂觀鎖
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
// 防止全表更新與刪除
mybatisPlusInterceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
//動態(tài)表名
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> { //匿名內部類
String tenant = TenantContext.TENANT_DATA.get();
// 如果不為空,使用動態(tài)表名。
if (StringUtils.isNotBlank(tenant) && TenantContext.containsTableName(tableName)) {
log.info("dynamicTableName -- >tableName={}, tenant={}",tableName, tenant);
return tableName + "_" + tenant;
}
return tableName;
});
mybatisPlusInterceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
// 分頁插件
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
3. TenantContext 類:租戶上下文管理器
public class TenantContext {
// 需要替換的動態(tài)表名
public static ThreadLocal<String> TENANT_DATA = new ThreadLocal<>();
//用于記錄哪些表可以使用該動態(tài)表名處理器
private static List<String> tableNames = Arrays.asList("test_user");
//設置請求線程的租戶數(shù)據
public static void setTenantData(String tenant) {
TENANT_DATA.set(tenant);
}
//刪除當前請求線程的租戶數(shù)據
public static void removeYearData() {
TENANT_DATA.remove();
}
public static Boolean containsTableName(String tableName) {
if (tableNames.contains(tableName)) {
return true;
}
return false;
}
}
4. 實體類
@Data
@TableName("test_user")
public class TestUser implements Serializable {
private String id;
private String name;
private String managerId;
private String salary;
private String age;
private String departId;
private String remark;
private String province;
}
5. 具體實現(xiàn)
@RestController
@Slf4j
public class TestController {
@Resource
private ITestUserService testUserService;
@GetMapping("/selectList")
public List<TestUser> selectList(@RequestParam String tenant) {
return testUserService.selectList(tenant);
}
}
public interface ITestUserService extends IService<TestUser> {
List<TestUser> selectList(String tenant);
}
@Service
public class TestUserServiceImpl extends ServiceImpl<TestUserMapper, TestUser> implements ITestUserService {
@Overridejava
public List<TestUser> selectList(String tenant) {
TenantContext.setTenantData(tenant);
Wrapper<TestUser> queryWrapper = new QueryWrapper<>();
return baseMapper.selectList(queryWrapper);
}
}
到此這篇關于MyBatis-Plus使用動態(tài)表名分表查詢的實現(xiàn) 的文章就介紹到這了,更多相關MyBatis-Plus 動態(tài)表查詢內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
- MybatisPlus攔截器如何實現(xiàn)數(shù)據表分表
- SpringBoot+MybatisPlus實現(xiàn)sharding-jdbc分庫分表的示例代碼
- SpringBoot+Mybatis-plus+shardingsphere實現(xiàn)分庫分表的方案
- Mybatis-Plus集成Sharding-JDBC與Flyway實現(xiàn)多租戶分庫分表實戰(zhàn)
- SQL數(shù)據分表Mybatis?Plus動態(tài)表名優(yōu)方案
- SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分庫分表
- springboot+mybatis-plus基于攔截器實現(xiàn)分表的示例代碼
- Mybatis-plus使用TableNameHandler分表詳解(附完整示例源碼)
- Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 實現(xiàn)分庫分表功能
相關文章
IDEA創(chuàng)建父項目和子項目的實現(xiàn)步驟
本文主要介紹了IDEA創(chuàng)建父項目和子項目的實現(xiàn)步驟,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-07-07
Java開發(fā)之普通web項目轉為Maven項目的方法
這篇文章主要給大家介紹了關于Java開發(fā)之普通web項目轉為Maven項目的相關資料,文中通過圖文將轉換的方法步驟介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-12-12
SpringBoot使用WebSocket實現(xiàn)向前端推送消息功能
WebSocket協(xié)議是基于TCP的一種新的網絡協(xié)議,它實現(xiàn)了瀏覽器與服務器全雙工(full-duplex)通信——允許服務器主動發(fā)送信息給客戶端,本文給大家介紹了SpringBoot使用WebSocket實現(xiàn)向前端推送消息功能,需要的朋友可以參考下2024-05-05
Spring Boot2.0中SpringWebContext找不到無法使用的解決方法
這篇文章主要給大家介紹了關于Spring Boot2.0中SpringWebContext找不到無法使用的解決方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧2018-12-12

