首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
Mybatis-plus在新增或修改时如何自动插入或修改某个字段值

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

热心网友
56
转载
2026-04-24

一 效果

咱们先来看一个实际场景:当你向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
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

Ubuntu环境下如何调试Golang打包过程
编程语言
Ubuntu环境下如何调试Golang打包过程

在Ubuntu环境下调试Golang打包过程 在Ubuntu上折腾Go项目的打包和调试,是不少开发者都会经历的环节。这个过程其实并不复杂,只要按部就班,就能把问题理清楚。下面这几个步骤,算是经验之谈,能帮你快速定位和解决打包过程中的常见问题。 1 确保已安装Go环境 第一步,也是最基础的一步:确认

热心网友
04.24
Node.js在Linux系统中如何实现数据备份与恢复
编程语言
Node.js在Linux系统中如何实现数据备份与恢复

Node js 在 Linux 的数据备份与恢复实践 一 备份范围与策略 在动手之前,得先想清楚要保护什么。一个典型的 Node js 应用,需要备份的对象通常包括这几块: 明确备份对象:首先是应用代码与核心配置,它们通常位于类似 var www my_node_app 的目录下。别漏了依赖清单

热心网友
04.24
Golang在Ubuntu打包时如何排除文件
编程语言
Golang在Ubuntu打包时如何排除文件

Golang在Ubuntu打包时如何排除文件 在Golang项目里, gitignore文件大家都很熟悉,它负责在版本控制时过滤掉不需要的文件。但如果你遇到的问题是:在编译打包阶段,如何精准地排除某些源代码文件呢?这时候, gitignore就无能为力了。解决这个问题的关键,在于用好Go语言提供的“

热心网友
04.24
Ubuntu下Golang打包工具怎么选
编程语言
Ubuntu下Golang打包工具怎么选

在 Ubuntu 上为 Go 项目选择打包工具 为 Go 项目选择打包工具,这事儿说简单也简单,说复杂也复杂。关键得看你的交付目标是什么——是生成一个本机二进制文件就够,还是需要面向多平台发行、打包成容器镜像,甚至是制作成标准的 deb 系统包?同时,你的交付流程也至关重要,是本地手工操作,还是集

热心网友
04.24
Node.js在Linux环境下如何进行性能测试
编程语言
Node.js在Linux环境下如何进行性能测试

Node js 在 Linux 环境下的性能测试与瓶颈定位 一、测试流程与准备 性能测试不是一场盲目的冲锋,而是一次精密的实验。一切始于清晰的目标和稳定的环境。 明确目标与指标:首先,得把目标量化。是要求P95延迟稳定在200毫秒以内,还是错误率必须低于0 5%?把这些数字定下来。紧接着,锁定测试环

热心网友
04.24