MyBatis使用动态SQL标签的小陷阱
mybatis是一个支持普通sql查询,存储过程和高级映射的优秀持久层框架。mybatis消除了几乎所有的jdbc代码和参数的手工设置以及对结果集的检索封装。mybatis可以使用简单的xml或注解用于配置和原始映射,将接口和java的pojo(plain old java objects,普通的java对象)映射成数据库中的记录。
现在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标签的小陷阱,希望对大家有所帮助
推荐阅读
-
MyBatis使用动态SQL标签的小陷阱
-
MyBatis动态SQL中的trim标签的使用方法
-
Mybatis动态sql、if与where的使用、sql片段、foreach遍历、Mybatis的关联查询一对一、一对多、多对多、Mybatis的延时加载
-
MyBatis动态SQL中的trim标签的使用方法
-
Mybatis中动态SQL,if,where,foreach的使用教程详解
-
MyBatis从入门到精通(八):MyBatis动态Sql之foreach标签的用法
-
MyBatis的动态sql小练习,小回顾
-
MyBatis——动态SQL语句——if标签和where标签复合使用
-
动态SQL之(bind)标签使用的两种方式讲解
-
Mybatis中动态SQL,if,where,foreach的使用教程