MyBatis动态SQL

这段时间在学习MyBatis的基础知识,所以想做个记录以便以后查阅。

Mybatis中的动态SQL语句(常用)

<if>

判断语句,用于单条件分支判断

1
2
3
4
5
6
7
8
9
10
<select id="findCustomerByNameAndJobs" parameterType="Customer" resultType="Customer">
select * from t_customer
where 1=1
<if test="username != null and username != ''">
and username like concat('%', #{username}, '%')
</if>
<if test="jobs != null and jobs != ''">
and jobs = #{jobs}
</if>
</select>

使用<if>元素的test属性分别对usernamejobs进行了非空判断(test属性多用于条件判断语句中,用于判断真假,大部分的场景中都是进行非空判断,有时候也需要判断字符串、数字和枚举等),如果传入的查询条件非空就进行动态SQL组装。

<choose>,<when>,<otherwise>

相当于Java中的switch...case...default语句,用于多条件分支判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<select id="findCustomerByNameOrJobs1" parameterType="Customer" resultType="Customer">
select * from t_customer
where 1=1
<choose>
<when test="username != null and username != ' '">
and username like concat('%', #{username}, '%')
</when>
<when test="jobs != null and jobs != ' '">
and jobs = #{jobs}
</when>
<otherwise>
and phone is not null
</otherwise>
</choose>
</select>

使用<choose>元素进行SQL拼接,当一个<when>元素中的条件为真,则动态组装第一个<when>元素内的SQL片段,斗则就继续乡下判断第二个<when>元素中的条件是否为真,以此类推。当前面所有when元素中的条件都不为真时,则只组装<otherwise>元素内的SQL片段。

<where>,<trim>,<set>

辅助元素,常用于处理一些SQL拼装、特殊字符问题

<where>

1
2
3
4
5
6
7
8
9
10
11
<select id="findCustomerByNameOrJobs2" parameterType="Customer" resultType="Customer">
select * from t_customer
<where>
<if test="username != null and username != ' '">
and username like concat('%', #{username}, '%')
</if>
<if test="jobs != null and jobs != ' '">
and jobs = #{jobs}
</if>
</where>
</select>

使用<where>元素对“where 1=1”条件进行了替换,<where>元素会自动判断组合条件下拼装的SQL语句,只有<where>元素内的条件成立时,才会在拼接SQL中加入where关键字,否则将不会添加;即使where之后的内容有多余的“AND”或“OR”,<where>元素也会自动将他们去除。

<trim>

1
2
3
4
5
6
7
8
9
10
11
<select id="findCustomerByNameOrJobs3" parameterType="Customer" resultType="Customer">
select * from t_customer
<trim prefix="where" prefixOverrides="and">
<if test="username != null and username != ' '">
and username like concat('%', #{username}, '%')
</if>
<if test="jobs != null and jobs != ' '">
and jobs = #{jobs}
</if>
</trim>
</select>

使用<trim>元素对“where 1=1”条件进行替换,<trim>元素的作用时取出一些特殊的字符串,他的prefix属性代表的是语句的前缀(这里使用where来连接后面的SQL片段),而prefixOverrides属性代表的是需要去除的那些特殊字符串(这里定义了要去除SQL中的and),上面的写法和使用<where>元素基本是等效的。

<set>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<update id="updateCustomer2" parameterType="Customer">
update t_customer
<set>
<if test="username != null and username != ' '">
username = #{username},
</if>
<if test="jobs != null and jobs != ' '">
jobs = #{jobs},
</if>
<if test="phone != null and phone != ' '">
phone = #{phone},
</if>
</set>
where id = #{id}
</update>

在使用<set>元素进行字段信息更新时,要确保传入的更新字段不能都为空

使用<set><if>元素相结合的方式来组装update语句。其中<set>元素会动态前置SET关键字,同时也会消除SQL语句中最后一个多余的逗号;<if>元素用于判断相应的字段是否传入值,如果传入的更新字段非空,就将此字段进行动态SQL组装,并更新此字段,否则此字段不执行更新。

<foreach>

循环语句,常用于in语句等列举条件中

1
2
3
4
5
6
7
<select id="findCustomerByIds" parameterType="List" resultType="Customer">
select * from t_customer
where id in
<foreach collection="list" item="id" index="index" open="(" separator="," close=")">
#{id}
</foreach>
</select>

使用<foreach>元素对传入的集合进行遍历并进行了动态SQL组装。

属性描述:

  • item: 循环中的当前元素
  • index: 当前元素在集合的位置下标
  • collection: 传递过来的参数类型(首字母小写),它可以是一个array、list(或collection)、Map集合的键、POJO包装类中数组或集合类型的属性名等。
  • open和close: 以什么符号将这些集合元素包装起来
  • separator: 各个元素之间的间隔符

<bind>

从OGNL表达式中创建一个变量,并将其绑定到上下文,常用于模糊查询的sql中

1
2
3
4
5
<select id="findCustomerByName2" parameterType="String" resultType="Customer">
<bind name="pattern_username" value="'%'+_parameter.getUsername()+'%'"/>
select * from t_customer
where username like #{pattern_username}
</select>

使用<bind>元素定义一个name为pattern_username的变量,<bind>元素中的value的属性值就是拼接的查询字符串,其中_parameter.getUsername()表示传递进来的参数(也可以直接写成对应的参数变量名,如username)。在SQL语句中,直接引用<bind>元素的name属性值即可进行动态SQL组装。

文章作者: XIAO
文章链接: http://yoursite.com/2019/10/07/MyBatis动态SQL/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 XIAO
微信打赏
支付宝打赏