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

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

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

Mybatis mapper.xml使用全局變量

一、概述

開發(fā)中的遇到一個(gè)有關(guān)于統(tǒng)計(jì)需求,而這個(gè)需求需要根據(jù)兩個(gè)數(shù)據(jù)庫(kù)才能實(shí)現(xiàn),而如果直接通過兩個(gè)模塊之間的交互也可以實(shí)現(xiàn),但是這樣一來,如果加入了搜索條件,而這搜索條件又分散在不同的庫(kù)中,這樣依賴數(shù)據(jù)處理起來就很復(fù)雜,而且還沒有對(duì)數(shù)據(jù)進(jìn)行有效的分頁(yè)處理,考慮目前數(shù)據(jù)庫(kù)都放再一臺(tái)服務(wù)器中,還沒有不同數(shù)據(jù)庫(kù)放在不同服務(wù)器的需求,在sql中引入了庫(kù)名。

雖然引入了庫(kù)名,對(duì)應(yīng)的業(yè)務(wù)能跑起來了,但是也遇到過一個(gè)比較奇特的問題,也就是數(shù)據(jù)庫(kù)中存在了同名的庫(kù),因?yàn)橹暗膕ql中引入了庫(kù)名,在不改變代碼的情況下,直接修改配置文件和數(shù)據(jù)庫(kù)的庫(kù)名會(huì)導(dǎo)致引入了庫(kù)名的sql無法使用,為此,引入了.xml文件中動(dòng)態(tài)修改數(shù)據(jù)庫(kù)庫(kù)名的功能,具體的話通過mybatis的全局變量實(shí)現(xiàn)。

二、實(shí)現(xiàn)方案

經(jīng)過摸索,大致的得到了三種實(shí)現(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>

需要注意的是反引號(hào) " ` ",如果不再庫(kù)名上加上反引號(hào),那么sql就無法順利的跑起來,此外占位符要使用$,因?yàn)?才獲取到全局變量

這樣,就可以動(dòng)態(tài)的配置庫(kù)名,但是這樣的話,有一個(gè)缺點(diǎn),無法設(shè)置默認(rèn)值,如果myConfigName沒有進(jìn)行配置,那么這個(gè)sql就無法執(zhí)行

2.2 使用@value和mybatis進(jìn)行全局變量的定義

使用@value為java的一個(gè)成員變量復(fù)制,并且實(shí)則hi默認(rèn)值,這樣我們通過yml文件配置對(duì)應(yīng)庫(kù)名了

    /**
     * 數(shù)據(jù)庫(kù)名稱
     */
    public static String dataBaseName;
	//注意引號(hào)
    @Value("${data-conf.dataBaseName:`test`}")
    private void setUserDataBaseName(String name){
        dataBaseName=name;
    }

mapper定義和對(duì)應(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ù)庫(kù)名的問題,但是也存在一個(gè)問題,就是mapper的接口中多了數(shù)據(jù)庫(kù)名作為參數(shù),這種形參的設(shè)置看著很別扭。

2.3 使用@value和mybatis進(jìn)行全局變量的定義

這種方式類似于上述2.2 的方案,只是他能減少mapper接口的不必要的數(shù)據(jù)庫(kù)名形參,只要不去細(xì)看sql,一般情況,開發(fā)人員感受不到庫(kù)名的動(dòng)態(tài)配置

    /**
     * 數(shù)據(jù)庫(kù)名稱
     */
    public static String dataBaseName;
	//注意引號(hào)
    @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 的第一個(gè)@com.project.mapper.config.TestClass是類的路徑,后面的@dataBaseName是庫(kù)名。

