开发者

MybatisPlus创建时间不想用默认值的问题

目录
  • MyBATisPlus创建时间不想用默认值
    • 常见的例子
  • 总结

    MybatisPlus创建时间不想用默认值

    我们知道,MybatisPlus可以给一些字段设置默认值,比如创建时间,更新时间,分为插入时设置,和更新时设置。

    常见的例子

    /**
     * 创建时间
     */
    @jsonFormat(shape = JsonFormat.Shape.STRING, pattern="yywww.devze.comyy-MM-dd HH:mm:ss")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Timestamp createTime;
    
    /**
     * 修改时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private Timestamp updateTime;

    其中

    @TableField(value = "create_time", fill = FieldFill.INSERT):

    这是一个MyBatis-Plus的注解,用于配置数据库字段映射。

    • value = "create_time" 表示这个变量映射到数据库表中的create_time字段。
    • fill = FieldFill.I编程客栈NSERT 表示在插入(INSERT)记录时,这个字段会被自动填充。
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE):

    类似于上面的createTime的注解,但fill = FieldFill.INSERT_UPDATE 表示在插入(INSERT)或更新(UPDATE)记录时,这个字段会被自动填充。

    对应的,我们需要设置 MpMetaObjectHandler

    @Component
    public class MpMetaObjectHandler implements MetaObjectHandler {
    
        /**
         * 插入时的填充策略
         * @param metaObject
         */
        @Override
       编程客栈 public void insertFill(MetaObject metaObject) {
            this.setFieldValByName("createTime", new Timestamp(new Date(编程客栈).getTime()), metaObject);
    
        }
    
        /**
         * 更新时的填充策略
         * @param metaObject
         */
        @Override
        public void updateFill(MetaObject metaOandroidbject) {
            this.setFieldValByName("updateTime", new Timestamp(new Date().getTime()), metaObject);
        }
    
    
    }

    MetaObjectMyBatis-Plus中的一个类,它提供了对实体对象字段的访问和操作。

    setFieldValByName方法允许我们根据字段名动态地设置实体对象的字段值。

    这样我们在调用mapperinsertupdate方法时,就会自动填充两个时间的值,非常方便。

    BUT:

    有些时候,我希望自己设置一个创建时间进去,比如我在导入数据的时候,插入这张表,人家excel里面就有创建时间,那我当然不希望用当前时间啦!

    结果,让人崩溃的是,哪怕你设置了 createTime ,最终在 insert 的时候,还是会走到 insertFill 的逻辑,保存了当前时间。

    这实在是令人崩溃,小编试了好多次,终于找到了办法。我们只需要修改一下 handler

    if(metaObject.hasGetter("createTime") && metaObject.getValue("createTime") == null){
        this.setFieldValByName("createTime", new Timestamp(new Date().getTime()), metaObject);
    }

    这段代码是对insertFill方法的一个增强,它添加了一个条件判断来确保只有在createTime字段存在且其值为null时,才会为createTime字段设置当前时间戳的值。

    这样一来,创建时间就可以灵活配置了,更新时间也可以这样改,但是一般来说用不着,更新时间用当前时间是没问题的,很少有需要手动调整更新时间的情况。

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