1 <if> 标签
在用户注册的场景下,可能会出现部分选项是非必填项,这种情况就需要根据用户输入情况动态调整我们的SQL:
以上次的代码为例:
我们要求输入时,gender字段可填可不填
<insert id="insert2">
insert into userinfo(username, password, age
<if test="gender != null">
, gender
</if>) values (#{username}, #{password}, #{age}
<if test="gender != null">
, #{gender}
</if>)
</insert>
if标签内的gender 对应的是 UserInfo 类中的gender
@Test
void insert2() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("Ting");
userInfo.setPassword("Ting");
userInfo.setAge(16);
//userInfo.setGender(2);
System.out.println(userInfoXMLMapper.insert2(userInfo));
}
当我们不填写gender时,构造的SQL语句中就不会包含gender相关的字段
2 <trim> 标签
如果一个SQL语句中有多个非必填项,可能会导致一些问题:
<insert id="insert3">
insert into userinfo(username, password, age ,
<if test="gender != null">
gender,
</if>
<if test="phone != null">
phone
</if>) values (#{username}, #{password}, #{age},
<if test="gender != null">
#{gender},
</if>
<if test="phone != null">
#{phone}
</if>)
</insert>
如果使用这个SQL语句时只输入了gender,没有输入phone,就会导致SQL后面多了一个逗号,导致badSQL,于是MyBatis引入了<trim>标签
<trim>标签有如下属性:
- prefix:表示整个语句块以prefix的值作为前缀
- suffix:表示整个语句块以suffix的值作为后缀
- prefixOverride是:表示整个语句块要去除的前缀
- suffixOverrides:表示整个语句块要去掉的后缀
调整xml文件:
<insert id="insert3">
insert into userinfo
<trim prefix="(" suffix=")" suffixOverrides=",">
username, password, age,
<if test="gender != null">
gender,
</if>
<if test="phone != null">
phone
</if>
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
#{username}, #{password}, #{age},
<if test="gender != null">
#{gender},
</if>
<if test="phone != null">
#{phone}
</if>
</trim>
</insert>
3 <where>标签
当我们需要使用条件查询某个数据时可以使用<where>标签:
<select id="select1">
select * from userinfo
<where>
<if test="age != null">
and age = #{age}
</if>
<if test="gender != null">
and gender = #{gender}
</if>
</where>
</select>
<where>标签会生成where关键字并去除最前面的and,如果where标签中没有一个查询条件则不会生成where关键字。
如果使用 <trim>标签则无法完成省略where的功能
4 <set> 标签
<set> 标签用于 update语句,会自动生成一个set关键字,并去除最后一个 逗号 :
<update id="update1">
update userinfo
<set>
<if test="username">
username = #{username},
</if>
<if test="password">
password = #{password},
</if>
<if test="age">
age = #{age},
</if>
<if test="gender">
gender = #{gender},
</if>
<if test="phone">
phone = #{phone}
</if>
</set>
where id = #{id}
</update>
5 <foreach> 标签
对集合进行遍历时可以使用该标签,该标签有以下属性:
- collection:绑定方法参数中的集合,如List,Set, Map或数组
- item:遍历时的每一个对象名
- open:语句块开头的字符串
- close:语句块结束的字符串
- separator:每次遍历对象之间的字符串
需求:根据多个id删除用户数据:
collection对应的是我们Java代码中定义的集合的名称,item属性的值必须和#{}中相同
6 <include> 标签
在xml文件中可能会存在很多的重复片段,我们可以使用<sql>标签把这些重复的片段封装起来,然后通过<include>标签引用:
<sql id="allColum">
id, username, password, age, gender, phone, delete_flag, create_time, update_time
</sql>
<select id="select" resultMap="resultMap">
select
<include refid="allColum"></include>
from userinfo
</select>
上面的这些功能也能使用注解的形式实现,只需在外面加上 <script>标签即可,不过一般不推荐使用注解。