MP自动填充之MetaObjectHandler核心方法解析
-
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> 参数,并在可能的情况下进行类型检查,提供更好的类型安全性。
- 总结: 主要用于按需填充,如果字段已有值(被用户提前设置),则尊重该值,不执行覆盖。这符合“填充”的语义——填补空白。
-
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。