通过MybatisPlus实现字段自动填充功能

MyBatisPlus中使用 @TableField完成字段自动填充功能。

一、字段填充策略 FieldFill

DEFAULT默认不处理
INSERT插入填充字段
UPDATE更新填充字段
INSERT_UPDATE插入和更新填充字段

二、自动填充拦截器 MetaObjectHandler

MetaObjectHandler 是 MyBatis 提供的一个用于操作对象属性的接口,它可以让你无需编写 getter 和 setter 方法就能操作对象的属性。

import org.apache.ibatis.reflection.MetaObject;
@Component
public class ExampleMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        // 实现插入时的字段自动填充逻辑
        this.strictInsertFill(metaObject, "fieldName", Date.class, new Date(), FieldFill.INSERT);
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        // 实现更新时的字段自动填充逻辑
        this.strictUpdateFill(metaObject, "fieldName", Date.class, new Date(), FieldFill.UPDATE);
    }
}

三、实际用法

1.实体类代码

   /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateDate;
    /**
     * 修改人id
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updater; 

2.拦截器代码

@Component
public class FieldMetaObjectHandler implements MetaObjectHandler {
    private final static String UPDATE_DATE = "updateDate";
    private final static String UPDATER = "updater";
​
    @Override
    public void insertFill(MetaObject metaObject) {
        UserDetail user = SecurityUser.getUser();
        Date date = new Date();
        //修改人
        strictInsertFill(metaObject, UPDATER, Long.class, user.getId());
        //修改时间
        strictInsertFill(metaObject, UPDATE_DATE, Date.class, date);
    }
​
    @Override
    public void updateFill(MetaObject metaObject) {
        //修改人
        strictUpdateFill(metaObject, UPDATER, Long.class, SecurityUser.getUserId());
        //修改时间
        strictUpdateFill(metaObject, UPDATE_DATE, Date.class, new Date());
    }

当你执行插入或更新操作时,MetaObjectHandler 会自动填充 updaterupdateDate 字段。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MybatisPlus可以通过自动填充功能实现一些系统级别的字段填充,比如创建时间、更新时间、创建人、更新人等。判断字段类型的方式可以通过定义实现`MetaObjectHandler`接口的类来实现,该类可以通过重写`insertFill`和`updateFill`方法来实现对应操作时的字段填充。 在`insertFill`和`updateFill`方法中,可以通过`metaObject`对象来获取实体对象的信息,包括实体对象的属性名称和值。通过判断属性的类型,可以自动填充相应的字段。 示例代码如下: ```java @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { // 判断是否存在createTime属性,如果存在则填充时间 if (metaObject.hasSetter("createTime")) { this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class); } } @Override public void updateFill(MetaObject metaObject) { // 判断是否存在updateTime属性,如果存在则填充时间 if (metaObject.hasSetter("updateTime")) { this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class); } } } ``` 在上述代码中,通过判断实体对象是否存在`createTime`和`updateTime`属性,来判断是否需要填充时间。如果存在,则调用`strictInsertFill`和`strictUpdateFill`方法来填充对应的时间值。需要注意的是,`strictInsertFill`和`strictUpdateFill`方法中的第三个参数是一个`Supplier`类型的函数,用于提供填充值,可以根据实际需求来自定义填充函数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值