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?...

相关推荐
用户6757049885025 小时前
你知道 Go 结构体和结构体指针调用的区别吗?一文带你彻底搞懂!
后端·go
程序员cxuan5 小时前
读懂 Claude Code 架构分析系列,第一篇,开始!
人工智能·后端·架构
用户6757049885026 小时前
面试官问“装饰器模式”,这样回答薪资多要 3000!
后端
tntxia6 小时前
Geo Scene域名修改引起的一些问题
后端
用户298698530146 小时前
Java 实现 Word 文档加密与权限解除
java·后端
vanuan6 小时前
给你的A2A-Agent加把锁-认证鉴权实战指南
后端
Yeats_Liao6 小时前
14:Servlet中的页面跳转-Java Web
java·后端·架构
未秃头的程序猿6 小时前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试
武子康7 小时前
调查研究-201 Rust 里的 dev build 和 release build:为什么同一份代码性能差这么多?
后端·架构·rust