(20)MyBatis的动态SQL:set元素

558人浏览 / 0人评论

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


SELECT * FROM tb_employee where id = #{id}



update tb_employee

loginname=#{loginname} ,
password=#{password} ,
name=#{name},
sex=#{sex},
age=#{age},
phone=#{phone} ,
sal=#{sal},
state=#{state}

where id=#{id}

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

// 根据id查询员工
Employee selectEmployeeWithId(Integer id);
// 动态更新员工
void updateEmployeeIfNecessary (Employee employee) ;
需要注意的是,updateEmployeelfNecessar方法传递的参数不是之前使用的HashMap,而是一个Employee对象,因为通常更新操作时都是先查询出一个实体对象再进行更新操作。

public void testUpdateEmployeeIfNecessary(qlSession session) {
EmployeeMapper em = session.getMapper(EmployeeMapper.class) ;
// 查询id为4的员工信息
Employee employee = em.selectEmployeewithId(4);
// 设置需要修改的属性
employee.setLoginname("mary");
employee.setPassword("123");
employee.setName("玛丽");
em.updateEmployeeIfNecessary(employee);
}
测试updateEmployeelfNecessa方法,控制台显示如下:
DEBUG [main]==> Preparing: SELECT * FROM tb_ employee where id= ?
DEBUG [main]==> Parameters :4 (Integer)
DEBUG [main]<== Total :1
DEBUG [main]==> Preparing :update tb_employee SET loginname=?,password=?,name=?,sex=?,age=?,phone=?,sal=?,state=? where id=?
DEBUG [main]==> Parameters: mary(String),123(String),玛丽(String),女(String),20(Integer),13902016666(String),5800.0(Double),ACTIVE(String),4 (Integer)
DEBUG [main]<== Updates :1
可以看到,首先执行了一条查询语句,查询id为4的员工,之后执行了一条update语句,根据传入的Employee对象更新员工信息。切换到数据库,可以看到id为4的员工信息已经更新。

全部评论

晴天下起了小雨
2017-10-01 18:00
很喜欢,果断关注了
wjmyly7336064
2017-10-01 18:00
相当实用,赞美了
橘大佬
2017-10-01 18:00
就是有些细节再到位点就好了…