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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot+springsecurity+mybatis+JWT+Redis?實現前后端離實戰(zhàn)教程
這篇文章主要介紹了springboot+springsecurity+mybatis+JWT+Redis?實現前后端離實戰(zhàn)教程,需要的朋友可以參考下2024-01-01
完美解決springboot中使用mybatis字段不能進行自動映射的問題
今天在springboot中使用mybatis的時候不能字段不能夠進行自動映射,接下來給大家給帶來了完美解決springboot中使用mybatis字段不能進行自動映射的問題,需要的朋友可以參考下2023-05-05
java中的equals()和toString()方法實例詳解
這篇文章主要介紹了java中的equals()和toString()方法實例詳解的相關資料,這里舉例說明,并附實例代碼,和實現效果圖,需要的朋友可以參考下2016-11-11

