1. 动态SQL
动态 SQL 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接
1.1 <if>标签
问题:注册分为两种字段:必填字段和⾮必填字段,那如果在添加⽤⼾的时候有不确定的字段传⼊,程序应 该如何实现呢?
- 添加的时候性别 gender 为⾮必填字段
- 当gender不为空的时候才会生成在sql语句中
Integer insertUserByCondition(UserInfo userInfo);1 <insert id="insertUserByCondition">
2 INSERT INTO userinfo (
3 username,
4 `password`,
5 age,
6 <if test="gender != null">
7 gender,
8 </if>
9 phone)
10 VALUES (
11 #{username},
12 #{age},
13 <if test="gender != null">
14 #{gender},
15 </if>
16 #{phone})
17 </insert>
1.2 <trim>标签
- 如果有多个字段,⼀般考虑使⽤标签结 合标签,对多个字段都采取动态⽣成的⽅式、
• prefix:表⽰整个语句块,以prefix的值作为前缀
• suffix:表⽰整个语句块,以suffix的值作为后缀
• prefixOverrides:表⽰整个语句块要去除掉的前缀
• suffixOverrides:表⽰整个语句块要去除掉的后缀
1 <insert id="insertUserByCondition">
2 INSERT INTO userinfo
3 <trim prefix="(" suffix=")" suffixOverrides=",">
4 <if test="username !=null">
5 username,
6 </if>
7 <if test="password !=null">
8 `password`,
9 </if>
10 <if test="age != null">
11 age,
12 </if>
13 <if test="gender != null">
14 gender
15 </if>
19 </trim> <insert id="insertUserByCondition">
2 INSERT INTO userinfo
3 <trim prefix="(" suffix=")" suffixOverrides=",">
4 <if test="username !=null">
5 username,
6 </if>
7 <if test="password !=null">
8 `password`,
9 </if>
10 <if test="age != null">
11 age,
12 </if>
13 <if test="gender != null">
14 gender
15 </if>
19 </trim>
在以上 sql 动态解析时,会将第⼀个 部分做如下处理:
• 基于 prefix 配置,开始部分加上 (
• 基于 suffix 配置,结束部分加上 )
• 多个 组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于
suffixOverrides 配置去掉最后⼀个 ,
• 注意 <if test="username !=null"> 中的 username 是传⼊对象的属性
1.3 <where>标签
根据属性做where条件查询
1 SELECT2 *3 FROM4 userinfo5 WHERE6 age = 187 AND gender = 18 AND delete_flag = 0
Mapper.xml实现
1 < select id = "queryByCondition" resultType = "com.example.demo.model.UserInfo" >2 select id, username, age, gender, phone, delete_flag, create_time,update_time3 from userinfo4 < where >5 < if test = "age != null" >6 and age = #{age}7 </ if >8 < if test = "gender != null" >9 and gender = #{gender}10 </ if > 11 < if test = "deleteFlag != null" >12 and delete_flag = #{deleteFlag}13 </ if >14 </ where >15 </ select >
PS:<where> 只会在⼦元素有内容的情况下才插⼊where⼦句,⽽且会⾃动去除⼦句的开头的AND或 OR
1.4 <set>标签
需求: 根据传⼊的⽤⼾对象属性来更新⽤⼾数据,可以使⽤标签来指定动态内容.
1 < update id = "updateUserByCondition" >2 update userinfo3 < set >4 < if test = "username != null" >5 username = #{username},6 </ if >7 < if test = "age != null" >8 age = #{age},9 </ if >10 < if test = "deleteFlag != null" >11 delete_flag = #{deleteFlag},12 </ if >13 </ set >14 where id = #{id}15 </ update >
<set> :动态的在SQL语句中插⼊set关键字,并会删掉额外的逗号. (⽤于update语句中)
1.5 <foreach>标签
对集合进⾏遍历时可以使⽤该标签。标签有如下属性:
• collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
• item:遍历时的每⼀个对象
• open:语句块开头的字符串
• close:语句块结束的字符串
• separator:每次遍历之间间隔的字符串
1 < delete id = "deleteByIds" >2 delete from userinfo3 where id in4 < foreach collection = "ids" item = "id" separator = "," open = "(" close = ")" >5 #{id}6 </ foreach >7 </ delete >