最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • jdk1.8的環(huán)境配置過程

    jdk1.8的環(huán)境配置過程

    Java平臺由Java虛擬機和Java應用程序接口搭建,Java語言則是進入這個平臺的通道,用Java語言編寫并編譯的程序可以運行在這個平臺上,本文給大家講解jdk1.8的環(huán)境配置過程,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • 詳解Java代碼常見優(yōu)化方案

    詳解Java代碼常見優(yōu)化方案

    這篇文章主要介紹了Java代碼常見優(yōu)化方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • IDEA創(chuàng)建父項目和子項目的實現(xiàn)步驟

    IDEA創(chuàng)建父項目和子項目的實現(xiàn)步驟

    本文主要介紹了IDEA創(chuàng)建父項目和子項目的實現(xiàn)步驟,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • Java開發(fā)之普通web項目轉為Maven項目的方法

    Java開發(fā)之普通web項目轉為Maven項目的方法

    這篇文章主要給大家介紹了關于Java開發(fā)之普通web項目轉為Maven項目的相關資料,文中通過圖文將轉換的方法步驟介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-12-12
  • SpringBoot使用WebSocket實現(xiàn)向前端推送消息功能

    SpringBoot使用WebSocket實現(xiàn)向前端推送消息功能

    WebSocket協(xié)議是基于TCP的一種新的網絡協(xié)議,它實現(xiàn)了瀏覽器與服務器全雙工(full-duplex)通信——允許服務器主動發(fā)送信息給客戶端,本文給大家介紹了SpringBoot使用WebSocket實現(xiàn)向前端推送消息功能,需要的朋友可以參考下
    2024-05-05
  • JAVA語言編程格式高級規(guī)范

    JAVA語言編程格式高級規(guī)范

    這篇文章主要介紹了JAVA語言編程格式高級規(guī)范,需要的朋友可以參考下
    2015-05-05
  • Java泛化調用實現(xiàn)原理解析

    Java泛化調用實現(xiàn)原理解析

    泛化調用指的是不依賴服務接口的本地?stub?或代理類,通過統(tǒng)一的參數(shù)結構動態(tài)調用遠程服務方法,本文介紹Java泛化調用實現(xiàn)原理解析,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • Java編程基礎元素-運算符

    Java編程基礎元素-運算符

    這篇文章主要介紹了Java編程基礎元素-運算符,運算符就是在用變量或常量進行運算時,經常需要用到的運算符,Java?提供了豐富的運算符,可分為算術運算符、關系運算符、邏輯運算符和位運算符,下面來看具體的內容介紹吧
    2022-01-01
  • 實例講解Java的設計模式編程中責任鏈模式的運用

    實例講解Java的設計模式編程中責任鏈模式的運用

    這篇文章主要介紹了Java的設計模式編程中責任鏈模式的運用,講解了通過條件判斷結構來分配不同對象的責任權限,需要的朋友可以參考下
    2016-02-02
  • Spring Boot2.0中SpringWebContext找不到無法使用的解決方法

    Spring Boot2.0中SpringWebContext找不到無法使用的解決方法

    這篇文章主要給大家介紹了關于Spring Boot2.0中SpringWebContext找不到無法使用的解決方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-12-12

最新評論

上杭县| 同德县| 衡阳市| 扬中市| 垣曲县| 民县| 屯门区| 正定县| 突泉县| 庆元县| 蒙城县| 和龙市| 淮南市| 永清县| 北辰区| 龙里县| 垦利县| 建湖县| 环江| 贺州市| 九江市| 双辽市| 车致| 陆良县| 修武县| 广安市| 东明县| 武汉市| 普陀区| 临洮县| 松潘县| 襄垣县| 兖州市| 韶山市| 桃园县| 涿鹿县| 祥云县| 丰台区| 福建省| 博兴县| 凭祥市|