注意再test中boolean表達(dá)式子中不需要$占位符,而后續(xù)具體數(shù)據(jù)的位置需要展示位符號(hào)$,使用<chose>的原因一是為了保險(xiǎn),這樣就是對(duì)應(yīng)的變量的默認(rèn)值丟失了,也能使用默認(rèn)庫(kù),二是為了避免${}報(bào)變量過長(zhǎng)的錯(cuò)

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring AOP 中 JoinPoint 使用詳解

    Spring AOP 中 JoinPoint 使用詳解

    JoinPoint是Spring AOP中獲取方法運(yùn)行時(shí)信息的核心接口,可以獲取方法參數(shù)、類名、方法名、Method對(duì)象、注解等,下面就來介紹一下Spring AOP  JoinPoint 使用,感興趣的可以了解一下
    2026-02-02
  • Java中的攔截器、過濾器、監(jiān)聽器用法詳解

    Java中的攔截器、過濾器、監(jiān)聽器用法詳解

    這篇文章主要介紹了Java中的攔截器、過濾器、監(jiān)聽器用法,詳細(xì)分析了Java攔截器、過濾器、監(jiān)聽器的功能、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-05-05
  • java多線程之停止線程的方法實(shí)例代碼詳解

    java多線程之停止線程的方法實(shí)例代碼詳解

    這篇文章主要介紹了java多線程之停止線程的方法實(shí)例代碼詳解,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • SpringBoot中的定時(shí)任務(wù)和異步調(diào)用詳解

    SpringBoot中的定時(shí)任務(wù)和異步調(diào)用詳解

    這篇文章主要介紹了SpringBoot中的定時(shí)任務(wù)和異步調(diào)用詳解,SpringBoot 定時(shí)任務(wù)是一種在SpringBoot應(yīng)用中自動(dòng)執(zhí)行任務(wù)的機(jī)制,通過使用Spring框架提供的@Scheduled注解,我們可以輕松地創(chuàng)建定時(shí)任務(wù),需要的朋友可以參考下
    2023-10-10
  • Springboot整合spring-boot-starter-data-elasticsearch的過程

    Springboot整合spring-boot-starter-data-elasticsearch的過程

    本文詳細(xì)介紹了Springboot整合spring-boot-starter-data-elasticsearch的過程,包括版本要求、依賴添加、實(shí)體類添加、索引的名稱、分片、副本設(shè)置等,同時(shí),還介紹了如何使用ElasticsearchRepository類進(jìn)行增刪改查操作
    2024-10-10
  • springboot如何根據(jù)不同的日志級(jí)別顯示不同的顏色

    springboot如何根據(jù)不同的日志級(jí)別顯示不同的顏色

    這篇文章主要介紹了springboot如何根據(jù)不同的日志級(jí)別顯示不同的顏色問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Nacos注冊(cè)中心的部署與用法示例詳解

    Nacos注冊(cè)中心的部署與用法示例詳解

    注冊(cè)中心是微服務(wù)架構(gòu)中的紐帶,類似于“通訊錄”,它記錄了服務(wù)和服務(wù)地址的映射關(guān)系,本文通過示例代碼給大家介紹Nacos注冊(cè)中心的部署與用法,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • 10種java數(shù)組合并的常用方法總結(jié)

    10種java數(shù)組合并的常用方法總結(jié)

    在Java中,合并(或連接)數(shù)組是常見的任務(wù),這篇文章主要為大家整理了10個(gè)java中常用的數(shù)組合并方法,文中的示例代碼簡(jiǎn)潔易懂,需要的小伙伴可以參考下
    2023-12-12
  • 解決SpringBoot中MultipartResolver和ServletFileUpload的沖突問題

    解決SpringBoot中MultipartResolver和ServletFileUpload的沖突問題

    這篇文章主要介紹了解決SpringBoot中MultipartResolver和ServletFileUpload的沖突問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Maven 本地倉(cāng)庫(kù)替代私倉(cāng)配置指南

    Maven 本地倉(cāng)庫(kù)替代私倉(cāng)配置指南

    本文主要介紹了Maven 本地倉(cāng)庫(kù)替代私倉(cāng)配置指南,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04

最新評(píng)論

呼伦贝尔市| 柏乡县| 临沧市| 龙江县| 丰台区| 正阳县| 枣强县| 安徽省| 会东县| 中超| 湖州市| 光泽县| 昭觉县| 新竹县| 建湖县| 修武县| 罗山县| 永济市| 青川县| 乌兰浩特市| 石城县| 桂阳县| 黎平县| 永平县| 米脂县| 花莲县| 葵青区| 库车县| 普格县| 齐齐哈尔市| 宕昌县| 宁陕县| 郑州市| 台州市| 大同市| 抚宁县| 石嘴山市| 罗平县| 汉川市| 锦州市| 娱乐|