欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis-plus動(dòng)態(tài)表名實(shí)現(xiàn)方法

 更新時(shí)間:2022年02月10日 11:25:39   作者:許仙許仙!  
本文主要介紹了mybatis-plus動(dòng)態(tài)表名實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

1.使用場(chǎng)景

一個(gè)mybatis entity 對(duì)應(yīng)多張表(表明不同的表–> 多張表結(jié)構(gòu)一致只有表名稱(chēng)不同),在使用時(shí),可以動(dòng)態(tài)映射表名稱(chēng)。
比如:按照時(shí)間分表,某些業(yè)務(wù)冷熱數(shù)據(jù)分離后數(shù)據(jù)存在不同的表中等

2.一定要時(shí)常注意工具的更新,不吃虧

因?yàn)楣ぷ餍枰罱枰獙?shí)現(xiàn)一個(gè)類(lèi)似如下業(yè)務(wù)等功能交互:

在這里插入圖片描述

簡(jiǎn)單的描述就是:有一部分的表數(shù)據(jù),采用了外部同步的模式,同步到了doris中,在業(yè)務(wù)中采用雙數(shù)據(jù)源的方式,數(shù)據(jù)寫(xiě)在mysql,讀走doris (此處不考慮數(shù)據(jù)同步的延遲問(wèn)題 ,這是個(gè)大問(wèn)題,但我們這篇文章先不考慮這個(gè)問(wèn)題)。

要實(shí)現(xiàn)上面的方案,需要解決以下幾個(gè)問(wèn)題:

雙數(shù)據(jù)源的問(wèn)題doris/mysql中庫(kù)和表的名稱(chēng)不一致(例如:上圖綠色打底的表,在mysql和doris中表的結(jié)構(gòu)一致,但在mysql中庫(kù).表名為 : databaseA.tableA ,在doris中則為 databaseB.ods_tableB_s)

在之前項(xiàng)目研究中,因?yàn)橛凶约喝プ远xdao層mapper的方法,mybatis表中的方法對(duì)應(yīng)的sql在項(xiàng)目啟動(dòng)時(shí)就已經(jīng)生成好了對(duì)應(yīng)的sql模板,在程序運(yùn)行中,只是用參數(shù)代替即可。

在這里插入圖片描述

例如上圖,因?yàn)槲抑坝玫膍ybatis-plus 的版本比較低,在生成模板時(shí)實(shí)際上就已經(jīng)確定了表的名稱(chēng)。這就導(dǎo)致了無(wú)法在使用的時(shí)候重新替換。為了實(shí)現(xiàn)這個(gè)功能,自己實(shí)現(xiàn)的時(shí)候也是一直往我如何在生成模板語(yǔ)句的時(shí)候就直接把我想要的表名替換替換進(jìn)去。 在實(shí)現(xiàn)的差不多的時(shí)候,同事來(lái)了一句,mybatis-plus不是支持的嗎? hhhh,所以說(shuō),還是要去關(guān)注一下你在項(xiàng)目中所用到的jar包的迭代更新哦,會(huì)發(fā)現(xiàn)很多,然后開(kāi)始偷懶。

在這里插入圖片描述

3.對(duì)mybatis-plus進(jìn)行升級(jí)

我把版本從:3.3.0 升級(jí)到了 3.4.3.2
啟動(dòng)項(xiàng)目的時(shí)候發(fā)現(xiàn)服務(wù)啟動(dòng)失敗了,著急嘿~

然后在解決問(wèn)題的過(guò)程中發(fā)現(xiàn)時(shí)因?yàn)閖ar包沖突了 。
然后發(fā)現(xiàn)了idea中一個(gè)很好使用的工具【在pom.xml文件中要,右擊鼠標(biāo)進(jìn)入到Maven -> show dependence 】可以很直觀的看見(jiàn)沖突法jar包,然后去解決對(duì)應(yīng)的沖突就可以了 (這里不多說(shuō)了,給大家一個(gè)學(xué)習(xí)鏈接傳送門(mén):https://blog.csdn.net/daerzei/article/details/82344569)

4.將原來(lái)的mybatis的插件配置調(diào)整成新版本的,并添加上動(dòng)態(tài)表名的模塊

4.1 調(diào)整mybatis plus 配置

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        //添加上自己實(shí)現(xiàn)的表名處理器DayRecordTableNameHandler
        dynamicTableNameInnerInterceptor.setTableNameHandler(new DayRecordTableNameHandler());
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);

        return interceptor;
    }

4.2 自定義表名稱(chēng)處理器

結(jié)合threadlocal 來(lái)確定對(duì)對(duì)應(yīng)的業(yè)務(wù)邏輯使用什么表名稱(chēng)(我這里是利用將數(shù)據(jù)源信息放入到threadlocal中,然后來(lái)映射不同的表名稱(chēng)),下面的代碼示例是一個(gè)簡(jiǎn)化版:

public class DayRecordTableNameHandler implements TableNameHandler {
    private static final Logger log = LoggerFactory.getLogger(DayRecordTableNameHandler.class);

    public DayRecordTableNameHandler(){
    }

