Mybatis-plus在新增或修改时如何自动插入或修改某个字段值
一 效果
咱们先来看一个实际场景:当你向User表新增一条数据时,如果手动传入的createTime字段是null,会发生什么?
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

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

二 实现原理
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的方法总结
热门专题
热门推荐
在Ubuntu环境下调试Golang打包过程 在Ubuntu上折腾Go项目的打包和调试,是不少开发者都会经历的环节。这个过程其实并不复杂,只要按部就班,就能把问题理清楚。下面这几个步骤,算是经验之谈,能帮你快速定位和解决打包过程中的常见问题。 1 确保已安装Go环境 第一步,也是最基础的一步:确认
Node js 在 Linux 的数据备份与恢复实践 一 备份范围与策略 在动手之前,得先想清楚要保护什么。一个典型的 Node js 应用,需要备份的对象通常包括这几块: 明确备份对象:首先是应用代码与核心配置,它们通常位于类似 var www my_node_app 的目录下。别漏了依赖清单
Golang在Ubuntu打包时如何排除文件 在Golang项目里, gitignore文件大家都很熟悉,它负责在版本控制时过滤掉不需要的文件。但如果你遇到的问题是:在编译打包阶段,如何精准地排除某些源代码文件呢?这时候, gitignore就无能为力了。解决这个问题的关键,在于用好Go语言提供的“
在 Ubuntu 上为 Go 项目选择打包工具 为 Go 项目选择打包工具,这事儿说简单也简单,说复杂也复杂。关键得看你的交付目标是什么——是生成一个本机二进制文件就够,还是需要面向多平台发行、打包成容器镜像,甚至是制作成标准的 deb 系统包?同时,你的交付流程也至关重要,是本地手工操作,还是集
Node js 在 Linux 环境下的性能测试与瓶颈定位 一、测试流程与准备 性能测试不是一场盲目的冲锋,而是一次精密的实验。一切始于清晰的目标和稳定的环境。 明确目标与指标:首先,得把目标量化。是要求P95延迟稳定在200毫秒以内,还是错误率必须低于0 5%?把这些数字定下来。紧接着,锁定测试环





