Mybatis mapper.xml使用全局變量的三種實現(xiàn)方法
Mybatis mapper.xml使用全局變量
一、概述
開發(fā)中的遇到一個有關(guān)于統(tǒng)計需求,而這個需求需要根據(jù)兩個數(shù)據(jù)庫才能實現(xiàn),而如果直接通過兩個模塊之間的交互也可以實現(xiàn),但是這樣一來,如果加入了搜索條件,而這搜索條件又分散在不同的庫中,這樣依賴數(shù)據(jù)處理起來就很復(fù)雜,而且還沒有對數(shù)據(jù)進行有效的分頁處理,考慮目前數(shù)據(jù)庫都放再一臺服務(wù)器中,還沒有不同數(shù)據(jù)庫放在不同服務(wù)器的需求,在sql中引入了庫名。
雖然引入了庫名,對應(yīng)的業(yè)務(wù)能跑起來了,但是也遇到過一個比較奇特的問題,也就是數(shù)據(jù)庫中存在了同名的庫,因為之前的sql中引入了庫名,在不改變代碼的情況下,直接修改配置文件和數(shù)據(jù)庫的庫名會導(dǎo)致引入了庫名的sql無法使用,為此,引入了.xml文件中動態(tài)修改數(shù)據(jù)庫庫名的功能,具體的話通過mybatis的全局變量實現(xiàn)。
二、實現(xiàn)方案
經(jīng)過摸索,大致的得到了三種實現(xiàn)方案
2.1 mybaits自帶全局變量定義
在springboot中yml文件中加入如下全局變量配置
mybatis: configuration: variables: myConfigName: "`base1`"
然后再sql中
<select id="selectTest" resultType="java.util.Map"> select * from ${myConfigName}.table1 </select>
需要注意的是反引號 " ` ",如果不再庫名上加上反引號,那么sql就無法順利的跑起來,此外占位符要使用$,因為$才獲取到全局變量
這樣,就可以動態(tài)的配置庫名,但是這樣的話,有一個缺點,無法設(shè)置默認(rèn)值,如果myConfigName沒有進行配置,那么這個sql就無法執(zhí)行
2.2 使用@value和mybatis進行全局變量的定義
使用@value為java的一個成員變量復(fù)制,并且實則hi默認(rèn)值,這樣我們通過yml文件配置對應(yīng)庫名了
/** * 數(shù)據(jù)庫名稱 */ public static String dataBaseName; //注意引號 @Value("${data-conf.dataBaseName:`test`}") private void setUserDataBaseName(String name){ dataBaseName=name; }
mapper定義和對應(yīng)的sql調(diào)用
List<Object> getInfoFromtaba(@Param("dataBaseName") String dataBaseName); List<Object> result=xxxmapper.getInfoFromtaba(xxx.dataBaseName)
.xml寫法
<!-- 注意,這里可以使用#占位符 ---> <select id="selectTest" resultType="java.util.Map"> select * from #{dataBaseName}.table1 </select>
這種方式解決了默認(rèn)數(shù)據(jù)庫名的問題,但是也存在一個問題,就是mapper的接口中多了數(shù)據(jù)庫名作為參數(shù),這種形參的設(shè)置看著很別扭。
2.3 使用@value和mybatis進行全局變量的定義
這種方式類似于上述2.2 的方案,只是他能減少mapper接口的不必要的數(shù)據(jù)庫名形參,只要不去細看sql,一般情況,開發(fā)人員感受不到庫名的動態(tài)配置
/** * 數(shù)據(jù)庫名稱 */ public static String dataBaseName; //注意引號 @Value("${data-conf.dataBaseName:`test`}") private void setUserDataBaseName(String name){ dataBaseName=name; }
<!-- 注意,這里可以使用#占位符 ---> <select id="selectTest" resultType="java.util.Map"> select * from <choose> <when test="null != @com.project.mapper.config.TestClass@dataBaseName"> ${@com.project.mapper.config.TestClass@dataBaseName}.table1 AS tu </when> <otherwise> `pre-base`.table1 AS tu </otherwise> </choose> </select>
注:這里@com.project.mapper.config.TestClass@dataBaseName 的第一個@com.project.mapper.config.TestClass是類的路徑,后面的@dataBaseName是庫名。
注意再test中boolean表達式子中不需要$占位符,而后續(xù)具體數(shù)據(jù)的位置需要展示位符號$,使用<chose>的原因一是為了保險,這樣就是對應(yīng)的變量的默認(rèn)值丟失了,也能使用默認(rèn)庫,二是為了避免${}報變量過長的錯
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java將網(wǎng)絡(luò)圖片轉(zhuǎn)成輸入流以及將url轉(zhuǎn)成InputStream問題
這篇文章主要介紹了Java將網(wǎng)絡(luò)圖片轉(zhuǎn)成輸入流以及將url轉(zhuǎn)成InputStream問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01Java中字符串轉(zhuǎn)int數(shù)據(jù)類型的三種方式
這篇文章主要介紹了Java中字符串轉(zhuǎn)int數(shù)據(jù)類型的三種方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03JAVA實現(xiàn) springMVC方式的微信接入、實現(xiàn)消息自動回復(fù)實例
本篇文章主要介紹了JAVA實現(xiàn) springMVC方式的微信接入、實現(xiàn)消息自動回復(fù),這里整理了詳細的代碼,有需要的小伙伴可以參考下。2016-12-12