时间:2021-05-20
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 WHEREAND title like #{title}这个就放心好了,当你用<if>标签包围条件后,它会自动去掉AND的。
以上所述是小编给大家介绍的MyBatis使用动态SQL标签的小陷阱,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言MyBatis的强大特性之一便是它的动态SQL。所以今天小编在这里为大家介绍一下Mybatis的一个强大功能-动态SQL动态SQL是Mybatis的一个强大
动态SQL什么是动态SQL?MyBatis的官方文档中是这样介绍的?动态SQL是MyBatis的强大特性之一。如果你使用过JDBC或其它类似的框架,你应该能理解
推荐阅读:MyBatis入门学习教程(一)-MyBatis快速入门什么是动态SQL?动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复
MyBatis中sql标签定义SQL片段,include标签引用,可以复用SQL片段sql标签中id属性对应include标签中的refid属性。通过inclu
一、简介Mybatis-Plus是一款MyBatis动态sql自动注入crud简化增删改查操作中间件。启动加载XML配置时注入mybatis单表动态SQL操作,