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

mybatis-plus動態(tài)表名實現方法

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

1.使用場景

一個mybatis entity 對應多張表(表明不同的表–> 多張表結構一致只有表名稱不同),在使用時,可以動態(tài)映射表名稱。
比如:按照時間分表,某些業(yè)務冷熱數據分離后數據存在不同的表中等

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

因為工作需要,最近需要實現一個類似如下業(yè)務等功能交互:

在這里插入圖片描述

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

要實現上面的方案,需要解決以下幾個問題:

雙數據源的問題doris/mysql中庫和表的名稱不一致(例如:上圖綠色打底的表,在mysql和doris中表的結構一致,但在mysql中庫.表名為 : databaseA.tableA ,在doris中則為 databaseB.ods_tableB_s)

在之前項目研究中,因為有自己去自定義dao層mapper的方法,mybatis表中的方法對應的sql在項目啟動時就已經生成好了對應的sql模板,在程序運行中,只是用參數代替即可。

在這里插入圖片描述

例如上圖,因為我之前用的mybatis-plus 的版本比較低,在生成模板時實際上就已經確定了表的名稱。這就導致了無法在使用的時候重新替換。為了實現這個功能,自己實現的時候也是一直往我如何在生成模板語句的時候就直接把我想要的表名替換替換進去。 在實現的差不多的時候,同事來了一句,mybatis-plus不是支持的嗎? hhhh,所以說,還是要去關注一下你在項目中所用到的jar包的迭代更新哦,會發(fā)現很多,然后開始偷懶。

在這里插入圖片描述

3.對mybatis-plus進行升級

我把版本從:3.3.0 升級到了 3.4.3.2
啟動項目的時候發(fā)現服務啟動失敗了,著急嘿~

然后在解決問題的過程中發(fā)現時因為jar包沖突了 。
然后發(fā)現了idea中一個很好使用的工具【在pom.xml文件中要,右擊鼠標進入到Maven -> show dependence 】可以很直觀的看見沖突法jar包,然后去解決對應的沖突就可以了 (這里不多說了,給大家一個學習鏈接傳送門:https://blog.csdn.net/daerzei/article/details/82344569)

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

4.1 調整mybatis plus 配置

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

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

        return interceptor;
    }

4.2 自定義表名稱處理器

結合threadlocal 來確定對對應的業(yè)務邏輯使用什么表名稱(我這里是利用將數據源信息放入到threadlocal中,然后來映射不同的表名稱),下面的代碼示例是一個簡化版:

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切換數據源

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

5.運行一下

成功運行

6. 需要注意的地方

threadlocal 中的數據在aop中最好自己釋放掉 ,spring是用的線程池,如果不清理掉會影響線程下次使用的程序這是個草稿實現,因為前面強調的數據同步模塊,是需要考慮進去的,繼續(xù)摸索啦~~~

到此這篇關于mybatis-plus動態(tài)表名實現方法的文章就介紹到這了,更多相關mybatis-plus動態(tài)表名內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

石景山区| 武功县| 新宁县| 奉化市| 宁乡县| 丰原市| 苗栗县| 孟村| 嘉兴市| 屏边| 连云港市| 盐亭县| 元氏县| 崇州市| 平阴县| 德兴市| 新竹县| 长顺县| 中宁县| 西贡区| 揭东县| 涿州市| 长沙市| 城步| 绥宁县| 开江县| 特克斯县| 兰州市| 奉节县| 司法| 延吉市| 乐陵市| 中宁县| 板桥市| 克东县| 土默特左旗| 哈巴河县| 东丰县| 泰州市| 大田县| 双城市|