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

 更新时间:2024年09月23日 09:00:21   作者:剽悍一小兔  
MybatisPlus通过FieldFill注解和MpMetaObjectHandler类支持自动填充字段功能,特别地,可以设置字段在插入或更新时自动填充创建时间和更新时间,但在特定场景下,如导入数据时,可能需要自定义创建时间

MybatisPlus创建时间不想用默认值

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

常见的例子

/**
 * 创建时间
 */
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-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.INSERT 表示在插入(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 metaObject) {
        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字段设置当前时间戳的值。

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java maven详细介绍

    Java maven详细介绍

    今天给大家复习一下Java基础知识,简单介绍Maven,文中有非常详细的解释,对Java初学者很有帮助哟,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09
  • SpringSecurity认证流程详解

    SpringSecurity认证流程详解

    这篇文章主要介绍了SpringSecurity认证流程详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Java中方法的重写与成员变量的隐藏

    Java中方法的重写与成员变量的隐藏

    这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量),文中给大家介绍了java中的重写知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-11-11
  • Java模板方法模式定义算法框架

    Java模板方法模式定义算法框架

    Java模板方法模式是一种行为型设计模式,它定义了一个算法框架,由抽象父类定义算法的基本结构,具体实现细节由子类来实现,从而实现代码复用和扩展性
    2023-05-05
  • springboot如何重定向携带数据 RedirectAttributes

    springboot如何重定向携带数据 RedirectAttributes

    这篇文章主要介绍了springboot如何重定向携带数据 RedirectAttributes,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringMVC JSON数据交互及RESTful支持实现方法

    SpringMVC JSON数据交互及RESTful支持实现方法

    这篇文章主要介绍了SpringMVC JSON数据交互及RESTful支持实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • mybatis3.4.6 批量更新 foreach 遍历map 的正确姿势详解

    mybatis3.4.6 批量更新 foreach 遍历map 的正确姿势详解

    这篇文章主要介绍了mybatis3.4.6 批量更新 foreach 遍历map 的正确姿势详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • SpringBoot bean依赖属性配置详细介绍

    SpringBoot bean依赖属性配置详细介绍

    Spring容器是Spring的核心,一切SpringBean都存储在Spring容器内。可以说bean是spring核心中的核心。Bean配置信息定义了Bean的实现及依赖关系,这篇文章主要介绍了SpringBoot bean依赖属性配置
    2022-09-09
  • Mybatis中传递多个参数的4种方法总结

    Mybatis中传递多个参数的4种方法总结

    这篇文章主要给大家介绍了关于Mybatis中传递多个参数的4种方法,并且介绍了关于使用Mapper接口时参数传递方式,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-04-04
  • SpringBoot中MockMVC单元测试的实现

    SpringBoot中MockMVC单元测试的实现

    Mock是一种用于模拟和替换类的对象的方法,以便在单元测试中独立于外部资源进行测试,本文主要介绍了SpringBoot中MockMVC单元测试的实现,具有应该的参考价值,感兴趣的可以了解一下
    2024-02-02

最新评论