MyBatis-Plus 表字段策略详解:@TableField(updateStrategy) 的配置与使用指南

在 MyBatis-Plus 中,@TableField 注解的 updateStrategy 属性是控制字段更新行为的核心配置之一。合理使用它可以避免脏数据、优化 SQL 性能,甚至解决一些隐蔽的业务问题。本文将详细解析 updateStrategy 的所有策略类型、配置方法及注意事项,助你精准掌握数据更新逻辑!


​​一、@TableField(updateStrategy) 的 4 种配置类型​​

updateStrategy 支持以下四种策略,通过 FieldStrategy 枚举定义:

策略类型 行为描述 适用场景
FieldStrategy.IGNORED ​​忽略判空逻辑​​,无论字段值是否为 null 或空字符串,均会更新到数据库。 需强制覆盖数据库字段(如重置字段为 null)
FieldStrategy.NOT_NULL ​​仅当字段值不为 null 时更新​​,null 值会被忽略。 大多数业务场景,默认策略
FieldStrategy.NOT_EMPTY ​​字段值不为 null 且不为空字符串时更新​​(如 "" 也会被忽略)。 需排除空字符串的场景(如用户名、地址)
FieldStrategy.DEFAULT 使用全局配置(参考 application.yml 中的 field-strategy)。 统一管理所有字段的更新策略

二、配置方法示例​​

1. ​​注解方式(推荐)​​

kotlin 复制代码
java
public class User {
    // 忽略判空,强制更新(即使值为 null)
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private String forceUpdateField;

    // 非 null 才更新(默认策略)
    @TableField(updateStrategy = FieldStrategy.NOT_NULL)
    private Integer age;

    // 非空(null 或 "")才更新
    @TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
    private String username;
}

2. ​​全局配置​​

application.yml 中统一设置:

yaml 复制代码
yaml
mybatis-plus:
  global-config:
    db-config:
      field-strategy: not_empty  # 全局默认策略为非空

​​三、注意事项与常见误区​​

1. ​​IGNORED 的陷阱:慎用强制更新​​

​​问题​​:使用 IGNORED 时,若实体字段为 null,生成的 SQL 会直接更新为 NULL,可能覆盖数据库原有值! ​​建议​​:仅在需要覆盖数据库默认值(如重置密码为 null)时使用,且确保数据库字段允许 NULL。

2. ​​NOT_EMPTY 与空字符串​​

  • 注意​​: 空字符串 "" 会被视为无效值,不会触发更新。若业务中允许空字符串(如状态码),需改用 NOT_NULL。
  • 示例​​: 用户表中的 email 字段若允许空字符串,应配置为 NOT_NULL,否则 NOT_EMPTY 会导致无法更新。

动态更新时的覆盖问题​​

  • 现象​​: 即使字段策略为 NOT_NULL,通过 UpdateWrapper 的 set 方法仍可强制更新 null。
  • 代码示例​​:
sql 复制代码
java
// 强制更新 username 为 null(即使策略是 NOT_NULL)
userMapper.update(null, new LambdaUpdateWrapper<User>()
    .set(User::getUsername, null)
    .eq(User::getId, 1));
  • 解决​​: 避免直接操作 set,或通过业务逻辑校验。

​​全局配置与局部覆盖​​

  • 优先级​​: 字段注解的配置优先级高于全局配置。例如,全局设置为 NOT_EMPTY,但某字段显式配置为 NOT_NULL,则以字段注解为准。
  • 建议​​: 全局配置适合统一管理默认行为,但关键字段建议单独配置。

​​数据库约束与业务逻辑的一致性​​

  • ​​风险​​: 若数据库字段为 NOT NULL,但代码中配置了 NOT_EMPTY,当传入空字符串时可能导致更新失败。
  • 建议​​: 保持数据库约束与代码策略一致,例如:数据库字段允许 NULL 时再使用 NOT_EMPTY。

​​四、总结:如何选择策略?​​

​​场景 推荐策略​​
默认情况(大多数字段) FieldStrategy.NOT_NULL
需排除空字符串(如用户名) FieldStrategy.NOT_EMPTY
强制覆盖字段(如重置状态) FieldStrategy.IGNORED
统一管理所有字段策略 全局配置 + 局部覆盖

微信公众号:【码农小站】 原文链接:blog.mnxz.fun/index.html?...

相关推荐
guodingdingh1 天前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯1 天前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育1 天前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
掘金码甲哥1 天前
这块终端神器, 必须吹爆!
后端
糖果店的幽灵1 天前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
Csvn1 天前
📊 SQL 入门 Day 8:集合操作 — 用 SQL 做数学里的"并交差"
后端·sql
腻害兔1 天前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影1 天前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao121311 天前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔1 天前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程