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

Mybatis mapper.xml使用全局變量的三種實現(xiàn)方法

 更新時間:2025年02月08日 09:16:19   作者:lijiabin417  
文章介紹了在Mybatis的Mapper.xml文件中使用全局變量來動態(tài)配置數(shù)據(jù)庫庫名的實現(xiàn)方案,包括使用mybaits自帶全局變量、使用@value和mybatis進行全局變量定義以及使用@value和mybatis進行全局變量定義并減少形參的方案

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)文章

最新評論