您的位置:首页 >Mybatis-plus在新增或修改时如何自动插入或修改某个字段值
发布于2026-04-24 阅读(0)
扫一扫,手机访问
咱们先来看一个实际场景:当你向User表新增一条数据时,如果手动传入的createTime字段是null,会发生什么?

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

核心机制:
实现这一自动填充功能的幕后功臣,正是MetaObjectHandler接口。这个接口是MyBatis-Plus框架提供的一个关键扩展点,它允许我们在数据插入或更新的关键时刻,为指定字段赋予默认值。
典型应用场景:
哪些字段最需要它?答案就是那些几乎每个表都有的公共字段。比如记录数据生命周期的updateTime(更新时间)、createTime(创建时间),或者追踪操作人的createUser(创建人)、updateUser(更新人)。利用这个处理器,就能一劳永逸地解决这些字段的赋值问题。
注解中的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接口,并重写它的两个核心方法: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提供的自动填充机制,极大地简化了公共字段的处理逻辑,让开发者能从重复的赋值代码中解放出来。希望以上的梳理和示例,能为你实际开发提供清晰的指引。
您可能感兴趣的文章:
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9