欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Mybatismapper.xml使用全局变量的三种实现方法,

来源: javaer 分享于  点击 47862 次 点评:26

Mybatismapper.xml使用全局变量的三种实现方法,


目录
  • Mybatis mapper.xml使用全局变量
    • 一、概述
    • 二、实现方案
      • 2.1 mybaits自带全局变量定义
      • 2.2 使用@value和mybatis进行全局变量的定义
      • 2.3 使用@value和mybatis进行全局变量的定义
  • 总结

    Mybatis mapper.xml使用全局变量

    一、概述

    开发中的遇到一个有关于统计需求,而这个需求需要根据两个数据库才能实现,而如果直接通过两个模块之间的交互也可以实现,但是这样一来,如果加入了搜索条件,而这搜索条件又分散在不同的库中,这样依赖数据处理起来就很复杂,而且还没有对数据进行有效的分页处理,考虑目前数据库都放再一台服务器中,还没有不同数据库放在不同服务器的需求,在sql中引入了库名。

    虽然引入了库名,对应的业务能跑起来了,但是也遇到过一个比较奇特的问题,也就是数据库中存在了同名的库,因为之前的sql中引入了库名,在不改变代码的情况下,直接修改配置文件和数据库的库名会导致引入了库名的sql无法使用,为此,引入了.xml文件中动态修改数据库库名的功能,具体的话通过mybatis的全局变量实现。

    二、实现方案

    经过摸索,大致的得到了三种实现方案

    2.1 mybaits自带全局变量定义

    在springboot中yml文件中加入如下全局变量配置

    mybatis:
      configuration:
        variables:
          myConfigName: "`base1`"

    然后再sql中

      <select id="selectTest" resultType="java.util.Map">
          select * from ${myConfigName}.table1
      </select>

    需要注意的是反引号 " ` ",如果不再库名上加上反引号,那么sql就无法顺利的跑起来,此外占位符要使用$,因为$才获取到全局变量

    这样,就可以动态的配置库名,但是这样的话,有一个缺点,无法设置默认值,如果myConfigName没有进行配置,那么这个sql就无法执行

    2.2 使用@value和mybatis进行全局变量的定义

    使用@value为java的一个成员变量复制,并且实则hi默认值,这样我们通过yml文件配置对应库名了

        /**
         * 数据库名称
         */
        public static String dataBaseName;
    	//注意引号
        @Value("${data-conf.dataBaseName:`test`}")
        private void setUserDataBaseName(String name){
            dataBaseName=name;
        }

    mapper定义和对应的sql调用

    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>

    这种方式解决了默认数据库名的问题,但是也存在一个问题,就是mapper的接口中多了数据库名作为参数,这种形参的设置看着很别扭。

    2.3 使用@value和mybatis进行全局变量的定义

    这种方式类似于上述2.2 的方案,只是他能减少mapper接口的不必要的数据库名形参,只要不去细看sql,一般情况,开发人员感受不到库名的动态配置

        /**
         * 数据库名称
         */
        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表达式子中不需要$占位符,而后续具体数据的位置需要展示位符号$,使用<chose>的原因一是为了保险,这样就是对应的变量的默认值丢失了,也能使用默认库,二是为了避免${}报变量过长的错

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持3672js教程。

    您可能感兴趣的文章:
    • MyBatis Mapper.xml入参List使用in函数问题
    • MyBatis Mapper.XML 标签使用小结
    • mybatis-config.xml文件中的mappers标签使用
    • Mybatis映射文件详解之mapper.xml文件
    • 修改SpringBoot 中MyBatis的mapper.xml文件位置的过程详解
    • Mybatis Mapper XML文件-插入,更新,删除详解(insert, update and delete)
    相关栏目:

    用户点评