mybatis-plus自动填充的实现

本文探讨了数据库字段如创建时间和更新时间的自动填充策略,包括数据库层面的默认填充与应用程序控制的填充方式。在数据量较小的情况下,数据库自动填充较为便捷,但当数据量巨大时,应用层控制能提高数据库性能。通过MyBatis-Plus的MetaObjectHandler,可以在插入和更新时自动填充时间戳,减少数据库负载。

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

数据库中的一些字段,例如创建时间、更新时间等,一般不需要手动设定,而是让系统自动设定或更新这些值。有两种方式实现:

方法一:数据库自动填充

如设置MySQL数据库创建时间和更新时间默认为 CURRENT_TIMESTAMP

方法二:应用层填充

使用代码控制数据的更新和填充。

重要

明明使用数据库层面的自动填充更加简单,为什么还需要应用层填充这种方式呢?

当数据库的数据量较少时,使用数据库自动填充不会对数据库的性能造成太大的影响。
然而当系统数据库数据量非常庞大时,对数据库的任何操作都是非常耗时的。为了提高数据库的性能,应当使用应用层控制的方式,直接传递要更改的值给数据库。这样对数据库而言,数据的操作更加简单“纯粹”,以此来减轻数据库的负担。

编码

步骤:

  • 注解填充字段 @TableField(.. fill = FieldFill.INSERT)
public class User {
    // 注意!这里需要标记为填充字段
    @TableField(.. fill = FieldFill.INSERT)
    private String fillField;
    ....
}
  • 实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler

自定义实现类 MyMetaObjectHandler

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
        // 或者
        this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
        // 或者
        this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
        // 或者
        this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
        // 或者
        this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
    }
}

注意:

  • 填充原理是直接给entity的属性设置值!!!
  • 注解则是指定该属性在对应情况下必有值,如果无值则入库会是null
  • MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充
  • 字段必须声明TableField注解,属性fill选择对应策略,该声明告知Mybatis-Plus需要预留注入SQL字段
  • 填充处理器MyMetaObjectHandler在 Spring Boot 中需要声明@Component@Bean注入
  • 要想根据注解FieldFill.xxx字段名以及字段类型来区分必须使用父类的strictInsertFill或者strictUpdateFill方法
  • 不需要根据任何来区分可以使用父类的fillStrategy方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_console_

您的关注与鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值