MyBatis-Plus使用動態(tài)表名分表查詢的實現(xiàn)
動態(tài)修改表名的場景通常用于:
- 分表策略:根據(jù)不同的條件(如年份、月份、區(qū)域等)來選擇查詢不同的表。
- 多租戶系統(tǒng):根據(jù)租戶的不同,查詢不同的表。
- 歷史數(shù)據(jù)管理:查詢歷史表的數(shù)據(jù)時,動態(tài)決定表名(例如每年有一個對應(yīng)的表,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ù)據(jù)權(quán)限
//mybatisPlusInterceptor.addInnerInterceptor(new DataFilterInterceptor());
// 樂觀鎖
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
// 防止全表更新與刪除
mybatisPlusInterceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
//動態(tài)表名
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> { //匿名內(nèi)部類
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è)置請求線程的租戶數(shù)據(jù)
public static void setTenantData(String tenant) {
TENANT_DATA.set(tenant);
}
//刪除當(dāng)前請求線程的租戶數(shù)據(jù)
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);
}
}
到此這篇關(guān)于MyBatis-Plus使用動態(tài)表名分表查詢的實現(xiàn) 的文章就介紹到這了,更多相關(guān)MyBatis-Plus 動態(tài)表查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MybatisPlus攔截器如何實現(xiàn)數(shù)據(jù)表分表
- SpringBoot+MybatisPlus實現(xiàn)sharding-jdbc分庫分表的示例代碼
- SpringBoot+Mybatis-plus+shardingsphere實現(xiàn)分庫分表的方案
- Mybatis-Plus集成Sharding-JDBC與Flyway實現(xiàn)多租戶分庫分表實戰(zhàn)
- SQL數(shù)據(jù)分表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)分庫分表功能
相關(guān)文章
SpringBoot響應(yīng)出現(xiàn)中文亂碼的解決方法
這篇文章主要介紹了SpringBoot響應(yīng)出現(xiàn)中文亂碼的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作有一定的參考價值,需要的朋友們下面隨著小編來一起來學(xué)習(xí)吧2024-02-02
學(xué)會CompletableFuture輕松駕馭異步編程
這篇文章主要為大家介紹了CompletableFuture輕松駕馭異步編程教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04
Spring Security學(xué)習(xí)之rememberMe自動登錄的實現(xiàn)
這篇文章主要給大家介紹了關(guān)于Spring Security學(xué)習(xí)之rememberMe自動登錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
java線程中synchronized和Lock區(qū)別及介紹
這篇文章主要為大家介紹了java線程中synchronized和Lock區(qū)別及介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
Java C++題解leetcode886可能的二分法并查集染色法
這篇文章主要為大家介紹了Java C++題解leetcode886可能的二分法并查集染色法實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
Mybatis特殊字符轉(zhuǎn)義查詢實現(xiàn)
本文主要介紹了Mybatis特殊字符轉(zhuǎn)義查詢實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02

