MetaObjectHandler 之 MyBatisPlus 属性自动填充配置

前言:

在业务项目开发中,对于一些业务数据的操作,我们都会记录创建人、创建时间、更新人、更新时间,如果我们在每个业务方法中都通过 set 方法去设定值,这样即操作麻烦也显得代码臃肿,那有没有一个可以自动填充的方法呢?MyBatisPlus 的 MetaObjectHandler 就很好的帮我们解决了这个问题,本篇我们将演示如何通过 MetaObjectHandler 实现自动属性填充。

使用前提:

如果想要通过实现 MetaObjectHandler 接口来实现一些默认字段的填充,还需要再对应的实体类的字段中使用 @TebleField 注解,并设置对应的属性,如下:

  • @TebleField(fill = FieldFill.INSERT):表示当前字段只在新增操作时更新数据。
  • @TebleField(fill = FieldFill.UPDATE):表示当前字段只在修改操作时都更新数据。
  • @TebleField(fill = FieldFill.INSERT_UPDATE):表示当前字段在新增和更新操作时都更新数据。

实体类举例:

@Data
@TableName("order")
public class OrderDO {
	
	@ApiModelProperty(value = "主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @ApiModelProperty(value = "订单名称")
    @TableField("order_name")
    private String orderName;

    @ApiModelProperty(value = "创建人工号")
    @TableField(value = "create_by", fill = FieldFill.INSERT)
    private String createBy;

    @ApiModelProperty(value = "创建时间")
    @TableField(value = "created_time", fill = FieldFill.INSERT)
    private Date createdTime;

    @ApiModelProperty(value = "更新人工号")
    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    @ApiModelProperty(value = "更新时间")
    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
    private Date updatedTime;

}

实现 MetaObjectHandler 接口:

@Slf4j
@Component
public class MyPlusMetaObjectHandler implements MetaObjectHandler {

    @Resource
    private UserUtils userUtils;

    @Override
    public void insertFill(MetaObject metaObject) {
        //填充创建时间 更新时间
        this.strictInsertFill(metaObject, "createdTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updatedTime", Date.class, new Date());
        //填充创建人 更新人
        UserDetail userDetail = userUtils.getUserInfo();
        String userCode;
        if (ObjectUtil.isNull(userDetail)) {
            userCode = UserInfoConstants.SYSTEM;
        } else if (StringUtils.isBlank(userDetail.getUserCode())) {
            userCode = UserInfoConstants.SYSTEM;
        } else {
            userCode = userDetail.getUserCode();
        }
        this.strictInsertFill(metaObject, "createBy", String.class, userCode);
        this.strictInsertFill(metaObject, "updateBy", String.class, userCode);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        //填充更新时间
        this.strictUpdateFill(metaObject, "updatedTime", Date.class, new Date());
        //填充更新人
        UserDetail userDetail = userUtils.getUserInfo();
        String userCode;
        if (ObjectUtil.isNull(userDetail)) {
            userCode = UserInfoConstants.SYSTEM;
        } else if (StringUtils.isBlank(userDetail.getUserCode())) {
            userCode = UserInfoConstants.SYSTEM;
        } else {
            userCode = userDetail.getUserCode();
        }
        //填充更新人
        this.strictUpdateFill(metaObject, "updateBy", String.class, userCode);
    }
}

完成以上两个步骤,我们在使用 MyBatisPlus 的 insert、update 方法时就可以完成相关字段的值自动填充,非常方便。

使用 this.strictUpdateFill 发现的问题:

使用时候发现如果对象字段本身有值的情况下,是不会覆盖填充的,那怎么解决呢?

解决方法:

  • 使用过时的方法:this.setFieldValByName。
  • 使用前设置字段为 null。
  • 自己重写源码方法。

总结:简单的分享了使用 MetaObjectHandler 完成字段值自动填充的方法,虽然很简单但是很实用,希望可以帮助到需要小伙伴。

欢迎提出建议及对错误的地方指出纠正。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值