Mybatis动态SQL第二篇–>>if判断
在实际应用中使用mybatis的if标签是很有必要的,举个最简单的栗子,实现过数据库更新数据记录功能的同学应该知道有这样一个场景:数据保存功能,数据初始化完成后一般都有再次编辑数据的功能,有人说了功能有什么可说的简单至极,其实不然(我刚入行的时候也是这样想的).一般就是使用paramPOJO接收参数,然后在后台处理一下直接在dao层更新数据就完了,但是有个问题,如果用户编辑时只填写了一部分数据,后台接收并更新,你会发现用户未填写的数据变成了空null,但是大部分时候我们的需求是若用户未填写的部分则数据库中的数据保持不变,这时候就有一种方式来处理那就是在mybatis的SQL映射文件使用if动态SQL进行判断.虽然很简单但是这样就使得我们的程序更加健壮了,何乐而不为.
栗子
用户(省略了setter与getter方法)
public class person{
private Integer personId;
private String name;
private Integer sex;
}
更新用户
<update id="updatePersonById" parameterType="com.flydoging.Person">
update person p set
<if test="name != null and name != ''">
p.name = #{name},
</if>
<if test="sex != null ">
p.sex = #{sex}
</if>
</select>
上述代码可以理解为:若name不为null且不为空字符串(注意第一个表达式末尾的",",不能省略否则报错),则更新该字段;若sex不为null,则更新该字段.基本用法就这些,当然你也可以在if标签中进行花里胡哨的判断,但是不建议将太多的逻辑写在SQL中.
下面看看各种类型数据在if标签中的使用
数值判断
<if test="personid != null"></if>// 数值非空判断
<if test="personid != null and personid > 0"></if>// 数值大小判断,注意关系运算符>/>=可以直接使用
<if test="personid != null and personid lt 0"></if>// </<=不能直接使用(报错),需要使用lt/lte代替
字符串判断
<if test="name != null"></if>// 字符串非null判断
<if test="name != null and name != ''"></if>// 字符串非空(长度为0)判断.and表示逻辑与,与"&&"同意但是"&&"在这里不能使用;类似的or表示逻辑或
<if test="name != null and name.indexOf('flydoging') != -1"></if>// 判断字符串是否包含某些字符串
<if test="name != null and name == 'flydoging'">/<if test="name != null and name eq 'flydoging'"></if>// 判断字符串是否是某个字符串
注意:参数类型为非字符串类型使用name == 'flydoging'是有问题的,需要将name转为String类型即:
<if test="name != null and name.toString() == 'flydoging'.toString()"></if>
list/map集合
<if test="list != null and list.size() > 0"></if>// 集合非空判断