一.if 标签的普通用法
SELECT * FROM a where 1=1
<if test='id != null and id != ""'>
and id = #{id}
</if>
代码简单讲解:
1)if标签的test属性必填,该属性值是一个符合OGNL要求的判断表达式,一般只用true或false作为结果。
2)判断条件property != null 或 property == null,适用于任何类型的字段,用于判断属性值是否为空。
3)判断条件property != "" 或 property == "",仅适用于String类型的字段,用于判断是否为空字符串。
4)当有多个判断条件时,使用and或or进行连接,嵌套的判断可以使用小括号分组,and相当于Java中的与(&&),or相关于Java中的或(||)。
所以上面代码的意思就是先判断id是否为null,然后再判断id是否为空字符串,如果不为null和空,那么就执行 id = #{id}这个条件。
二.if 标签里加变量
在if标签里,除了null和数字(如1,99,77.452)以外,只要其他的元素只要没有被""或者''包住,那么就会被看做是一个变量.
如下面的代码 id 和 uuuu都被认做是变量. mybatis会调get方法去get它们的值,
SELECT * FROM a where 1=1
<if test='id != null and id != uuuu'>
and id = #{id}
</if>
下面的代码给id 和 uuuu 赋值.
(试验得知,给变量赋值int 类型和string类型都可以,mybatis有隐式转换,会把所有类型的值全部转换成string类型再去进行比较)
Student stu = new Student();
stu.setId("1");
stu.setUuuu("2");
List<HashMap<String, Object>> hashMaps = utimeeMapper.SelectList01(stu);
给id 赋了 "1", 给uuuu赋了 "2", 那么if标签成立, 就会去执行 id = #{id}这个条件
三.if 标签外面用双引号""包裹和用单引号''包裹的区别
情况一: 给type赋值为"1"或1.
<if test = " TYPE == '1' "> 这里的SQL并不能执行 </if>
因为 mybatis
使用的是ognl
表达式。 会把 1 解析为一个字符!!! 而不是字符串。
所以mybatis
在比较的时候一直认为字符串"1"不等于字符'1',所以结果一直都是 false。
解决办法
1、 转换为字符串进行比较
<if test = " TYPE == '1' .toString()"> 转换为字符串进行比较 </if>
2、 使用双引号 “”
<if test = ‘TYPE == "1" ’> 转换为字符串进行比较 </if>
情况二: 给type赋值为"你".
<if test = " TYPE == '你' "> 程序运行会直接报错 </if>
程序运行会直接报错For input string: "你", 意思就是char类型的'你'不能被转换成string类型.
解决办法:if标签外层用单引号包裹
<if test = ' TYPE == "你" '> 程序正常运行可以进来 </if>
总结,如果遇到<if>标签里面要判断字符串比较的,那么建议采用第二种方法,就是最外面使用单引号
因此,建议用if标签的时候外面全部选择用单引号包裹.省事多了.