4. set 标签
主要作用
set 标签一般与 if 标签搭配使用,它可以直接代替 SQL语句中的 set 关键字,在 set 标签中,我们可以控制修改字段的数量,从而达到不同的 update 修改要求。
代码实现
UserInfo 类:
@Data public class UserInfo { private int id; private String username; private String password; private String photo; private String createtime; private String updatetime; private int state; }
" UserMapper " 接口:
@Mapper public interface UserMapper { // 修改用户使用 set 标签 public int update2(UserInfo userInfo); }
xml 文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.mapper.UserMapper"> <!-- 修改用户使用 set 标签 --> <!-- update userinfo set username = #{username} where id = #{id} --> <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> </mapper>
测试类1:
@SpringBootTest class UserMapperTest { @Resource private UserMapper userMapper; // 修改用户使用 set 标签 @Test void update2() { UserInfo userInfo = new UserInfo(); userInfo.setUsername("王五"); userInfo.setPassword("777"); userInfo.setPhoto("777.png"); userInfo.setId(7); int result = userMapper.update2(userInfo); System.out.println("测试结果: " + result); } }
启动测试方法,查看 MyBatis 日志打印:
观察数据库:
测试类2:
@SpringBootTest class UserMapperTest { @Resource private UserMapper userMapper; // 修改用户使用 set 标签 @Test void update2() { UserInfo userInfo = new UserInfo(); userInfo.setUsername("王五"); userInfo.setPassword("777"); userInfo.setPhoto("777.png"); userInfo.setId(7); int result = userMapper.update2(userInfo); System.out.println("测试结果: " + result); } }
启动测试方法,查看 MyBatis 日志打印:
观察数据库:
总结 set 标签语法
一般来说,set 用于 update 修改操作中,所以,既然要修改了,那么在 set 标签中,必然是需要至少一个值,否则就会报错。
此外,set 标签也等价于下面的写法,实际上它能省略语句中的后缀 " 逗号 ",但是它省略不了语句中的前缀 " 逗号 " .
<trim prefix="set" suffixOverrides=","> </trim>
此外,它也很智能,它能够自动检测 SQL 语句块的末尾是否真的有 " 逗号 ",对于末尾没有逗号的情况,它不会执行删除操作,同时也不会报错。
5. foreach 标签
主要作用
foreach 标签一般与 SQL 中的 in() 关键字搭配,可以做到批量化操作。
下面的代码就是展示了批量删除的操作。
代码实现
UserInfo 类:
@Data public class UserInfo { private int id; private String username; private String password; private String photo; private String createtime; private String updatetime; private int state; }
" UserMapper " 接口:
@Mapper public interface UserMapper { // 批量删除使用 foreach 标签 public int deleteByIds(List<Integer> ids); }
xml 文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.mapper.UserMapper"> <!-- 批量删除使用 foreach 标签 --> <!-- delete from userinfo where id in ( , , ,); --> <delete id="deleteByIds"> delete from userinfo where id in <foreach collection="ids" item="id" open="(" close=")" separator=","> #{id} </foreach> </delete> </mapper>
测试类1:
@SpringBootTest class UserMapperTest { @Resource private UserMapper userMapper; // 批量删除使用 foreach 标签 @Test void deleteByIds() { List<Integer> ids = new ArrayList<>(); // 添加需要删除的用户 id ids.add(8); ids.add(9); ids.add(10); int result = userMapper.deleteByIds(ids); System.out.println("测试结果: " + result); } }
启动测试方法,查看 MyBatis 日志打印:
观察数据库:
总结 foreach 标签语法
foreach 标签的语法可以类比于 Java 中 for each 遍历数组的用法。
foreach 标签常用的有五个属性,它们可以达到往 SQL 语句块中拼接或删除字符(串)的作用,从而控制 SQL 的写法。
① collection:一组相同的数据的集合,类似于数组,
这里需要注意,collection 中的值需要与前端传来的参数匹配。
② item:集合中的一项数据,类似于数组中的某一个元素
③ open:需要拼接的前缀字符(串)
④ close:需要拼接的后缀字符(串)
⑤ separator:一组数据的分隔符
总结动态 SQL
动态 SQL 就和它的名字一样,赋予了 SQL 一个动态的语法,我们可以根据前端需要的参数,来控制一整条 SQL 语句。本质上,关于动态 SQL 的标签,就是用来拼接或删除 SQL 的,没有其他的作用。
在使用动态 SQL 之前,我们应该先把心中设想好的完完整整的 SQL 写出来,之后再对此 SQL 进行变换,这样一来,便不会出错。