我最近在使用springboot开发过程中,发现使用mybatis-plus更新操作时updateTime不自动更新;如果updateTime不更新的话,会影响我们对数据的一些判断,比如更改了一个数据,不知道到底改了没改,或者对数据统计也有影响,造成数据统计不准确。
现象与原因
虽然,我们再数据库字段设计中使用:
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
但是,使用mybatis-plus的更新方法,任然不能对时间进行更新;
比如使用如下方法:
/**
* 进行更新操作
*/
openOrder.updateById()
openOrderService.saveOrUpdateBatch();
// ....... 等等方法
这些方法使用之后,都没有对updateTime数据进行更新。
原因:当selectByld从数据库取出旧数据,然后修改自己想修改的字段后调用updateByld,会发现update time字段不会更新,这是因为selectByld可以取出update time的旧值,更新时填充策路会判断属性已有值,不进行自动填充,因此update time不会自动更新。而且官方目前没有直接提供强制更新的方法。
查看fillStrategy方法源码,我们也可以看到只有属性没有被填充值,才会执行set方法。
解决办法
解决方法一:更新时设置更新时间;
TDZopenOrder openOrder = openOrderService.getById(orderId);
openOrder.setOrderId(washOrderId);
openOrder.setUpdateTime(LocalDateTime.now());
openOrder.updateById()
解决方法二:实体上设置更新时间
public class TDZopenOrder {
@ApiModelProperty("更新时间")
@TableField(update = "now()")
private LocalDateTime updateTime;
}
推荐使用方法二,这样不用每次都取设置更新时间,简化代码!!!
以上,就是我对这个问题的处理与解决。