商城首页欢迎来到中国正版软件门户

您的位置:首页 >Mybatis-plus在新增或修改时如何自动插入或修改某个字段值

Mybatis-plus在新增或修改时如何自动插入或修改某个字段值

  发布于2026-04-24 阅读(0)

扫一扫,手机访问

一 效果

咱们先来看一个实际场景:当你向User表新增一条数据时,如果手动传入的createTime字段是null,会发生什么?

Mybatis-plus在新增或修改时如何自动插入或修改某个字段值

别担心,这正是MyBatis-Plus的“魔法”生效之处。使用它自带的sa ve方法执行新增后,你再查看数据库,会发现createTime字段已经被自动填上了当前时间戳。

Mybatis-plus在新增或修改时如何自动插入或修改某个字段值

二 实现原理

MetaObjectHandler:元数据对象处理器

核心机制:

实现这一自动填充功能的幕后功臣,正是MetaObjectHandler接口。这个接口是MyBatis-Plus框架提供的一个关键扩展点,它允许我们在数据插入更新的关键时刻,为指定字段赋予默认值

典型应用场景:

哪些字段最需要它?答案就是那些几乎每个表都有的公共字段。比如记录数据生命周期的updateTime(更新时间)、createTime(创建时间),或者追踪操作人的createUser(创建人)、updateUser(更新人)。利用这个处理器,就能一劳永逸地解决这些字段的赋值问题。

三 使用步骤

第一步:在实体类的公共字段上添加@TableField注解

注解中的fill属性是关键,它决定了字段在何时被自动填充:

  • @TableField(fill = FieldFill.INSERT):此字段仅在执行插入(新增)操作时填充;
  • @TableField(fill = FieldFill.INSERT_UPDATE):此字段在新增和更新(修改)操作时都会填充;
  • @TableField(fill = FieldFill.UPDATE):此字段仅在执行更新操作时填充。

通过下面这段代码可以看得更明白。在Article实体中,createTime和createUser被标记为只在新增时填充,而updateTime则更为“忙碌”,无论是新增还是修改,它都会被更新。

@TableName(value = "article")
@Data
public class Article implements Serializable {
    /**
     * id
     */
    @TableId(type = IdType.ASSIGN_UUID)
    private String id;
    /**
     * 图片地址
     */
    private String pictureUrl;
    /**
     * 标题
     */
    private String title;
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private String createTime;
    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateTime;

    /**
     * 创建人
     */
    @TableField(fill = FieldFill.INSERT)
    private String createUser;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}

第二步:创建配置类实现MetaObjectHandler接口

注解只是打了“标记”,真正干活的还得是处理器。我们需要创建一个配置类来实现MetaObjectHandler接口,并重写它的两个核心方法:insertFill(插入填充)和updateFill(更新填充)。

在方法体内,调用setFieldValByName方法,指定字段名并赋予相应的值,框架便会自动完成填充。

这里有个容易疏忽的点:务必给这个配置类加上@Component注解,确保它能被Spring容器扫描并管理。

具体实现可以参考以下代码:

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        // 新增时,设置创建时间、更新时间、创建人
        this.setFieldValByName("createTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), metaObject);
        this.setFieldValByName("updateTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), metaObject);    
        this.setFieldValByName("createUser", currrentUser.getNickname(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 更新时,只刷新更新时间
        this.setFieldValByName("updateTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), metaObject);
    }
}

总结

总的来说,MyBatis-Plus通过MetaObjectHandler提供的自动填充机制,极大地简化了公共字段的处理逻辑,让开发者能从重复的赋值代码中解放出来。希望以上的梳理和示例,能为你实际开发提供清晰的指引。

您可能感兴趣的文章:

  • MyBatis-Plus更新对象时将字段值更新为null的四种常见方法
  • MyBatis-plus更新对象时将字段值更新为null的实现方式
  • Mybatis-plus设置某个字段值为null的方法总结
本文转载于:https://www.jb51.net/program/362783o53.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注