一、使用动态 SQL 前期说明
在 mapper 的动态 SQL 中若出现大于号(>)、小于号(<)、大于等于号(>=),小于等于号(<=)等符号,最好将其转换为实体符号。否则,XML 可能会出现解析出错问题,特别是对于小于号(<),在 XML 中是绝不能出现的。
二、动态 SQL 之 < if >
语法:< if test= ”条件” > sql 语句的部分 < /if >
对于该标签的执行,当 test 的值为 true 时,会将其包含的 SQL 片断拼接到其所在的 SQL 语句中,例如:
<select id="getByName" resultType="com.domain.User">
<!--添加1=1的原因请看下面第三点-->
select * from users where 1=1
<if test="userName != null and userName !='' ">
and userName = #{userName}
</if>
<if test="sex != null and sex !='' ">
and sex = #{sex}
</if>
</select>
三、动态 SQL 之 < where >
< if >标签的中存在一个比较麻烦的地方就是需要在 where 后手工添加 1=1 的子句。因为,若 where 后的所有< if >条件均为 false,而 where 后若又没有 1=1 子句,则 SQL 中就会只剩下一个空的 where,此时SQL出错。
又或者第一个< if >条件为 false时候,下一个< if >条件为trun,此时拼接上去的sql语句就会多出一个 and ,此时SQL出错。
因此针对以上两种情况,在 where 后,需要添加永为真子句 1=1,以防止这种情况的发生。但当数据量很大时,会严重影响查询效率。因此我们可以使用标签,在有查询条件时,可以自动添加上 where 子句;没有查询条件时,不会添加where 子句。例如:
<select id="getByName" resultType="com.domain.User">
select * from users
<where>
<if test="userName != null and userName !='' ">
and userName = #{userName}
</if>
<if test="sex != null and sex !='' ">
and sex = #{sex}
</if>
</where>
</select>
需要注意的是,第一个标签中的 SQL 片断,可以不包含 and。不过,写上 and 也不错,系统会将多出的 and 去掉。但其它中 SQL 片断的 and,必须要求写上,否则 SQL 语句将拼接出错。
四、动态 SQL 之 < foreach >
用于实现对于数组与集合的遍历;
语法:
< foreach collection=" 集合类型" open=" 开始的字符" close=" 结束的字符"
item=" 集合中的成员" separator=" 集合成员之间的分隔符">
#{item 的值}
< /foreach>
- 接口中的方法
List<User> selectUser(List<Integer> idList);
<select id="selectUser" resultType="com.domain.User">
select * from users
<if test="list !=null and list.size > 0 ">
where id in
<foreach collection="list" open=(" close=")" item="userid" separator=",">
#{userid}
</foreach>
</if>
</select>
写在最后
以上 MyBatis 中关于 动态 SQL的具体内容,后续如果有时间的话我也将持续更新,如果有错误或者是哪里不足的地方,欢迎各位大大提出宝贵的意见呀~
此外,为了让大家更方便地使用,如果需要 mybatis 的官方文件 mybatis-3.5.1.pdf 可以关注下方公众号,后台回复 “mybatis ”即可获取,期待着您的光临~
相关链接:
链接: 003-SSM三大框架(二)—— 深入理解 MyBatis 的参数传递.
链接: 002-SSM三大框架(二)—— 基于Maven工程搭建 MyBatis 开发环境.
链接: 001-SSM三大框架(一)—— 三层架构.