1、问题
使用
Mybatis-plus
的updateById
去更新实体类的时候,如果实体类中的某个字段为null
,会导致为null
的字段不做更新操作
2、解决办法
- 为字段配置注解
@TableField(updateStrategy = FieldStrategy.IGNORED)
是 MyBatis-Plus框架的注解,用于定义数据库表字段在更新操作中的策略。在 MyBatis-Plus 中,@TableField
注解用于标识实体类中与数据库表字段对应的属性。其中,updateStrategy
属性决定了该字段在执行更新操作时的处理策略。
FieldStrategy 是 MyBatis-Plus 框架中的一个枚举类,用于定义字段更新策略。该枚举类包含以下几个常量:
IGNORED
:意思是"忽略判断",所有值都更新和插入。
NOT_NULL
:当字段为 null 时不进行更新。
NOT_EMPTY
:当字段为 null 或空字符串时不进行更新。
DEFAULT
:使用数据库默认值进行更新。
NEVER
:永远不更新字段的值。
例如,假设有一个实体类 User
,其中有一个属性 name
对应数据库表的字段名为 name
:
public class User {
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String name;
// 其他属性和方法...
}
在执行更新操作时,如果只想更新实体类中的字段为null
时也可以更新,可以使用如下方式:
User user = new User();
user.setId(1L);
user.setAge(25);
user.setName(null)
// name 字段为null,也可以更新name 字段
userService.updateById(user);
需要注意的是,@TableField(updateStrategy = FieldStrategy.IGNORED)
注解只对更新操作生效,对插入操作不生效。如果需要忽略某个字段的插入操作,可以使用其他注解或在插入时手动设置为 null
。
- 全局配置
mybatis-plus.global-config.db-config.update-strategy=ignored
是 MyBatis-Plus 的全局配置属性,用于设置全局的更新策略。在 MyBatis-Plus 中,可以通过全局配置来设置一些共享的属性和行为。其中,db-config
是一个子属性,可以用于配置数据库相关的属性,比如 update-strategy
。update-strategy
属性可以设置默认的更新策略。ignored
表示所有值都更新和插入
,要在应用中使用该全局配置,需要在 MyBatis-Plus 的配置文件(通常为 application.yml
或 application.properties
)中添加以下配置:
mybatis-plus:
global-config:
db-config:
update-strategy: ignored
这样,在整个应用程序中,所有值都更新和插入
需要注意的是,全局配置对应用程序中所有的实体类都生效,如果某些实体类需要自定义不同的更新策略,可以在实体类上直接使用,
@TableField
注解,并设置不同的updateStrategy
属性。这样,实体类级别的配置会覆盖全局的配置。
3、总结
如果字段为null也支持更新操作,则可以:
- 在字段上加注解
#如果在更新操作时,如果字段为null,也要进行更新操作
@TableField(updateStrategy = FieldStrategy.IGNORED)
- 全局配置
#如果在更新操作时,如果字段为null,也要进行更新操作
mybatis-plus.global-config.db-config.update-strategy=ignored