美文网首页
MybatisPlus属性自动填充配置之MetaObjectHa

MybatisPlus属性自动填充配置之MetaObjectHa

作者: 小郭子 | 来源:发表于2022-02-23 09:06 被阅读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中设置的值)

    相关文章

      网友评论

          本文标题:MybatisPlus属性自动填充配置之MetaObjectHa

          本文链接:https://www.haomeiwen.com/subject/uaiblrtx.html