mybatis mapper.xml中如何根据数据库类型选择对应SQL语句

目录
  • mapper.xml根据数据库类型选择对应SQL语句
    • 1、spring-database.xml文件中配置
    • 2、mapper.xml文件中配置
  • mapper.xml动态SQL语句用法
    • if
    • trim
    • where
    • set
    • choose(when、otherwise)
    • foreach

mapper.xml根据数据库类型选择对应SQL语句

1、spring-database.xml文件中配置

  <bean id="vendorProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
      <props>
        <prop key="DB2">db2</prop>
        <prop key="Oracle">oracle</prop>
        <prop key="MySQL">mysql</prop>
      </props>
    </property>
   </bean>
   <bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider">
    <property name="properties" ref="vendorProperties"/>
  </bean>

对于sessionFactory的配置,主要是标红的语句一定要有,其它按照自己原有的配置走。

<!-- sessionFactory 将spring和mybatis整合 -->
 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
 <property name="dataSource" ref="dataSource" />
 <property name="databaseIdProvider" ref="databaseIdProvider" />
 <property name="configLocation" value="classpath:mybatis-config.xml" />
 <property name="mapperLocations"
 value="classpath*:/com/sunyard/cop/IF/mybatis/mapping/*.xml" /> 
 <property name="plugins">
     <array>
       <bean class="com.github.pagehelper.PageInterceptor">
         <property name="properties">
           <!--使用下面的方式配置参数,一行配置一个,后面会有所有的参数介绍 -->
           <value>
         helperDialect=oracle
         reasonable=true
         supportMethodsArguments=true
         params=count=countSql
         autoRuntimeDialect=true 
       </value>
         </property>
       </bean>
     </array>
         </property>
 </bean>

2、mapper.xml文件中配置

    <select id="selectByUserNo" databaseId="mysql"   parameterType="java.lang.String" resultMap="UserResultMap">
 select * from SM_USERS_TB
    </select>
    <select id="selectByUserNo"  parameterType="java.lang.String" resultMap="UserResultMap">
 select * from SM_USERS_TB
    </select>

若写上databaseId = "mysql",则在数据源为mysql类型时,自动执行该SQL语句,若不写databaseId ,且同时存在相同ID的SQL语句,则只要是非mysql数据库的数据源,都会调用该条SQL语句。

mapper.xml动态SQL语句用法

用于实现动态SQL的元素主要有

if

用于判断  示例

<update id="upda" parameterType="User">
		update smbms_user
		<set>
                <!--修改时可以判断userCode是否是空的如果不为空就把数据库中这一列的值更改掉
                如果为空就不修改这一列数据库这一列的值也不会为Null-->
			<if test="userCode!=null and userCode!=''">
				userCode=#{userCode},
			</if>
			<if test="userName!=null and userName!=''">
				userName=#{userName},
			</if>
			<if test="userPassword!=null and userPassword!=''">
				userPassword=#{userPassword},
			</if>
			<if test="gender!=null and gender!=''">
				gender=#{gender},
			</if>
			<if test="phone!=null and phone!=''">
				phone=#{phone},
			</if>
			<if test="address!=null and address!=''">
				address=#{address},
			</if>
			<if test="userRole!=null and userRole!=''">
				userRole=#{userRole},
			</if>
			<if test="createdBy!=null and createdBy!=''">
				createdBy=#{createdBy},
			</if>
		</set>
		where id=#{id}
	</update>

trim

  • trim 属性 prefix suffix prefixOverrides suffixOverrides 更灵活地去除多余关键字 替代where和set
  • if+trim 使用if+trim替代if+set进行更新用户表数据,效果一样的 如下:
<update id ="modify" parameterType="User">
update smbms_user
<trim prefix="set" suffixOverrides="," suffix="where id = #{id}">
	<if test="userCode != null">userCode = #{userCode},</if>
	<if test="userName!= null">userCode = #{userName },</if>
	<if test="userPassword!= null">userPassword=#{userPassword },</if>
</trim>
</update>
 

其中:

  • prefix表示有一个if成立则插入where语句
  • suffix表示后缀,插入到最后,与perfix正好相反
  • suffixOverrides="xxx"表示如果最后生成的sql语句多一个xxx,则自动去掉
  • prefixOverrides的意思是去掉前缀,和suffixOverrides的使用正好相反

这里如果任意一个<if>条件为true,<trim>元素会插入WHERE,并且移除紧跟where后面的(and或or)

where

