使用tkmapper避免更新on update字段
在日常开发中,我们的MySQL
数据库表都会有mtime
字段,用来记录某条记录最后一次更新的时间,一般设置为on update
,也就是这条记录有任何的变动,mtime
字段的值就会自动更新。
正常情况下,mtime
字段是没有业务含义的。但是在最近的一次开发中,遇到了一个特例,mtime
具备了业务的含义,因此想在不对其进行修改的情况下,修改该表的其他字段。如果使用SQL
语句,非常简单,代码如下:
UPDATE student
SET grade = 'A', mtime = mtime
WHERE name = 'Ryan';
就可以将表中所有name
字段值为Ryan
的记录的grade
字段的值更新为A
了。
但是使用tkmapper
就要稍微复杂一些,因为表中所有name
字段值为Ryan
的记录可能有很多,且每条记录的mtime
不尽相同。我们必须先去查询所有符合条件的记录的mtime
,然后再根据主键去更新。代码如下:
Weekend<Student> weekend = Weekend.of(Student.class, true, true);
weekend.weekendCriteria().andEqualTo(Student::getName, "Ryan");
List<Student> studentList = studentMapper.selectByExample(weekend);
studentList.forEach(student -> {
student.setGrade("A");
student.setMtime(student.getMtime());
studentMapper.updateByPrimaryKeySelective(student);
});
这样就可以在不改变mtime
的情况下,修改我们想要更新的字段的值。