当前位置: 首页 > news >正文

mybatis-plus公共字段自动填充fillStrategy()方法和strictFill()方法

前言:在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()
    校验实体表里的字段与要注入的公共字段的数据的名称和类型是否一致,再调用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()的安全校验,同时也判断了数据库中是否有这个字段


http://www.mrgr.cn/news/35918.html

相关文章:

  • FTP服务搭建
  • 博科测试IPO上市关注:汽车测试试验业务发展迅速
  • Oracle 相关的工具使用 SQL Developer , sqlplus
  • JAVA输入输出处理技术
  • 2024 Redis 全部
  • Redis结合Caffeine实现二级缓存:提高应用程序性能
  • 【源码+文档+调试讲解】重庆旅游景点数据分析系统python
  • Node-RED-L2-Node-RED在Linux系统启动时自动运行
  • 配置anaconda环境变量的影响
  • YOLOv9改进策略【注意力机制篇】| EMA 即插即用模块,提高远距离建模依赖
  • [半导体检测-2]:了解半导体检测领域的领头羊KLA科磊
  • ROS学习笔记(二):鱼香ROS — 超便捷的一键安装/配置/换源指令(Ubuntu/ROS/ROS2/IDE等)
  • “山不在高”申请商标,看显著性变化!
  • MapStruct 超神进阶用法,让你的代码效率提升十倍!
  • 小程序视频编辑SDK解决方案,轻量化视频制作解决方案
  • 【Python报错已解决】NameError: name ‘os‘ is not defined
  • 【WebGPU Unleashed】1.1 绘制具有定义顶点的三角形
  • 简单线性回归01
  • m6Anet
  • 语音音频(wav)声纹识别-技术实现-python