前言:
在业务项目开发中,对于一些业务数据的操作,我们都会记录创建人、创建时间、更新人、更新时间,如果我们在每个业务方法中都通过 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 完成字段值自动填充的方法,虽然很简单但是很实用,希望可以帮助到需要小伙伴。
欢迎提出建议及对错误的地方指出纠正。