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中设置的值)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