zoukankan      html  css  js  c++  java
  • MyBatis使用动态SQL标签的小陷阱

      现在MyBatis越来越受大家的喜爱了,它的优势大家都知道,我就不多说了,直接说重点。

      MyBatis中提供动态SQL功能,我们可以使用<if><when><where><otherwise><foreach>等等,这样我们就可以写出根据条件生成的动态SQL了,但是,在这中间,我们经常用到的<if>标签有一个小误区,一不小心就会掉下去,下面先举个正常的例子:

    <select id="findActiveBlogWithTitleLike" 
         parameterType="Blog" resultType="Blog">
      SELECT * FROM BLOG 
      WHERE state = ‘ACTIVE’ 
      <if test="title != null">
        AND title like #{title}
      </if>
    </select>

      在上面的例子中,当title不等于null时,<if>标签中间的条件才会被拼接上,这样,SQL语句就是动态的了。

      但是,当我们对所有条件进行判断时,你是否会这样写:

    <select id="findActiveBlogWithTitleLike" 
         parameterType="Blog" resultType="Blog">
      SELECT * FROM BLOG 
      WHERE
      <if test="userId != null">
         state = ‘ACTIVE’ 
      </if>
    
      <if test="title != null">
        AND title like #{title}
      </if>
    </select>

      没问题吧?至少语法上不错的,至少它可以正常生成一个SQL。

      但是,不知道你注意到了没,当所有条件都为null的时候,会出现什么情况?

    SELECT * FROM BLOG 
      WHERE

      看到了吧?这样的SQL能成功执行么?

      答案当然是NO。

      那么该怎么办?那就要记住了,当你写动态SQL时候,先考虑一下会不会产生所有条件都不成立的情况,会不会出现只有一个WHERE而没有条件的情况,那么你要做的就是加一个<where>标签将所有条件包起来。

    <select id="findActiveBlogWithTitleLike" 
         parameterType="Blog" resultType="Blog">
      SELECT * FROM BLOG 
     <where>
      <if test="userId != null">
         state = ‘ACTIVE’ 
      </if>
    
      <if test="title != null">
        AND title like #{title}
      </if>
     </where>
    </select>

      这样,当所有条件都不成立时,WHERE也不会被拼上。

      

      这时,有机灵的小伙伴发现了,如果第一个条件不成立,第二个成立,那SQL会不会变成这样?

     SELECT * FROM BLOG 
         WHERE
        AND title like #{title}

      这个就放心好了,当你用<if>标签包围条件后,它会自动去掉AND的。

    做IT的光看不行,多做方有所得。
  • 相关阅读:
    sqlserver查询表字段
    Lombok
    属性配置
    计时器与启动加载器
    banner
    互斥锁和条件变量
    System V消息队列
    命令行参数的处理函数getopt
    posix 消息队列
    不定参数
  • 原文地址:https://www.cnblogs.com/xinluwutu/p/5952285.html
Copyright © 2011-2022 走看看