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. 与其他配置的优先级
配置项的优先级从高到低:
- 字段上的
@TableField(updateStrategy)
注解 - 全局配置的
update-strategy
- MyBatis-Plus 默认策略 (默认是 NOT_NULL)
6. 实际应用场景
- 允许清空字段:当需要将数据库字段从有值更新为 NULL 时
- 特殊字段处理:如需要强制更新某些字段,不论值是什么
- 覆盖全局策略:当大多数字段不需要更新 null,但个别字段需要时
7. 注意事项
- 数据库约束:确保数据库字段允许 NULL 值,否则会报错
- 性能考虑:IGNORED 策略会无条件包含字段,可能增加不必要的更新
- 版本要求:此功能需要 MyBatis-Plus 3.1.2 及以上版本
- 与 insertStrategy 区别:updateStrategy 只影响更新操作,不影响插入
8. 与全局配置对比
全局配置方式
mybatis-plus:
global-config:
db-config:
update-strategy: ignored
(影响所有实体类的所有字段)
注解方式
@TableField(updateStrategy = FieldStrategy.IGNORED)
(只影响当前字段)
9. 最佳实践建议
- 尽量少用全局 IGNORED:通常建议保持全局配置为 NOT_NULL 或 NOT_EMPTY
- 精确控制:只在确实需要处理 null 值的字段上使用 IGNORED
- 结合使用:可以全局配置为 NOT_NULL,然后在特定字段上使用 IGNORED
- 文档说明:在团队项目中,应对使用 IGNORED 策略的字段添加注释说明原因
通过这种方式,你可以非常灵活地控制 MyBatis-Plus 的更新行为,既能满足大多数字段的智能更新需求,又能精确处理需要特殊对待的字段。
上一篇: 几秒钟就充满电!科学
下一篇: 暂无数据