使用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
的情况下,修改我们想要更新的字段的值。