2016年8月28日 每周一篇博客
在项目中xml文件经常会遇到在判断等于某个值时加什么条件不等于某个值的时候加什么条件,比如下面这个例子:
<if test=" name != null">
AND T.NAME = #{NAME,jdbcType=VARCHAR}
</if>
<if test=" name = null">
ORDER BY NAME,ID
</if>
上面这个例子是一个错误的写法不可以这样用。
正确的需要引入<choose>标签
<choose>
<when test=" name != null">
AND T.NAME = #{NAME,jdbcType=VARCHAR}
</when>
<otherwise>
ORDER BY T.PRODUCT_TYPE_CODE, T.SORT DESC, T.CREATE_TIME
</otherwise>
</choose>
第一种错误写法导致的结果就是不会去做任何判断即使name不为空。为什么只能用<choose>标签,源码还没有研究,或者我这个例子本身就有问题现在记录下来,在后续的更新中我会再次总结一下这个问题。
2.
<!--错误的写法-->
<if test="newsImage != null and newsImage == 'y'">
<![CDATA[ and len(newsImage) > 0 ]]>
</if>
<!-- 正确的,稳定,推荐使用 -->
<if test="newsImage != null and newsImage == 'y'.toString()">
<![CDATA[ and len(newsImage) > 0 ]]>
</if>
判断 newsImage == 'y' 时,有人认为成功,但实际上是不成功的,需要改为 newsImage == 'y'.toString()方可成功,原因具体没
有细入研究,根据实际使用推测应该是 “等于” 在java中是个比较复杂问题,涉及的“等于”有可能是变量地址相等,或者是变量值内
容相等,在XML文件中简单的 == 在经过MyBatis处理后无法判断是哪种类型的“相等”,所以加.toString()做强制转换操作,MyBatis
就知道是值内容的比较,当然就成功了;注意这个常量不限于数字,对于字母,如 'y' 同样需要加上 .toString()方可成功。