Mybatis中<if>和<choose>的区别及“=”判断方式
短信预约 -IT技能 免费直播动态提醒
<if>和<choose>的区别及“=”判断
在项目中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>标签,源码还没有研究,或者我这个例子本身就有问题现在记录下来,在后续的更新中我会再次总结一下这个问题。
<!--错误的写法-->
<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()方可成功。
Mybatis选择choose和条件if用法
choose用法
<choose>
<when test="showType == 1">
IFNULL(k.fname,'未知') as pro_name,
</when>
<when test="showType == 2">
IFNULL(e.fname,'未知') as business_name,
</when>
<when test="showType == 3">
IFNULL(f.fname,'未知') as area_name,
</when>
<when test="showType == 4">
IFNULL(h.fname,'未知') as sale_name,
</when>
<otherwise>
IFNULL(j.F_PJQD_XMDJ,'未知') as project_type,
</otherwise>
</choose>
if用法
<if test="businessName != null and businessName != ''">
and e.fname = #{businessName}
</if>
<if test="areaName != null and areaName != ''">
and f.fname = #{areaName}
</if>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341