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

目录
  • <if>和<choose>的区别及“=”判断
    • 正确很好的写法需要引入<choose>标签
    • <!--错误的写法-->
  • Mybatis选择choose和条件if用法
    • choose用法
    • if用法

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

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

(0)

相关推荐

  • mybatis中<choose>标签的用法说明

    目录 choose标签用法 choose动态用法 choose标签用法 choose 标签是按顺序判断其内部 when 标签中的 test 条件出否成立,如果有一个成立,则 choose 结束. 当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql.otherwise 也可以不写. choose动态用法 choose有时候我们不想应用所有的条件,而是想从多个条件中选择一个(满足第一个填写的条件,即使传入了多个参数) 如果昵称不为空,加一个昵称的条件 如果性

  • Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解

    动态SQL就是动态的生成SQL. if标记 假设有这样一种需求:查询用户,当用户名不等于"admin"的时候,我们还需要密码为123456. 数据库中的数据为: MyBatisConfig.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

  • Mybatis choose when用法实例代码

    mybatis choose when的用法实现代码如下所示: mapper.xml: <select id="query" resultType="map" parameterType="map"> select <choose> <when test="cityId == '00' "> a.city_id as CITYID, </when> <otherwise&g

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

    目录 <if>和<choose>的区别及“=”判断 正确很好的写法需要引入<choose>标签 <!--错误的写法--> Mybatis选择choose和条件if用法 choose用法 if用法 <if>和<choose>的区别及“=”判断 在项目中xml文件经常会遇到在判断等于某个值时加什么条件不等于某个值的时候加什么条件 比如下面这个例子: <if  test=" name != null">   

  • Mybatis中#{}和${}传参的区别及#和$的区别小结

    最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 select * from table where name = '小李',就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果

  • MyBatis中resultMap和resultType的区别详解

    总结 基本映射 :(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功.(数据库,实体,查询字段,这些全部都得一一对应)高级映射 :(resultMap) 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系.(高级映射,字段名称可以不一致,通过映射来实现 resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些

  • mybatis中${}和#{}取值的区别分析

    mybatis作为一个轻量级的ORM框架,应用广泛,其上手使用也比较简单:一个成熟的框架,必然有精巧的设计,值得学习. 在使用mybatis框架时,在sql语句中获取传入的参数有如下两种方式: ${paramName} #{paramName} 那如何理解这两种传参方式呢?如下带你走近背后的奥义. 先来回顾下原生Jdbc查询: public static void main(String[] args) throws Exception { // sql语句 String sql = "sele

  • Mybatis中${param}与#{param}的区别说明

    目录 ${param}与#{param}的区别 Mybatis中#{}与${}使用总结 #{ }与${ }的区别 使用总结 ${param}与#{param}的区别 ${param}表达式主要用户获取配置文件数据,DAO接口中的参数信息,当 $ 出现在映射文件的 SQl 语句中时创建的不是预编译的 SQL ,而是字符串的拼接有可能会导致 SQL 注入的问题,所以一般使用 $ 接收 DAO 参数时,这些参数一般是字段名,表名等.例如 order by {column} #{param} 表达式主要

  • 详解MyBatis中主键回填的两种实现方式

    主键回填其实是一个非常常见的需求,特别是在数据添加的过程中,我们经常需要添加完数据之后,需要获取刚刚添加的数据 id,无论是 Jdbc 还是各种各样的数据库框架都对此提供了相关的支持,本文我就来和和大家分享下数据库主键回填在 MyBatis 中的两种实现思路. 原生写法 框架来源于我们学过的基础知识,主键回填实际上是一个在 JDBC 中就被支持的写法,有的小伙伴可能不知道这一点,因此这里我先来说说在 JDBC 中如何实现主键回填. JDBC 中实现主键回填其实非常容易,主要是在构造 Prepar

  • Mybatis中resultMap标签和sql标签的设置方式

    目录 resultMap标签和sql标签的设置 1.项目目录 2.数据库中的表的信息 3.配置文件的信息 4.User类 5.IUserDao接口 6.MybatisTest 7.运行结果 resultMap标签的使用规则 自定义结果映射规则 association联合查询 使用association进行分布查询 collection分步查询 resultMap标签和sql标签的设置 1.项目目录 2.数据库中的表的信息 3.配置文件的信息 1.SqlMapConfig.xml文件 <?xml

  • MyBatis中使用$和#所遇到的问题及解决办法

    在上篇文章给大家介绍了Mybatis中#{}和${}传参的区别及#和$的区别小结,如果大家有需要可以参考下. $和#简单说明: #相当于对数据 加上 双引号,$相当于直接显示数据. 一.总结 mybatis中使用sqlMap进行sql查询时,经常需要动态传递参数.动态SQL是mybatis的强大特性之一,也是它优于其他ORM框架的一个重要原因.mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态SQL进行处理的.在动态 SQL 解析

  • 详解mybatis中的if-else的嵌套使用

    目录 案例一:if-else 案例二:if嵌套 MyBatis中if和choose的嵌套 案例一:if-else 在mybatis的使用过程中,难免会存在使用if-else的逻辑,但是实际是没有这种语法的,提供了choose标签来替代这种语法 <select id="selectUserByState" resultType="com.bz.model.entity.User"> SELECT * FROM user WHERE 1=1 <choo

  • 浅谈mybatis中的#和$的区别 以及防止sql注入的方法

    mybatis中的#和$的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 2. $将传入的数据直接显示生成在sql中.如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的

随机推荐