星空网 > 软件开发 > 数据库

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

 




原标题:MyBatis使用动态SQL标签的小陷阱

关键词:sql

sql
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

亚马逊旺季进入尾声,库存堆积卖不出去怎么办?:https://www.ikjzd.com/articles/135892
个人做shopify-facebook广告组如何创建?:https://www.ikjzd.com/articles/135894
封号预警:被判定不公平定价应该如何申诉?:https://www.ikjzd.com/articles/135895
奥地利也要合规啦!12月31号务必上传VAT税号!:https://www.ikjzd.com/articles/135896
床品大市场!亚马逊编辑推荐床品大牌融资超3亿:https://www.ikjzd.com/articles/135897
亚马逊Promotion(促销活动)—短码的设置及注意事项:https://www.ikjzd.com/articles/135898
下周开始,安徽人免费游九华山,带上身份证就:https://www.vstour.cn/a/408234.html
上海滑雪场门票价格?:https://www.vstour.cn/a/408235.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流