标签
if标签
当提交的表单中有些为非必填项,用户并没有上传这些属性的值,那么程序可以上传NUll,也可以用if标签判断用户有没有上传这个值
<if test="参数!=null">
操作
</if>
其中test中填写一条语句,如果得到true,就执行下面的操作,否则就不执行
例如,添加username,password和photo属性
UserMapper
int add2(UserInfo userInfo);
UserMapper.xml:
需要注意逗号的位置,如果photo未传输数值,那么形成的句子就是username,password,不会有语法问题
<insert id="add2">
insert into userinfo(username,
<if test="photo != null">
photo,
</if>
password)
values(#{username},
<if test="photo != null">
#{photo},
</if>
#{password})
</insert>
UserMapperTest:
@Test
void add2() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("zhangsan");
userInfo.setPhoto(null);
userInfo.setPassword("333");
int result = userMapper.add2(userInfo);
System.out.println(result);
}
可以看到,当photo并没有传值时,生成的JDBC语句中就没有photo
trim标签
如果所有的属性都是非必填项,那么逗号的位置就很难确定了,因此可以使用trim标签来拼接字符串
<trim prefix="前缀内容" suffix="后缀内容" prefixOverrides="去除前缀相关值" suffixOverrides="去除后缀相关值">
</trim>
- prefix会在最前面添加内容
- suffix会在最后面添加内容
- prefixOverrides则是如果最后一个字符是指定值,就去掉该值(例如prefixOverrides=“,”,那么如果最前面是逗号就会去除最前面的逗号)
- suffixOverrides则是去除最后面的值
一般来说,trim会搭配if标签来使用,例如下面这个场景:username,password,photo都是非必填项
UserMapper:
int add3(UserInfo userInfo);
UserMapper.xml
这里会自动添加(),并且如果最后是逗号,会删除这个逗号
<insert id="add3">
insert into userinfo
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="username != null">
username,
</if>
<if test="password != null">
password,
</if>
<if test="photo != null">
photo,
</if>
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="username != null">
#{username},
</if>
<if test="password != null">
#{password},
</if>
<if test="photo != null">
#{photo},
</if>
</trim>
</insert>
UserMapperTest:
@Test
void add3() {
UserInfo userInfo = new UserInfo();
userInfo.setUsername("lisi");
userInfo.setPhoto(null);
userInfo.setPassword("444");
int result = userMapper.add2(userInfo);
System.out.println(result);
}
可以看到确实去除了password后面的逗号(也就是最后一个字符)
where标签
用来查找相关信息,会生成where的语句
- where标签一般也是配合if来使用
- where标签会自动帮助我们删除最前面的and关键字
- where标签中如果没有内容,那么就不会产生where的关键字
也就是说,下面这两种写法都是可以的,只不过where的写法更加简介
<select id="getListByParam" resultType="com.example.demo.entity.UserInfo">
select * from userinfo
<where>
<if test="username!=null">
username = #{username}
</if>
<if test="password!=null">
and password = #{password}
</if>
</where>
</select>
<select id="getListByParam" resultType="com.example.demo.entity.UserInfo">
select * from userinfo
<trim prefix="where" prefixOverrides="and">
<if test="username!=null">
username = #{username}
</if>
<if test="password!=null">
and password = #{password}
</if>
</trim>
</select>
set标签
用来更改属性的值,会自动生成set语句
- set标签一般配合if标签使用
- set标签会自动去除最后一个逗号(英文)
<update id="update2">
update userinfo
<set>
<if test="username != null">
username = #{username},
</if>
<if test="password != null">
password = #{password},
</if>
<if test="photo != null">
photo = #{photo}
</if>
</set>
where id = #{id}
</update>
也可以使用trim来完成这段代码
foreach标签
当我们需要大批量进行操作时,可以在代码中使用for循环,也可以直接在sql中进行批量操作,具体方法就是使用in()
语法格式:
<foreach collection="集合变量" open="前缀" close="后缀" item="集合中变量名" separator="分隔符">
操作
</foreach>
例如,要删除大量指定id的用户信息:
UserMapper:
int deleteById(List<Integer> ids);
UserMapper.xml:
<delete id="deleteById">
delete from userinfo where id in
<foreach collection="ids" open="(" close=")" item="id" separator=",">
#{id}
</foreach>
</delete>
UserMapperTest:
@Test
void deleteById() {
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
ids.add(3);
int result = userMapper.deleteById(ids);
System.out.println(result);
}