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

MP自动填充之MetaObjectHandler核心方法解析

  1. ​this.strictUpdateFill(metaObject, "updateBy", String.class, name);​

    • 目的: 这是 MyBatis-Plus 推荐的、用于在 updateFill​ 方法中执行填充操作的标准方法。它的设计意图是安全地为标记了 @TableField(fill = FieldFill.UPDATE)​ 或 @TableField(fill = FieldFill.INSERT_UPDATE)​ 的字段提供值。
    • 核心行为 (不覆盖): strict*Fill​ 方法系列(包括 strictInsertFill​ 和 strictUpdateFill​)通常会检查目标字段在 metaObject​ 中是否已经有一个非 null​ 的值。如果该字段在调用 updateFill​ 之前,用户已经在业务代码中显式地设置了一个非 null​ 的值,那么 strictUpdateFill​ 通常不会覆盖这个用户设置的值。它旨在填充那些尚未被赋值(仍为 null​)的字段。
    • 类型安全: 它接受 Class<T>​ 参数,并在可能的情况下进行类型检查,提供更好的类型安全性。
    • 总结: 主要用于按需填充,如果字段已有值(被用户提前设置),则尊重该值,不执行覆盖。这符合“填充”的语义——填补空白。
  2. ​this.setFieldValByName("updateTime", nowDate, metaObject);​

    • 目的: 这是 MetaObjectHandler​ 提供的(继承自或包装了 MetaObject​ 的)一个通用的、基于反射的字段设置方法。它的作用就是直接将指定的值 (nowDate​) 设置给指定名称 (updateTime​) 的字段。
    • 核心行为 (覆盖): setFieldValByName​ 不关心目标字段之前的值是什么。它会无条件地尝试将你提供的新值赋给该字段。只要字段存在且类型兼容(或者可以进行类型转换),它就会覆盖掉字段上原有的任何值(无论是 null​ 还是非 null​)。
    • 类型安全: 参数 fieldVal​ 是 Object​ 类型,类型检查主要在运行时进行,编译时类型安全性较低。
    • 总结: 这是一个直接的赋值操作,会强制覆盖字段的原有值。它不具备 strict*Fill​ 方法那种“检查是否需要填充”的逻辑。

主要区别总结:

特性​strictUpdateFill(...)​​setFieldValByName(...)​
核心意图填充字段 (按需提供值)直接设置字段值
覆盖行为通常不覆盖用户已显式设置的非 null​ 值总是覆盖原有值
设计用途​MetaObjectHandler​ 的标准填充方法通用的基于反射的字段设置
类型安全相对较高 (使用 Class<T>​)相对较低 (使用 Object​)
推荐场景实现标准的自动填充逻辑需要强制覆盖字段值或进行通用字段操作时
  • 使用 strictUpdateFill​ 通常是为了实现不覆盖用户已设置值的填充。
  • 使用 setFieldValByName​ 是为了实现强制覆盖字段值的效果。

在 MetaObjectHandler​ 中,当你希望实现标准的、尊重用户输入的自动填充时,应该优先使用 strictInsertFill​ 和 strictUpdateFill​。只有当你明确需要无视字段当前值、强制写入新值时,才考虑使用 setFieldValByName​。

http://www.xdnf.cn/news/144973.html

相关文章:

  • MATLAB技巧——平滑滤波,给出一定的例程和输出参考
  • openGauss手工配置主备
  • Java大师成长计划之第3天:Java中的异常处理机制
  • 神经网络基础[损失函数,bp算法,梯度下降算法 ]
  • Linux 内核网络协议栈中 inet_stream_ops 与 tcp_prot 的深度解析
  • 搜索一个冷门搜索不到可以搜索专栏
  • 回归测试:保障软件质量的重要防线
  • A Comprehensive Survey of Spoken Language Models
  • 《AI大模型趣味实战》构建基于Flask和Ollama的AI助手聊天网站:分布式架构与ngrok内网穿透实现
  • 什么是测试驱动开发(TDD)?
  • C# 综合示例 库存管理系统7 主界面(FormMain)
  • 38 python random
  • 唯创安全:从传统到智能,工厂智能叉车AI防撞系统解决方案
  • 什么是非关系型数据库
  • 如何避免IDEA每次打开新项目都重复配置Maven?
  • 【交互式数据仪表板】Plotly Dash完全指南:从零搭建到部署全流程 | Python数据可视化必备
  • CSS Position 属性完全指南
  • 02.05、链表求和
  • 10前端项目----商品详情页/滚轮行为
  • 第七章.干货干货!!!Langchain4j开发智能体-文生图文生视频
  • QT窗口相关控件及其属性
  • 大模型——快速部署和使用 Deep Research Web UI
  • linux安装单节点Elasticsearch(es),安装可视化工具kibana
  • 如何创建极狐GitLab 私密议题?
  • 【MySQL】(8) 联合查询
  • 常见网络安全攻击类型深度剖析(二):SQL注入攻击——原理、漏洞利用演示与代码加固方法
  • MySQL 存储过程:解锁数据库编程的高效密码
  • 抓包工具Wireshark的应用解析
  • 期货有哪些种类?什么是股指、利率和外汇期货?
  • 日本企业突破机器人感知技术:人形机器人获嗅觉能力