目录
根据不同条件拼接 SQL 语句。
Mybatis动态sql常用元素:
用于查询语句:if
choose(when, otherwise)
Where(if)、trim
用于修改语句:Set——动态更新语句
对集合进行遍历:Foreach
1. if
(1)特点:顺序执行,满足条件的都会按需拼接。
(2)缺点:若where后没有已有字段,拼接语句第一个字段和where之间会有and,导致sql语句错误。
<select id="getStudentIf" parameterType="com.zx.pojo.Student" resultType="com.zx.pojo.Student">
select * from t_student where name=#{name}
<if test="pwd!=null">
and pwd=#{pwd}
</if>
</select>
2. choose(when, otherwise)
(1)特点:类似switch选择语句,前面有条件满足,后面的内容不再执行,只拼接最近满足一个。若when内的都不满足,会将otherwise的内容拼接上去。
(2)缺点:和if元素一样,若where后没有已有字段,拼接语句第一个字段和where之间会有and,导致sql语句错误。
<select id="getStudentChoose" parameterType="com.zx.pojo.Student" resultType="com.zx.pojo.Student">
select * from t_student where sex="男"
<choose>
<when test="name!=null">
and name=#{name}
</when>
<when test="pwd!=null">
and pwd=#{pwd}
</when>
<otherwise>
and age=#{age}
</otherwise>
</choose>
</select>
3. Where(if)——常用
(1)特点:where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
<!--
where(if):若有条件满足会自动拼接where,并且会将第一个满足条件前的and自动覆盖掉,然后将其他满足条件的按序拼接在后面。
where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
-->
<select id="getStudentWhere" parameterType="com.zx.pojo.Student" resultType="com.zx.pojo.Student">
select * from t_student
<where>
<if test="name!=null">
and name=#{name}
</if>
<if test="pwd!=null">
and pwd=#{pwd}
</if>
</where>
</select>
4. 自定义 trim
(1)特点:与where(if)功能类似,可自行定义。
(2)属性:prefix 前缀
prefixOverrides 前缀覆盖
suffix 后缀
suffixOverrides 后缀覆盖
(3)缺点:相对where(if)而言,稍繁琐。
<select id="getStudentTrim" parameterType="com.zx.pojo.Student" resultType="com.zx.pojo.Student">
select * from t_student
<trim prefix="WHERE" prefixOverrides="and |or">
<if test="name!=null">
and name=#{name}
</if>
<if test="pwd!=null">
and pwd=#{pwd}
</if>
</trim>
</select>
5. Set——动态更新语句
(1)特点:set 元素会动态地插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。
(2)功能:用于动态更新语句。
<update id="update" parameterType="com.zx.pojo.Student">
update t_student
<set>
<if test="name!=null">
name=#{name},
</if>
<if test="pwd!=null">
pwd=#{pwd},
</if>
</set>
where id=#{id}
</update>
6. Foreach——对集合进行遍历
(1)属性:
item 声明可以在元素体内使用的集合项
index
collection 迭代体
open 指定开头字符串以及
separator 指定集合项迭代之间的分隔符
close 指定结尾的字符串
(2)特点:可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。
<select id="getUserForeach" parameterType="java.util.List" resultType="com.zx.pojo.Student">
select * from t_student where id in
<foreach collection="array" item="arr" open="(" separator="," close=")">
#{arr}
</foreach>
</select>