MyBatis的9种动态标签详解

作者:chenzm666666 时间:2021-06-21 19:03:40 

前言

MyBatis提供了9种动态SQL标签:trim、where、set、foreach、if、choose、when、otherwise、bind;
其执行原理为,使用OGNL从SQL参数对象中计算表达式的值,根据表达式的值动态拼接SQL,以此来完成动态SQL的功能。

动态标签用法

1.if

If : 当参数满足条件才会执行某个条件


<select id="findName" resultType="String">
 SELECT stu.name FROM tab_stu stu WHERE age = 20
 <if test="name != null">
   AND name like #{name}
 </if>
</select>

2.choose、when、otherwise

choose、when、otherwise : choose标签是按顺序判断其内部when标签中的test条件是否成立,如果有一个成立,则choose结束;如果所有的when条件都不满足时,则执行otherwise中的SQL。类似于java的switch语句。


<select id="findName" resultType="String">
 SELECT stu.name FROM tab_stu stu WHERE age = #{age}
<choose>
 <when test="name != null">
   AND name like #{name}
</when>
<when test="class != null">
AND class like #{class}
</when>
<otherwise>
AND class = 1
</otherwise>
 </choose>
</select>

3.where


<select id="findName" resultType="String">
 SELECT stu.name FROM tab_stu stu WHERE
<if test="age != null">
age = #{age}
</if>
<if test="name!= null">
AND name= #{name}
</if>
<if test="class!= null">
AND class = #{class}
</if>
</select>

当第一个if不满或第一第二第三个if都不满足,会出现以下情况


SELECT stu.name FROM tab_stu stu WHERE AND name = "小米" AND class ="1班”;
SELECT stu.name FROM tab_stu stu WHERE;

这会导致查询失败。使用where标签可以解决这个问题


<select id="findName" resultType="String">
 SELECT stu.name FROM tab_stu stu
<where>
<if test="age != null">
age = #{age}
</if>
<if test="name!= null">
AND name= #{name}
</if>
<if test="class!= null">
AND class = #{class}
</if>
</where>
</select>

where标签会在只有一个以上的if条件满足的情况下才去插入WHERE关键字,而且,若最后的内容是”AND”或”OR”开头的,where也会根据语法绝对是否需要保留。

4.set

set标签用于解决动态更新语句存在的符号问题


<update id="updateStu">
Update tab_stu
<set>
<if test="name != null"> name=#{name},</if>
<if test="age != null"> age=#{age},</if>
<if test="class != null"> class=#{class},</if>
<if test="subject != null"> subject=#{subject}</if>
</set>
</update>

set标签会动态前置SET关键字,同时也会消除无关的逗号,因为用了条件语句后,可能就会在生成的赋值语句的后面留下逗号。

5.trim

trim:trim标签可实现where/set标签的功能
Trim标签有4个属性,分别为prefix、suffix、prefixOverrides、suffixOverrides
prefix:表示在trim标签包裹的SQL前添加指定内容
suffix:表示在trim标签包裹的SQL末尾添加指定内容
prefixOverrides:表示去掉(覆盖)trim标签包裹的SQL指定首部内容,去掉多个内容写法为and |or(中间空格不能省略)(一般用于if判断时去掉多余的AND |OR)
suffixOverrides:表示去掉(覆盖)trim标签包裹的SQL指定尾部内容(一般用于update语句if判断时去掉多余的逗号)


<select id="findName" resultType="String">
 SELECT stu.name FROM tab_stu stu
<trim prefix="where" prefixOverrides="and |or">
<if test="age != null">
age = #{age}
</if>
<if test="name!= null">
AND name= #{name}
</if>
<if test="class!= null">
OR class = #{class}
</if>
</trim>
</select>

<update id=”updateStu”>
Update tab_stu
<trim prefix="set" subfix="where id=#{id}" suffixOverrides=",">
<if test="name != null"> name=#{name},</if>
<if test="age != null"> age=#{age},</if>
<if test="class != null"> class=#{class},</if>
<if test="subject != null"> subject=#{subject}</if>
</trim>
</update>

6.foreach

foreach:对集合进行遍历


<select id="findName" resultType="String">
SELECT stu.name FROM tab_stu stu where id in
<foreach item=”item” index=”index” collection=”listName” open=”(” separator=”,” close=”)”>
#{item}
</foreach>
</select>

下面是foreach标签的各个属性:
collection:迭代集合的名称,可以使用@Param注解指定,该参数为必选(java入参,相对于#{listName})
item:表示本次迭代获取的元素,若collection为List、Set或数组,则表示其中元素;若collection为Map,则代表key-value的value,该参数为必选
index:在List、Set和数组中,index表示当前迭代的位置,在Map中,index指元素的key,该参数是可选项
open:表示该语句以什么开始,最常使用的是左括弧”(”,MyBatis会将该字符拼接到foreach标签包裹的SQL语句之前,并且只拼接一次,该参数是可选项
close:表示该语句以什么结束,最常使用的是右括弧”)”,MyBatis会将该字符拼接到foreach标签包裹的SQL语句末尾,该参数是可选项
separator:MyBatis会在每次迭代后给SQL语句添加上separator属性指定的字符,该参数是可选项

7.bind

bind:bind标签可以从OGNL(对象图导航语言)表达式中创建一个变量并将其绑定到上下文
Mybatis中使用Mysql的模糊查询字符串拼接(like) 中也涉及到bind的使用


<select id="findName" resultType="String">
 SELECT stu.name FROM tab_stu stu
<where>
<if test="name!= null">
<bind name="stuName" value="'%'+stuName+'%'">
name like #{stuName}
</if>
</where>
</select>

来源:https://blog.csdn.net/m0_46084322/article/details/121884835

标签:MyBatis,标签,sql
0
投稿

猜你喜欢

  • C#实现单词本功能

    2021-11-06 13:08:23
  • 详解Spring Boot 属性配置和使用

    2023-01-20 02:02:22
  • c# HttpClient设置超时的步骤

    2023-05-07 10:42:29
  • Java上传文件进度条的实现方法(附demo源码下载)

    2023-06-06 11:06:16
  • c#构造初始化的顺序浅析

    2022-10-13 22:14:34
  • flutter material widget组件之信息展示组件使用详解

    2023-06-22 08:45:35
  • Android ToggleButton 详解及实例代码

    2022-09-11 03:58:02
  • java 高并发中volatile的实现原理

    2022-11-24 19:58:22
  • C# 获取动态key的json对象的值案例

    2023-03-03 22:02:08
  • WPF TextBox和PasswordBox添加水印

    2021-09-30 16:06:02
  • 深入理解Java序列化与反序列化

    2023-01-24 00:27:53
  • Java输出打印工具类封装的实例

    2022-06-18 10:02:27
  • Android解析json数组对象的方法及Apply和数组的三个技巧

    2023-04-11 11:52:56
  • C#实现读取注册表监控当前操作系统已安装软件变化的方法

    2022-01-04 08:07:04
  • Android实现未读消息小红点显示实例

    2022-05-18 07:57:27
  • C#仿QQ实现简单的截图功能

    2021-10-11 16:43:15
  • Jenkins自动化打包为war包

    2021-08-08 20:25:49
  • Java实现map转换成json的方法详解

    2022-09-09 12:26:03
  • Android聊天工具基于socket实现

    2021-12-06 04:40:01
  • SpringBoot整合jersey的示例代码

    2021-08-28 05:23:12
  • asp之家 软件编程 m.aspxhome.com