Mybatis,允许更新字段为NULL

@TableField(updateStrategy = FieldStrategy.IGNORED) 详解

@TableField(updateStrategy = FieldStrategy.IGNORED) 是 MyBatis-Plus 中用于控制字段更新行为的注解配置,比 update = "null" 更加灵活和强大。下面我将从多个角度详细讲解这个注解。

1. 基本概念

updateStrategy 属性用于指定字段在更新操作时的处理策略,FieldStrategy.IGNORED 是其中一种策略选项,表示"忽略判断,该字段值不论是否为 null 都会被加入 SQL 更新语句中"。

2. FieldStrategy 的几种策略

MyBatis-Plus 提供了几种字段策略:

策略值 说明
IGNORED 忽略判断,字段值无论是否为 null 都会被更新
NOT_NULL 非 NULL 判断,字段值为 null 则不更新
NOT_EMPTY 非空判断,字段值为 null 或空字符串(“”) 则不更新
DEFAULT 跟随全局配置
NEVER 从不更新,该字段不会被包含在更新语句中

3. IGNORED 策略的特点

强制包含:无论字段值是否为 null,都会包含在 UPDATE 语句中
覆盖全局配置:会覆盖全局的 update-strategy 配置
精确控制:只对标注的特定字段生效
适用场景:当你明确知道某些字段需要支持设置为 null 时使用

4. 代码示例

实体类定义

@Data
@TableName("user")
public class User {
    private Long id;
    
    private String name;
    
    // 使用 IGNORED 策略
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private Integer age;
    
    // 不使用策略注解,将遵循全局配置
    private String email;
}

使用示例

User user = new User();
user.setId(1L);
user.setName("张三");  // 没有策略注解,遵循全局配置
user.setAge(null);    // 明确设置为null,由于是IGNORED策略,会更新为NULL
user.setEmail(null);  // 没有策略注解,默认可能不会更新

userMapper.updateById(user);

生成的SQL

假设全局策略是 NOT_NULL,生成的SQL会是:

UPDATE user SET name='张三', age=NULL WHERE id=1

(email 字段不会被包含,因为它是 null 且没有 IGNORED 策略)

5. 与其他配置的优先级

配置项的优先级从高到低:

  1. 字段上的 @TableField(updateStrategy) 注解
  2. 全局配置的 update-strategy
  3. MyBatis-Plus 默认策略 (默认是 NOT_NULL)

6. 实际应用场景

  1. 允许清空字段:当需要将数据库字段从有值更新为 NULL 时
  2. 特殊字段处理:如需要强制更新某些字段,不论值是什么
  3. 覆盖全局策略:当大多数字段不需要更新 null,但个别字段需要时

7. 注意事项

  1. 数据库约束:确保数据库字段允许 NULL 值,否则会报错
  2. 性能考虑:IGNORED 策略会无条件包含字段,可能增加不必要的更新
  3. 版本要求:此功能需要 MyBatis-Plus 3.1.2 及以上版本
  4. 与 insertStrategy 区别:updateStrategy 只影响更新操作,不影响插入

8. 与全局配置对比

全局配置方式

mybatis-plus:
  global-config:
    db-config:
      update-strategy: ignored

(影响所有实体类的所有字段)

注解方式

@TableField(updateStrategy = FieldStrategy.IGNORED)

(只影响当前字段)

9. 最佳实践建议

  1. 尽量少用全局 IGNORED:通常建议保持全局配置为 NOT_NULL 或 NOT_EMPTY
  2. 精确控制:只在确实需要处理 null 值的字段上使用 IGNORED
  3. 结合使用:可以全局配置为 NOT_NULL,然后在特定字段上使用 IGNORED
  4. 文档说明:在团队项目中,应对使用 IGNORED 策略的字段添加注释说明原因

通过这种方式,你可以非常灵活地控制 MyBatis-Plus 的更新行为,既能满足大多数字段的智能更新需求,又能精确处理需要特殊对待的字段。