MetaObjectHandler介绍
MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值。实现这个需求的方法不止一种,在sql层面也可以做到,在建表的时候也可以指定默认值。
1:编写MetaObjectHandler 实现类
编写类实现MetaObjectHandler接口,重写里面的方法就是了。
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* <p>
* 新增,更新时,自动更新字段
* </p>
*
* @author liyh
* @since 2021/2/22
*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//新增操作
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(), metaObject); //创建时间为系统时间
this.setFieldValByName("updateTime",new Date(), metaObject); //更新时间为系统时间
}
@Override public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(), metaObject);
}
}
2:实体类上边加上@TableField(fill = FieldFill.INSERT_UPDATE)
指定进行属性填充的时机(更新、插入、或者更新和插入)
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新时间
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
注意点
这种情况不会进行属性填充,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中设置的值)