MP官方给出的自动填充插入和更新时间的方法
https://baomidou.com/pages/4c6bcf/

@TableFIled
第一,在字段上使用注解@TableFIled

	@TableField(value = "create_time",fill = FieldFill.INSERT)    //插入时字段填充
    private LocalDateTime createTime;
    
    @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE) //插入和修改时字段填充
    private LocalDateTime updateTime;

自定义实现类
第二,自定义类继承MetaObjectHandler

@Component //别忘记加入spring容器
public class MyMetaObjectHandler implements MetaObjectHandler {
    //插入时填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }

    //更新时填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
}

问题来了
插入数据时,插入时间和更新时间都发生了变化。
但是,在使用更新数据时,使用 this.strictUpdateFill(metaObject, “updateTime”, LocalDateTime.class, LocalDateTime.now()),数据库updata_time字段无法更新成功。

原因
官方文档给出注意事项:
MetaObjectHandler提供的默认方法的策略均为: 如果属性有值则不覆盖, 如果填充值为null则不填充。也就是说,MP的自动填充功能的前提是填充字段要求为null。

这确实是个大坑,而且是官方给的大坑,很烦。

解决办法

1、换方法,使用 this.setFieldValByName(“updateTime”, LocalDateTime.now(), metaObject);(最简单,使用老方法)

2、修改前设置数据库字段为null(麻烦)

3、自己重写源代码方法(有一定经验的小伙伴可以尝试)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