MybatisPlus属性自动填充配置之MetaObjectHa
2022-02-23 本文已影响0人
小郭子
来源:CSDN 作者:张子行的博客
链接:https://blog.csdn.net/qq_42875345/article/details/113273533
MetaObjectHandler介绍
MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值。实现这个需求的方法不止一种,在sql层面也可以做到,在建表的时候也可以指定默认值。
1. 编写MetaObjectHandler 实现类
编写类实现MetaObjectHandler接口,重写里面的方法就是了。
/**
* @author 张子行
* @class mybatisPlus属性自动填充,对应的实体类字段上需要加@TableField(fill = FieldFill.INSERT_UPDATE)
*/
@Configuration
@Slf4j
public class autoFillConfig implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
String userId = "用户id";
strictInsertFill(metaObject, "create", String.class, userId);
strictInsertFill(metaObject, "createUserId", String.class, userId);
strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
strictInsertFill(metaObject, "update", String.class, userId);
strictInsertFill(metaObject, "updateUserTime", String.class, userId);
strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
LocalDateTime updateTime = (LocalDateTime) metaObject.getValue("updateTime");
if (updateTime != null && updateTime.isAfter(LocalDateTime.now().minusSeconds(1))) {
return;
}
String userId = CrmServiceUtil.getCurrentUserId();
setFieldValByName("update", userId, metaObject);
setFieldValByName("updateUserId", userId, metaObject);
setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
}
2. 实体类
指定进行属性填充的时机(更新、插入、或者更新和插入)
/**
* 创建人ID
*/
@TableField(fill = FieldFill.INSERT)
private String createUserId;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新人id
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateUserId;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime 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中设置的值)