    @Override
    public String dynamicTableName(String sql, String tableName) {
        Object dataSource = HnThreadLocal.get(SystemConstants.DATASOURCE);
        if(Objects.isNull(dataSource)){
            return tableName;
        }
        if(Objects.equals(tableName,"zsh_day_record")){
            int dataSourceIntValue = (int)dataSource;
            if(Objects.equals(dataSourceIntValue,1)){
                log.info("表名替換:"+tableName+"--->sql:ods_zsh_day_record_s");
                return "ods_zsh_day_record_s";
            }
        }
        return tableName;
    }

}

4.3 利用AOP切換數(shù)據(jù)源

這里想省略了,多數(shù)據(jù)源用的是dynamic-datasource-spring-boot-starter
AOP監(jiān)聽(tīng)多是 @DS ,依據(jù)注解value來(lái)判斷數(shù)據(jù)源是不是走doris

5.運(yùn)行一下

成功運(yùn)行

6. 需要注意的地方

threadlocal 中的數(shù)據(jù)在aop中最好自己釋放掉 ,spring是用的線程池,如果不清理掉會(huì)影響線程下次使用的程序這是個(gè)草稿實(shí)現(xiàn),因?yàn)榍懊鎻?qiáng)調(diào)的數(shù)據(jù)同步模塊,是需要考慮進(jìn)去的,繼續(xù)摸索啦~~~

到此這篇關(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)文章

  • Java Idea高效率配置技巧實(shí)例解析

    Java Idea高效率配置技巧實(shí)例解析

    這篇文章主要介紹了Java Idea高效率配置技巧實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java理論基礎(chǔ)Stream?reduce實(shí)現(xiàn)集合元素歸約

    java理論基礎(chǔ)Stream?reduce實(shí)現(xiàn)集合元素歸約

    這篇文章主要為大家介紹了java理論基礎(chǔ)Stream?reduce實(shí)現(xiàn)集合元素歸約示例詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • 深入剖析Java ArrayQueue(JDK)的源碼

    深入剖析Java ArrayQueue(JDK)的源碼

    本篇文章主要給大家介紹一個(gè)比較簡(jiǎn)單的JDK為我們提供的容器ArrayQueue,這個(gè)容器主要是用數(shù)組實(shí)現(xiàn)的一個(gè)單向隊(duì)列,整體的結(jié)構(gòu)相對(duì)其他容器來(lái)說(shuō)就比較簡(jiǎn)單了,感興趣的可以了解一下
    2022-08-08
  • mybatis那些約定的配置你真的都了解嗎(經(jīng)驗(yàn)總結(jié))

    mybatis那些約定的配置你真的都了解嗎(經(jīng)驗(yàn)總結(jié))

    mybatsi中Mapper和xml文件之間有很多約定俗稱(chēng)的規(guī)則,比如名稱(chēng)匹配,包掃描,別名等,這些規(guī)則是什么。如果想更加靈活,該如何配置呢?今天就給大家講一下如何配置mybatsi的xml文件
    2021-06-06
  • java使用單向鏈表解決數(shù)據(jù)存儲(chǔ)自定義排序問(wèn)題

    java使用單向鏈表解決數(shù)據(jù)存儲(chǔ)自定義排序問(wèn)題

    本文主要介紹了java使用單向鏈表解決數(shù)據(jù)存儲(chǔ)自定義排序問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Spring源碼解析之事務(wù)傳播特性

    Spring源碼解析之事務(wù)傳播特性

    今天帶大家分析Spring源碼,文中對(duì)Spring事務(wù)傳播特性做了非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)跳表

    Java數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)跳表

    今天帶大家來(lái)學(xué)習(xí)Java數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí),文中對(duì)用Java實(shí)現(xiàn)跳表作了非常詳細(xì)的圖文解說(shuō)及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • 淺談SpringMVC的執(zhí)行流程

    淺談SpringMVC的執(zhí)行流程

    下面小編就為大家?guī)?lái)一篇淺談SpringMVC的執(zhí)行流程。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Mybatis分頁(yè)插件PageHelper的分頁(yè)原理剖析

    Mybatis分頁(yè)插件PageHelper的分頁(yè)原理剖析

    這篇文章主要介紹了Mybatis分頁(yè)插件PageHelper的分頁(yè)原理剖析,PageHelper作為一個(gè)啟動(dòng)器,那么就和其他啟動(dòng)器加載一樣,先讀取spring.factories文件里面配置的類(lèi),轉(zhuǎn)成Bean加載本系統(tǒng)中,然后執(zhí)行他的前置后置處理方法,完成初始化,需要的朋友可以參考下
    2023-08-08
  • Java?NIO?中?Selector?解析

    Java?NIO?中?Selector?解析

    這篇文章主要介紹了Java?NIO?中?Selector,Selector即選擇器,選擇器提供選擇執(zhí)行已經(jīng)就緒的任務(wù)的能力即為翻譯為多路復(fù)用,下面文章對(duì)Selector詳細(xì)介紹內(nèi)容,需要的小伙伴可以參考一下
    2022-02-02

最新評(píng)論