mybatis的 choose -- when test -- otherwise 标签和 if test 标签的区别

24 篇文章 0 订阅

1.choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。 

当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。例如下面例子,同样把所有可以限制的条件都写上,方面使用。choose会从上到下选择一个when标签的test为true的sql执行。安全考虑,我们使用where将choose包起来,放置关键字多于错误。

<!--  choose(判断参数) - 按顺序将实体类 User 第一个不为空的属性作为:where条件 -->  
<select id="getUserList_choose" resultMap="resultMap_user" parameterType="com.yiibai.pojo.User">  
    SELECT *  
      FROM User u   
    <where>  
        <choose>  
            <when test="username !=null ">  
                u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%')  
            </when >  
            <when test="sex != null and sex != '' ">  
                AND u.sex = #{sex, jdbcType=INTEGER}  
            </when >  
            <when test="birthday != null ">  
                AND u.birthday = #{birthday, jdbcType=DATE}  
            </when >  
            <otherwise>  
            </otherwise>  
        </choose>  
    </where>    
</select>  

2.if-test 不会跳出判断语句

2.1 if-test标签判断语法: 
@see http://blog.csdn.net/z69183787/article/details/51589171 
用==判断时应写成

<if test='type=="y"'>  
    and status = 0   
</if>  
  • 1
  • 2
  • 3

而不是

<if test="type=='y'">  
    and status = 0   
</if>  
  • 1
  • 2
  • 3

mybatis是使用的OGNL表达式来进行解析的,在OGNL的表达式中,’y’会被解析成字符,因为java是强类型的,char 和 一个string 会导致不等。所以if标签中的sql不会被解析。具体的请参照 OGNL 表达式的语法


转载自:https://blog.csdn.net/sinat_34814635/article/details/78465631

MyBatis中的`<choose>`和`<if>`标签都可以用于动态SQL语句的编写,但是它们的使用场景不同。 - `<if>`标签用于单条件判断,根据条件是否成立动态生成SQL语句片段,通常用于简单的条件判断,例如: ```xml <select id="getUserByName" parameterType="string" resultType="User"> SELECT * FROM user WHERE <if test="name != null"> name = #{name} </if> </select> ``` 当传入参数name不为null时,SQL语句会动态生成为`SELECT * FROM user WHERE name = #{name}`,否则会忽略该条件。 - `<choose>`标签相当于Java中的`switch`语句,可以根据多个条件中的一个来生成SQL语句片段。`<choose>`标签下可以有多个`<when>`标签和一个`<otherwise>`标签,每个`<when>`标签都有一个`test`属性用于表示条件是否成立,只有第一个符合条件的`<when>`标签会被执行,如果所有的`<when>`标签都不符合条件,则会执行`<otherwise>`标签中的内容。例如: ```xml <select id="getUserByCondition" parameterType="map" resultType="User"> SELECT * FROM user WHERE <choose> <when test="name != null"> name = #{name} </when> <when test="age != null"> age = #{age} </when> <otherwise> 1=1 </otherwise> </choose> </select> ``` 当传入参数中有name时,SQL语句会动态生成为`SELECT * FROM user WHERE name = #{name}`;当传入参数中有age时,SQL语句会动态生成为`SELECT * FROM user WHERE age = #{age}`;当传入参数中既没有name也没有age时,SQL语句会动态生成为`SELECT * FROM user WHERE 1=1`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值