MetaObjectHandler介绍
MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值。实现这个需求的方法不止一种,在sql层面也可以做到,在建表的时候也可以指定默认值。
1:编写MetaObjectHandler 实现类
编写类实现MetaObjectHandler接口,重写里面的方法就是了。
@Component
public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {
private UserProvider userProvider;
@Override
public void insertFill(MetaObject metaObject) {
userProvider = SpringContext.getBean(UserProvider.class);
UserInfo userInfo= userProvider.get();
Object createdPersonId = this.getFieldValByName("createdPersonId", metaObject);
Object createdTime = this.getFieldValByName("createdTime", metaObject);
Object createdPerson = this.getFieldValByName("createdPerson", metaObject);
if (createdPersonId == null) {
this.setFieldValByName("createdPersonId", userInfo.getUserId(), metaObject);
}
if (createdTime == null) {
this.setFieldValByName("createdTime", DateUtil.getNowDate(), metaObject);
}
if (createdPerson == null) {
this.setFieldValByName("createdPerson", userInfo.getUserName(), metaObject);
}
this.setFieldValByName("customerId", "44a0800075", metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
userProvider = SpringContext.getBean(UserProvider.class);
UserInfo userInfo = userProvider.get();
this.setFieldValByName("updatedTime", new Date(), metaObject);
this.setFieldValByName("updatedPersonId", userInfo.getUserId(), metaObject);
this.setFieldValByName("updatedPerson", userInfo.getUserName(), metaObject);
}
}
2:实体类上边加上@TableField(fill = FieldFill.INSERT_UPDATE)
指定进行属性填充的时机(更新、插入、或者更新和插入)
@TableField(fill = FieldFill.INSERT_UPDATE) //增加或修改都会自动赋值
@ApiModelProperty(value = "客户id")
private String customerId;
/**
* 创建时间
*/
@TableField(value = "created_time",fill = FieldFill.INSERT) //只有新增时赋值
private Date createdTime;
/**
* 创建用户
*/
@TableField(value = "created_person",fill = FieldFill.INSERT)
private String createdPerson;
/**
* 创建用户ID
*/
@TableField(value = "created_person_id",fill = FieldFill.INSERT)
private String createdPersonId;
/**
* 修改时间
*/
@TableField(value = "updated_time",fill = FieldFill.UPDATE) //只有更新时赋值
private Date updatedTime;
/**
* 修改用户
*/
@TableField(value = "updated_person",fill = FieldFill.UPDATE)
private String updatedPerson;
/**
* 修改用户id
*/
@TableField(value = "updated_person_id",fill = FieldFill.UPDATE)
private String updatedPersonId;
注意点
这种情况不会进行属性填充,mybatisPlus指定字段更新,其他字段不会更新
UpdateWrapper<Goods> goodsUpdateWrapper = new UpdateWrapper<>();
goodsUpdateWrapper.eq("id", 30).set("name", "张子行666");
goodsService.update(null, goodsUpdateWrapper);
这种情况会进行属性填充,指定了实体类
Goods goods = new Goods();
goods.setId(30).setName("zzh").setPrice(100D).setRemark("张子行5").setGoodsTypeId(666).setStock(10);
goodsUpdateWrapper.eq("id", 30).set("name", "张子行666");
goodsService.update(goods, goodsUpdateWrapper);
小结
要想属性填充生效,更新时必须携带实体类,例如goodsService.update(goods, goodsUpdateWrapper);更新字段优先级:goodsUpdateWrapper>MetaObjectHandler。(即使goods设置lstock的值也是走goodsUpdateWrapper中设置的值)