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

上一篇下一篇

猜你喜欢

热点阅读