mybatisplus 自动填充字段,如插入时间、更新时间等

本文介绍了如何在Mybatis和MybatisPlus中使用MetaObjectHandler接口实现数据库插入和更新时的自动填充createTime和updateTime字段,包括在配置类中注入处理器、字段注解规则等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以插入时间(createTime)和更新时间(updateTime)为例:
前端不传递时间参数,后端也不调用set方法,在插入的时候自动填充createTime,在更新的时候自动填充updateTime
在mybatis中实现这个功能好像需要实现org.apache.ibatis.plugin.Interceptor,大概这样(可能高版本有更好的方式)
在这里插入图片描述
在mybatisplus中提供了一个接口MetaObjectHandler用于处理字段的自动填充
可以实现接口,重写里面的默认方法,如:

public class FieldMetaObjectHandler implements MetaObjectHandler {
    //插入的时候填充
    @Override
    public void insertFill(MetaObject metaObject) {
        // 创建时间
        setFieldValByName("createTime", new Date(), metaObject);
    }

    //更新的时候填充
    @Override
    public void updateFill(MetaObject metaObject) {
        // 更新时间
        setFieldValByName("updateTime", new Date(), metaObject);
    }
}

需要在mybatisplus的配置类里面注入这个处理器类

@Bean
    public FieldMetaObjectHandler fieldMetaObjectHandler(){
        return new FieldMetaObjectHandler();
    }

只是注入了还不会生效,还不能实现自动填充,关于填充规则,有这样一个枚举类:
在这里插入图片描述
在需要被注入的字段上加上注解
在这里插入图片描述

### MyBatisPlus 自动填充字段源码实现 MyBatisPlus自动填充功能主要通过 `MetaObject` 和处理器机制来完成。具体来说,在执行插入更新操作前,框架会调用相应的处理器对指定字段进行赋值。 #### 处理器注册与配置 在项目启动阶段,MyBatisPlus 会扫描带有特定注解的实体类属性,并将其映射到对应的元对象处理器中。对于自动填充特性而言,这涉及到 `FieldFill` 枚举类型的定义[^1]: ```java public enum FieldFill { DEFAULT, INSERT, UPDATE, INSERT_UPDATE; } ``` 当开发者在 POJO 类中的某个字段上标注了类似于下面这样的注解时, ```java @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.UPDATE) private Integer version; ``` 这些信息会被记录下来并用于后续的操作判断[^3]。 #### 填充逻辑触发点 实际的数据填充发生在 SQL 执行之前,即准备参数的过程中。此时,MyBatisPlus 利用了 MyBatis 提供的拦截器接口——`Interceptor` 来介入这一过程。特别地,有一个名为 `MetaObjectHandler` 接口负责具体的填充值设置工作[^2]。 以下是简化版的核心流程描述: - 如果目标表存在标记了 `@TableField(fill)` 注解的列,则激活对应的行为; - 调用实现了 `MetaObjectHandler` 接口的对象方法(如 `setInsertScript()` / `setUpdateScript()`),从而向待写入数据库的新纪录注入预设的时间戳或其他默认值[^4]; 因此,要查看完整的自动填充实现细节,可以关注以下几个关键文件路径下的代码片段: - **mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/method/AbstractMethod.java**: 定义了一些通用的方法模板,其中包含了如何处理不同场景下(比如 insert/update)的字段填充- **mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/autoconfigure/MetaObjectHandlerRegister.java**: 这里涉及到了 `MetaObjectHandler` 的实例化以及其生命周期管理的相关逻辑。 - **mybatis-plus-generator/src/main/resources/templates/entity.java.vm**: 若使用代码生成工具创建实体类的话,这里控制着是否为某些特殊字段添加必要的注释标签以便支持自动填充行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值