MetaObjectHandler介绍

MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值。实现这个需求的方法不止一种,在sql层面也可以做到,在建表的时候也可以指定默认值。

1:编写MetaObjectHandler 实现类

编写类实现MetaObjectHandler接口,重写里面的方法就是了。

  1. import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
  2. import org.apache.ibatis.reflection.MetaObject;
  3. import org.springframework.stereotype.Component;
  4. import java.util.Date;
  5. /**
  6. * <p>
  7. * 新增,更新时,自动更新字段
  8. * </p>
  9. *
  10. * @author liyh
  11. * @since 2021/2/22
  12. */
  13. @Component
  14. public class MyMetaObjectHandler implements MetaObjectHandler {
  15.   //新增操作
  16. @Override
  17. public void insertFill(MetaObject metaObject) {
  18. this.setFieldValByName("createTime",new Date(), metaObject); //创建时间为系统时间
  19. this.setFieldValByName("updateTime",new Date(), metaObject); //更新时间为系统时间
  20. }
  21. @Override public void updateFill(MetaObject metaObject) {
  22. this.setFieldValByName("updateTime",new Date(), metaObject);
  23. }
  24. }

2:实体类上边加上@TableField(fill = FieldFill.INSERT_UPDATE)

指定进行属性填充的时机(更新、插入、或者更新和插入)

  1. /**
  2. * 创建时间
  3. */
  4. @TableField(value = "create_time", fill = FieldFill.INSERT)
  5. private Date createTime;
  6. /**
  7. * 更新时间
  8. */
  9. @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
  10. private Date updateTime;

注意点

这种情况不会进行属性填充,mybatisPlus指定字段更新,其他字段不会更新

  1. UpdateWrapper<Goods> goodsUpdateWrapper = new UpdateWrapper<>();
  2. goodsUpdateWrapper.eq("id", 30).set("name", "张子行666");
  3. goodsService.update(null, goodsUpdateWrapper);

这种情况会进行属性填充,指定了实体类

  1. Goods goods = new Goods();
  2. goods.setId(30).setName("zzh").setPrice(100D).setRemark("张子行5").setGoodsTypeId(666).setStock(10);
  3. goodsUpdateWrapper.eq("id", 30).set("name", "张子行666");
  4. goodsService.update(goods, goodsUpdateWrapper);

小节

要想属性填充生效,更新时必须携带实体类,例如goodsService.update(goods, goodsUpdateWrapper);更新字段优先级:goodsUpdateWrapper>MetaObjectHandler。(即使goods设置lstock的值也是走goodsUpdateWrapper中设置的值)