SELECT u.*,r.roleName,r.roleCode FROM smbms_user u INNER JOIN smbms_role r ON u.userrole=r.id
    <where>
            <!-- where相当于  select * from pet where id=1 中的where一样  -->
			<if test="usercode !=null and usercode !=''">
				AND userCode LIKE CONCAT('%',#{usercode},'%')
			</if>
			<if test="userrole!=0">
				AND userRole=#{userrole}
			</if>
			<if test="gender!=null and gender!=0">
				AND gender=#{gender}
			</if>
	</where>

set

<update id="upda" parameterType="User">
		update smbms_user
		<set><!-- 与修改时搭配使用我们修改set的sql语句的‘,'的最后一列会被自动省略 -->
			<if test="userCode!=null and userCode!=''">
				userCode=#{userCode},
			</if>
			<if test="userName!=null and userName!=''">
				userName=#{userName},
			</if>
			<if test="userPassword!=null and userPassword!=''">
				userPassword=#{userPassword},
			</if>
			<if test="gender!=null and gender!=''">
				gender=#{gender},
			</if>
			<if test="phone!=null and phone!=''">
				phone=#{phone},
			</if>
			<if test="address!=null and address!=''">
				address=#{address},
			</if>
			<if test="userRole!=null and userRole!=''">
				userRole=#{userRole},
			</if>
			<if test="createdBy!=null and createdBy!=''">
				createdBy=#{createdBy},
			</if>
		</set>
		where id=#{id}
	</update>

choose(when、otherwise)

相当于Java中switch语句 当when有条件满足的时候,就跳出choose

<choose>
	<when test ="条件1"> …</when>
	<when test ="条件2"> …</when>
	<when test ="条件3"> …</when>
	…
	<otherwise>…</otherwise>
</choose>	

foreach

迭代一个集合,通常用于in条件 属性 item index collection:必须指定 list array map-key open separator close

<select id="getUserName" resultType="User" parameterType="java.util.List">
		select * from smbms_user where userCode in
		<foreach collection="list" open="(" close=")" item="userCode" separator=",">
			#{userCode}
		</foreach>
	</select>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java的MyBatis框架中对数据库进行动态SQL查询的教程

    其实MyBatis具有的一个强大的特性之一通常是它的动态 SQL 能力. 如果你有使用 JDBC 或其他 相似框架的经验,你就明白要动态的串联 SQL 字符串在一起是十分纠结的,确保不能忘了空格或在列表的最后省略逗号.Mybatis中的动态 SQL 可以彻底处理这种痛苦.对于动态SQL,最通俗简单的方法就是我们自己在硬编码的时候赋予各种动态行为的判断,而在Mybatis中,用一种强大的动态 SQL 语 言来改进这种情形,这种语言可以被用在任意映射的 SQL 语句中.动态 SQL 元素和使用 JS

  • MyBatis 执行动态 SQL语句详解

    大家基本上都知道如何使用 MyBatis 执行任意 SQL,使用方法很简单,例如在一个 XXMapper.xml 中: <select id="executeSql" resultType="map"> ${_parameter} </select> 你可以如下调用: sqlSession.selectList("executeSql", "select * from sysuser where enabled

  • mybatis如何通过接口查找对应的mapper.xml及方法执行详解

    本文主要介绍的是关于mybatis通过接口查找对应mapper.xml及方法执行的相关内容,下面话不多说,来看看详细的介绍: 在使用mybatis的时候,有一种方式是 BookMapper bookMapper = SqlSession().getMapper(BookMapper.class) 获取接口,然后调用接口的方法.只要方法名和对应的mapper.xml中的id名字相同,就可以执行sql. 那么接口是如何与mapper.xml对应的呢? 首先看下,在getMapper()方法是如何操作

  • 详解Mybatis通用Mapper介绍与使用

    使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL.而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改.这工作量和效率的影响或许就是区别增删改查程序员和真正程序员的屏障.这时,通用Mapper便应运而生-- 什么是通用Mapper 通用Mapper就是为了解决单表增删改查,基于Mybatis的插件.开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删

  • mybatis mapper.xml中如何根据数据库类型选择对应SQL语句

    目录 mapper.xml根据数据库类型选择对应SQL语句 1.spring-database.xml文件中配置 2.mapper.xml文件中配置 mapper.xml动态SQL语句用法 if trim where set choose(when.otherwise) foreach mapper.xml根据数据库类型选择对应SQL语句 1.spring-database.xml文件中配置   <bean id="vendorProperties" class="or

  • MyBatis Mapper.xml中的命名空间及命名方式

    目录 Mapper.xml相关使用 命名空间(Namespaces) 命名解析 MyBatis中mapper.xml命名空间错误 项目场景 问题描述 原因分析 解决方案 Mapper.xml相关使用 命名空间(Namespaces) 命名空间(Namespaces) 在之前版本的MyBatis中是可选的,这样容易引起混淆因此毫无益处.现在命名空间则是必须的,且易于简单地用更长的完完全限定名来隔离语句. 命名空间使得你所见到的接口绑定成为可能,尽管你觉得这些东西未必用得上,你还是应该遵循这里的规定

  • mybatis的mapper.xml中resultMap标签的使用详解

    1.前言 最近博主在做一个ssm框架的共享汽车管理系统,其中,数据库字段设计的有下划线方式,a_username,然后在写mapper.xml里面的sql语句的时候,一直出现查询语句查询的值为null的情况.或者是resultMap标签和驼峰规则不太明白的同学,可以看这里. 于是顺便梳理一下. 2.关于resultMap 2.1.什么是resultMap? 在mybatis中有一个resultMap标签,它是为了映射select查询出来结果的集合,其主要作用是将实体类中的字段与数据库表中的字段进

  • 浅谈mybatis mapper.xml文件中$和#的区别

    #{}表示一个占位符即?,可以有效防止sql注入.在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc类型的转换. #{}可以接收简单类型值或pojo属性值,如果传入简单类型值,#{}括号中可以是任意名称. <!-- 根据名称模糊查询用户信息 --> <select id="findUserById" parameterType="String" resultType="user"> select

  • 解决Mybatis映射文件mapper.xml中的注释问题

    目录 Mybatis映射文件mapper.xml的注释问题 报错信息 解决办法 mapper.xml文件中的注释 注释方式 ‘无效的列索引’bug和解决 小结一下 Mybatis映射文件mapper.xml的注释问题 从昨天夜晚9点到今天中午,一直被项目bug所困惑,中间这段时间一直未解决这个问题,也咨询很多群里大佬,也未能解决 有的说是我代码写的有问题,如mapper文件中没有写入参数类型parameterType,也有说是我项目结构目录构建出错,按照他们的建议进行修正,也是未尽人意,启动项目

  • Mybatis的mapper.xml中if标签test判断的用法说明

    目录 mapper.xml中if标签test判断的用法 1. 字符串等于条件的两种写法 2. 非空条件的判断 3. 判断数组是否包含某个元素 mapper.xml <if test>书写时候的一些坑 1. 分页 2. 字符串形式的数据比较 mapper.xml中if标签test判断的用法 1. 字符串等于条件的两种写法 ① 将双引号和单引号的位置互换 <if test=' testString != null and testString == "A" '>  

  • Mybatis sqlMapConfig.xml中的mappers标签使用

    目录 sqlMapConfig.xml中的mappers标签 mappers(映射配置) 1.1:通过resource加载单个映射文件 1.2:通过mapper接口加载单个映射文件 1.3:批量加载mapper(推荐使用) sqlmapconfig核心标签说明以及配置 配置项详解 配置示例 sqlMapConfig.xml中的mappers标签 mappers(映射配置) 1.1:通过resource加载单个映射文件 < !– 加载映射文件 –> < mappers> < !

  • IDEA mybatis Mapper.xml报红的最新解决办法

    现象 在IDEA中已经配置好Database了,但是打开mybatis的Mapper.xml中的字段还是报红.如下 : 随便不影响程序运行,但是非常的不舒服.智能提示也不好用. 解决办法 File -> Settings->Lanuages & Frameworks-> SQL Dialects在Global SQL Dialect:或者Project SQL Dialect:中选择正确的数据库. 比如:我这里默认是Microsoft SQL Server,只要修改成我项目中使用

  • mybatis mapper.xml 注释带参数的坑及解决

    目录 mybatis mapper.xml 注释带参数的坑 mybatis的xml中注释需谨慎 报错内容 小结一下 mybatis mapper.xml 注释带参数的坑 最近做一个很简单的统计项目,统计的逻辑产品一直改版,为了便于之后产品返回的时候快速的切换回老版本的逻辑,就给之前的sql注释了直接在下面写了新的sql,注释的时候一般我都习惯性的选中之后Ctrl+/利用编辑器自带的自动注释功能,这个时候编辑器是分两种情况的:情况一是你之前老的sql没有类似<where>这样带特殊尖括号的语句,

  • mybatis mapper.xml 区间查询条件详解

    目录 mybatis mapper.xml 区间查询条件 对 null 和 " 分开进行判断 tk mybatis通用mapper,复杂and or条件查询 方式1:Weekend语法 方式2:通用example语法 mybatis mapper.xml 区间查询条件 对 null 和 " 分开进行判断 <select id="selectByExample" resultMap="BaseResultMap" parameterType=

随机推荐