10.2 MyBatis动态SQL 10.2.4 set标签

10.2 MyBatis动态SQL 10.2.4 set标签

关于动态更新语句还可以使用set标签。set标签可以用于动态包含需要更新的列,而舍去其他的。

XML映射文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- 根据员工Id查询员工信息 -->
<select
id="selectEmployeeById"
parameterType="int"
resultType="domain.Employee"> select * from tb_employee where id=#{id};
</select>
<!-- 测试set标签 -->
<update
id="updateEmployeeUseSet"
parameterType="domain.Employee">
update tb_employee
<set>
<if test="loginname!=null">loginname=#{loginname}</if>
<if test="password!=null">,password=#{password}</if>
<if test="name!=null">,name=#{name}</if>
<if test="sex!=null">,sex=#{sex}</if>
<if test="age!=null">,age=#{age}</if>
<if test="phone!=null">,phone=#{phone}</if>
<if test="sal!=null">,sal=#{sal}</if>
<if test="state!=null">,state=#{state}</if>
</set>
where id=#{id}
</update>

注意在if子语句中添加逗号

注意,update语句的set子句中,如果要更新多个列,则需要用逗号隔开多个列.所以要在第二个if语句及其后续的if语句中中添加逗号作为分隔符.

set标签的作用

set标签会动态前置set关键字,同时也会消除无关的逗号,因为使用了条件语句之后很可能就会在生成的赋值语句的后面留下这些逗号。

接口方法

1
2
Employee selectEmployeeById(Integer id);
void updateEmployeeUseSet(Employee employee);

需要注意的是,updateEmployeeUseSet方法传递的参数不是之前使用的HashMap,而是一个Employee对象,因为通常在进行更新操作时都是先查询出一个实体对象再进行更新操作

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class SetTest {
public static void main(String[] args)
{
SqlSession sqlSession = null;
// 1.获取SqlSession实例
sqlSession = SqlSessionFratoryTools.getSqlSession();
// 2.获取mapper接口的代理对象
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = employeeMapper.selectEmployeeById(1);
System.out.println("查询到的员工信息:" + employee);
if (employee != null)
{
employee.setName("新名字");
employee.setSal(123);
employeeMapper.updateEmployeeUseSet(employee);
sqlSession.commit();
}
employee = employeeMapper.selectEmployeeById(1);
System.out.println("更新后的员工信息:" + employee);
}
}

运行结果

运行测试类,控制台输出如下:

DEBUG [main] ==>  Preparing: select * from tb_employee where id=?; 
DEBUG [main] ==> Parameters: 1(Integer)
DEBUG [main] <==      Total: 1
查询到的员工信息:Employee [id=1, loginname=xiaoming, password=xiaoming, name=小明, sex=男, age=19, phone=123456789123, sal=9800.0, state=active]
DEBUG [main] ==>  Preparing: update tb_employee SET loginname=? ,password=? ,name=? ,sex=? ,age=? ,phone=? ,sal=? ,state=? where id=? 
DEBUG [main] ==> Parameters: xiaoming(String), xiaoming(String), 新名字(String), 男(String), 19(Integer), 123456789123(String), 123.0(Double), active(String), 1(Integer)
DEBUG [main] <==    Updates: 1
DEBUG [main] ==>  Preparing: select * from tb_employee where id=?; 
DEBUG [main] ==> Parameters: 1(Integer)
DEBUG [main] <==      Total: 1
更新后的员工信息:Employee [id=1, loginname=xiaoming, password=xiaoming, name=新名字, sex=男, age=19, phone=123456789123, sal=123.0, state=active]

可以看到,测试类中,

  • 首先执行了一条查询语句,查询id1的员工,
  • 之后执行了一条update语句,根据传入的Employee对象更新员工信息。
  • 然后再查询该员工信息.可以看到已经更新成功了.