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

MyBatis-Plus 自动填充与更新策略知识清单

核心目的: 自动化处理实体类中公共字段(如创建时间、创建人、更新时间、更新人、租户ID、门店ID等)在插入和更新操作时的赋值,以及控制字段在更新时的行为。

三大关键组件:

  1. ​MetaObjectHandler​ (元数据对象处理器)

    • 角色: 执行者。提供自动填充的具体逻辑实现。

    • 本质: 一个需要用户自己实现的接口 (com.baomidou.mybatisplus.core.handlers.MetaObjectHandler​)。

    • 核心方法:

      • ​insertFill(MetaObject metaObject)​: 在执行标准 MP 插入操作 (insert()​, save()​, saveBatch()​ 等) 之前被调用。
      • ​updateFill(MetaObject metaObject)​: 在执行标准 MP 更新操作 (updateById()​, update()​, saveOrUpdate()​ 的更新部分等) 之前被调用。
    • ​MetaObject metaObject​: 代表当前正在操作的实体对象,可以通过它安全地获取和设置字段值。推荐使用 strictInsertFill​/strictUpdateFill​ 或 setFieldValByName​ 方法。

    • 实现要求:

      • 必须实现 MetaObjectHandler​ 接口。
      • 必须将其注册为 Spring Bean (通常使用 @Component​ 注解),MP 才能发现并使用它。
  2. ​@TableField(fill = ...)​ (自动填充时机)

    • 角色: 触发器标记。标记在实体类的具体字段上,告诉 MetaObjectHandler​ 何时应该尝试填充该字段。

    • 位置: @TableField​ 注解的一个属性。

    • 可选值 (FieldFill​ 枚举):

      • ​DEFAULT​: 不自动填充(默认值)。
      • ​INSERT​: 仅在插入时调用 MetaObjectHandler.insertFill()​ 尝试填充此字段。
      • ​UPDATE​: 仅在更新时调用 MetaObjectHandler.updateFill()​ 尝试填充此字段。
      • ​INSERT_UPDATE​: 插入时调用 insertFill()​,更新时调用 updateFill()​,都会尝试填充此字段。
    • 依赖关系: 如果一个字段没有设置 fill​ 属性(或为 DEFAULT​),即使 MetaObjectHandler​ 中有逻辑,也不会对该字段生效。

  3. ​@TableField(updateStrategy = ...)​ (字段更新策略)

    • 角色: 更新 SQL 控制器。标记在实体类的具体字段上,决定该字段是否包含在 MP 自动生成的标准 UPDATE​ 语句的 SET​ 子句中。

    • 位置: @TableField​ 注解的另一个属性。

    • 可选值 (FieldStrategy​ 枚举):

      • ​ALWAYS​: 无论字段值是否为 null​,总是包含在 SET​ 子句中。
      • ​NOT_NULL​: 仅当字段的 Java 值不为 null​ 时,包含在 SET​ 子句中 (通常是默认策略)。
      • ​NOT_EMPTY​: 仅当字段为 String​ 类型且不为空字符串,或者非 String​ 类型且不为 null​ 时,包含在 SET​ 子句中。
      • ​DEFAULT​: 使用全局配置的默认策略 (通常是 NOT_NULL​)。
      • ​NEVER​: 永远不将此字段包含在 SET​ 子句中,即使 Java 对象中有值。

交互关系与工作流程 (针对标准 MP 操作):

  1. 调用: 代码调用 MP 的标准 insert​ 或 update​ 方法。

  2. 分析: MP 分析实体类注解。

  3. 填充 (Insert/Update 前):

    • 检查字段是否有 @TableField(fill = ...)​ 注解 (非 DEFAULT​)。
    • 如果有,根据 fill​ 的值 (INSERT​, UPDATE​, INSERT_UPDATE​) 决定是否调用已注册的 MetaObjectHandler​ 的 insertFill()​ 或 updateFill()​ 方法。
    • ​MetaObjectHandler​ 执行填充逻辑,修改 metaObject​ (即实体对象) 中对应字段的值。
  4. SQL 生成 (Update 时):

    • MP 准备生成 UPDATE ... SET ... WHERE ...​ 语句。
    • 对于每个非主键字段,检查 @TableField(updateStrategy = ...)​ 的设置。
    • 根据策略 (e.g., NOT_NULL​, NEVER​) 决定是否将该字段及其当前值(可能已被 updateFill​ 修改过)加入 SET​ 子句。
  5. SQL 执行: 执行最终生成的 SQL 语句。

关键点与常见模式:

  • 协同工作: fill​ 和 MetaObjectHandler​ 必须配合使用才能实现自动填充。

  • ​updateStrategy​ 独立性: updateStrategy​ 控制的是 SQL 生成,与 fill​ 是独立但相关的概念。

  • 创建字段模式: 对于 createTime​, createBy​ 等字段,常用组合是:

    @TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NEVER)
    private Date createTime;
    

    解释:插入时自动填充 (fill = INSERT​),并且在任何更新操作中永远不修改该字段 (updateStrategy = NEVER​)。

  • 更新字段模式: 对于 updateTime​, updateBy​ 等字段,常用:

    @TableField(fill = FieldFill.INSERT_UPDATE) // 插入和更新时都填充
    private Date updateTime;
    

    ​updateStrategy​ 通常使用默认 (NOT_NULL​) 或根据需要调整。

  • 适用范围: 这套机制主要作用于基于实体操作的标准 MP 方法。对于自定义 Mapper XML 中的 SQL 语句,它们通常不起作用(MetaObjectHandler​ 可能有限介入 insert/update,但不稳定;updateStrategy​ 无效)。

相关文章:

  • 反爬策略应对指南:淘宝 API 商品数据采集的 IP 代理与请求伪装技术
  • SkyWalking 安装与使用详细总结
  • Zynq 7000的PS侧DDR3地址范围及相关信息
  • 关于开源大模型(如 LLaMA、InternLM、Baichuan、DeepSeek、Qwen 等)二次开发或训练经验的关键点和概述
  • Redis 原子操作
  • 12.ArkUI Scroll的介绍和使用
  • C语言大写转小写2.0
  • 《软件设计师》复习笔记(4.4)——数据库新技术、SQL语言
  • vscode切换Python环境
  • 每日算法-250425
  • 【计算机视觉】CV实践- 基于PaddleSeg的遥感建筑变化检测全解析:从U-Net 3+原理到工程实践
  • Linux的多进程开发与信号处理
  • 【金仓数据库征文】-《深入探索金仓数据库:从基础到实战》
  • 【Qt】文件
  • 2025上海车展:赛轮思AI携手行业领军企业展示xUI——混合式、智能体化的AI助理平台
  • 漏洞管理体系:从扫描评估到修复验证的全生命周期实践
  • RocketMQ 主题与队列的协同作用解析(既然队列存储在不同的集群中,那要主题有什么用呢?)---管理命令、配置安装
  • Spring知识点总结
  • Vue3文件上传组件实战:打造高效的Element Plus上传解决方案,可以对文件进行删除,查看,下载功能。
  • 【HTTP/2:信息高速公路的革命】
  • 四川甘孜州白玉县发生4.9级地震,震源深度10千米
  • 朱守科任西藏自治区政府副主席、公安厅厅长
  • 企业称县政府为拆迁开发借款2亿元逾期未还,河北青龙县:开发搁置,将继续沟通
  • 韩国对华中厚板征收临时反倾销税
  • 全国首个古文学习AI大模型在沪发布,可批阅古文翻译
  • 中国田协通报苏州马拉松“方便门”处理情况:涉事10人禁赛3年