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
| <select id="selectEmployeeById" parameterType="int" resultType="domain.Employee"> select * from tb_employee where id=#{id}; </select>
<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>
|
注意,update
语句的set
子句中,如果要更新多个列,则需要用逗号隔开多个列.所以要在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; sqlSession = SqlSessionFratoryTools.getSqlSession(); 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); } }
|
运行结果
运行测试类,控制台输出如下:
1 2 3 4 5 6 7 8 9 10 11
| 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]
|
可以看到,测试类中,首先执行了一条查询语句,查询id
为1
的员工,之后执行了一条update
语句,根据传入的Employee
对象更新员工信息。
然后在查询该员工信息.可以看到已经更新成功了.
原文链接: 10.2 MyBatis动态SQL 10.2.4 set标签