您的位置:首页 > 娱乐 > 八卦 > 网络广告营销的好处_深圳市房屋管理局官网_河北seo技术_百度热搜广告设计公司

网络广告营销的好处_深圳市房屋管理局官网_河北seo技术_百度热搜广告设计公司

2024/12/23 2:38:31 来源:https://blog.csdn.net/m0_63451467/article/details/142519954  浏览:    关键词:网络广告营销的好处_深圳市房屋管理局官网_河北seo技术_百度热搜广告设计公司
网络广告营销的好处_深圳市房屋管理局官网_河北seo技术_百度热搜广告设计公司

前言:在mybatis-plus的公共字段自动填充功能中有多种填充方式,以下将通过源码对各种填充方法进行剖析

相信了解mybatis-plus公共字段自动填充功能的同学对MetaObjectHandler接口并不陌生,我们把MetaObjectHandler接口整理一下,只关注他的注入字段部分(结论在下面)

public interface MetaObjectHandler {default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {if (Objects.nonNull(fieldVal) && metaObject.hasSetter(fieldName)) {metaObject.setValue(fieldName, fieldVal);}return this;}default MetaObjectHandler strictInsertFill(TableInfo tableInfo, MetaObject metaObject, List<StrictFill<?, ?>> strictFills) {return strictFill(true, tableInfo, metaObject, strictFills);}default MetaObjectHandler strictUpdateFill(TableInfo tableInfo, MetaObject metaObject, List<StrictFill<?, ?>> strictFills) {return strictFill(false, tableInfo, metaObject, strictFills);}default MetaObjectHandler strictFill(boolean insertFill, TableInfo tableInfo, MetaObject metaObject, List<StrictFill<?, ?>> strictFills) {if ((insertFill && tableInfo.isWithInsertFill()) || (!insertFill && tableInfo.isWithUpdateFill())) {strictFills.forEach(i -> {final String fieldName = i.getFieldName();final Class<?> fieldType = i.getFieldType();tableInfo.getFieldList().stream().filter(j -> j.getProperty().equals(fieldName) && fieldType.equals(j.getPropertyType()) &&((insertFill && j.isWithInsertFill()) || (!insertFill && j.isWithUpdateFill()))).findFirst().ifPresent(j -> strictFillStrategy(metaObject, fieldName, i.getFieldVal()));});}return this;}default MetaObjectHandler fillStrategy(MetaObject metaObject, String fieldName, Object fieldVal) {if (getFieldValByName(fieldName, metaObject) == null) {setFieldValByName(fieldName, fieldVal, metaObject);}return this;}default MetaObjectHandler strictFillStrategy(MetaObject metaObject, String fieldName, Supplier<?> fieldVal) {if (metaObject.getValue(fieldName) == null) {Object obj = fieldVal.get();if (Objects.nonNull(obj)) {metaObject.setValue(fieldName, obj);}}return this;}
}

此时有6个方法可以进行字段填充

  • setFieldValByName()
  • strictInsertFill()
  • strictUpdateFill()
  • strictFill()
  • fillStrategy()
  • strictFillStrategy()

我们逐个进行分析

  • setFieldValByName()
    当要注入的值fieldVal不为空,则注入,被fillStrategy()方法代替
  • strictInsertFill()
  • strictUpdateFill()
    以上两个方法都是直接封装后调用strictFille(),可以忽略
  • strictFill()
    校验实体表里的字段与要注入的公共字段的数据的名称和类型是否一致、实体类上是否有@TableField(fill = FieldFill.xxx)注解,再调用strictFillStrategy()方法进行填充
  • fillStrategy()
    在直接调用setFieldValByName()的基础上,做了一层安全校验
    若元数据的该字段为null,且fieldVal不为空才注入
  • strictFillStrategy()
    若元数据的该字段为null,且fieldVal不为空才注入,被strictFill()方法代替

由于fillStrategy()strictFillStrategy()比较相似,可以一下比较这两个方法

default MetaObjectHandler fillStrategy(MetaObject metaObject, String fieldName, Object fieldVal) {//把getFieldValByName()和setFieldValByName()方法体内的代码进行替换并简化if (metaObject.getValue(fieldName) == null) {if (Objects.nonNull(fieldVal)) {metaObject.setValue(fieldName, fieldVal);}}return this;
}default MetaObjectHandler strictFillStrategy(MetaObject metaObject, String fieldName, Supplier<?> fieldVal) {if (metaObject.getValue(fieldName) == null) {Object obj = fieldVal.get();//不同点if (Objects.nonNull(obj)) {metaObject.setValue(fieldName, obj);}}return this;
}

可以看出两个方法只在参数fieldVal上有区别
相比之下strictFillStrategy()fieldVal的校验上更加严格

此时可用的方法只剩strictFill()fillStrategy(),两个方法的不同点在于:
strictFill()的安全校验包含了fillStrategy()的安全校验,同时也判断了数据库中是否有这个字段、实体类上是否有@TableField(fill = FieldFill.xxx)注解

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com