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

MyBatis-Plus使用動(dòng)態(tài)表名分表查詢的實(shí)現(xiàn)

 更新時(shí)間:2025年11月28日 10:56:19   作者:彭于晏Yan  
本文主要介紹了MyBatis-Plus使用動(dòng)態(tài)表名分表查詢,主要是動(dòng)態(tài)修改表名的幾種常見場(chǎng)景,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

動(dòng)態(tài)修改表名的場(chǎng)景通常用于:

  • 分表策略:根據(jù)不同的條件(如年份、月份、區(qū)域等)來選擇查詢不同的表。
  • 多租戶系統(tǒng):根據(jù)租戶的不同,查詢不同的表。
  • 歷史數(shù)據(jù)管理:查詢歷史表的數(shù)據(jù)時(shí),動(dòng)態(tài)決定表名(例如每年有一個(gè)對(duì)應(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());
        //動(dòng)態(tài)表名
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> { //匿名內(nèi)部類
            String tenant = TenantContext.TENANT_DATA.get();
            // 如果不為空,使用動(dòng)態(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 {

    // 需要替換的動(dòng)態(tài)表名
    public static ThreadLocal<String> TENANT_DATA = new ThreadLocal<>();

    //用于記錄哪些表可以使用該動(dòng)態(tài)表名處理器
    private static List<String> tableNames = Arrays.asList("test_user");

    //設(shè)置請(qǐng)求線程的租戶數(shù)據(jù)
    public static void setTenantData(String tenant) {
        TENANT_DATA.set(tenant);
    }

    //刪除當(dāng)前請(qǐ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. 實(shí)體類

@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. 具體實(shí)現(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使用動(dòng)態(tài)表名分表查詢的實(shí)現(xiàn) 的文章就介紹到這了,更多相關(guān)MyBatis-Plus 動(dòng)態(tài)表查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

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

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

    Java開發(fā)之普通web項(xiàng)目轉(zhuǎn)為Maven項(xiàng)目的方法

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

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

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

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

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

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

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

    Java編程基礎(chǔ)元素-運(yùn)算符

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

    實(shí)例講解Java的設(shè)計(jì)模式編程中責(zé)任鏈模式的運(yùn)用

    這篇文章主要介紹了Java的設(shè)計(jì)模式編程中責(zé)任鏈模式的運(yùn)用,講解了通過條件判斷結(jié)構(gòu)來分配不同對(duì)象的責(zé)任權(quán)限,需要的朋友可以參考下
    2016-02-02
  • Spring Boot2.0中SpringWebContext找不到無法使用的解決方法

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

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

最新評(píng)論

南充市| 太康县| 杭锦旗| 定西市| 启东市| 沧源| 乾安县| 健康| 渭南市| 松江区| 舞阳县| 竹山县| 合水县| 镇赉县| 开平市| 台北县| 华容县| 屏山县| 礼泉县| 伊宁市| 许昌市| 阳西县| 民和| 江源县| 庆元县| 丽江市| 延长县| 六盘水市| 若羌县| 托克逊县| 嘉黎县| 柳州市| 达拉特旗| 九寨沟县| 大悟县| 安福县| 涟水县| 武邑县| 滕州市| 盖州市| 高唐县|