Mybatis中<if>和<choose>的区别及“=”判断方式

 更新时间:2022年06月06日 14:09:13   作者:Simple_Demo  
这篇文章主要介绍了Mybatis中<if>和<choose>的区别及“=”判断方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

<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>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • JAVA面向对象设计宠物类方式

    JAVA面向对象设计宠物类方式

    本指南涉及JAVA面向对象的宠物类设计,包括宠物类的父类及其子类小猫类和小狗类,用户可以选择养猫或养狗,给宠物起名字,实现喂食互动,同时宠物具有饱食度和快乐度属性,适合初学者学习面向对象设计
    2024-10-10
  • 使用FeignClient设置动态Url

    使用FeignClient设置动态Url

    这篇文章主要介绍了使用FeignClient设置动态Url方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Spring使用注解实现Bean的自动装配

    Spring使用注解实现Bean的自动装配

    大家好,本篇文章主要讲的是Spring使用注解实现Bean的自动装配,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Spring AI Alibaba接入大模型时的依赖问题小结

    Spring AI Alibaba接入大模型时的依赖问题小结

    文章介绍了如何在pom.xml文件中配置SpringAI Alibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓库镜像设置为阿里云以提高下载速度,具体配置方法跟随小编一起学习下吧
    2025-02-02
  • 利用exe4j生成java的exe文件

    利用exe4j生成java的exe文件

    本文主要介绍了利用exe4j生成java的exe文件,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 利用注解配置Spring容器的方法

    利用注解配置Spring容器的方法

    本篇文章主要介绍了利用注解配置Spring容器的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • SpringBoot前后端传输加密设计实现方案

    SpringBoot前后端传输加密设计实现方案

    这篇文章主要给大家介绍了关于SpringBoot前后端传输加密设计实现方案的相关资料,包括数据加密方案、解密传输数据实现方案和响应数据加密实现方案,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-11-11
  • 如何在springMVC的controller中获取request

    如何在springMVC的controller中获取request

    这篇文章主要介绍了如何在springMVC的controller中获取request,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • java 装饰模式(Decorator Pattern)详解及实例代码

    java 装饰模式(Decorator Pattern)详解及实例代码

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装
    2016-10-10
  • IntellJ IDEA神器使用技巧(小结)

    IntellJ IDEA神器使用技巧(小结)

    这篇文章主要介绍了IntellJ IDEA神器使用技巧(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06

最新评论