MyBatis-Plus中当更新字段为null时,update未将字段设置为null--如何解决呢?
下文笔者讲述mybatis-plus中当字段为null时,无法更新的解决方法分享
字段值设置为null,无法更新的原因
mybatis忽略了null的值
并不将其update到数据表中
异常null简介
mapper.updateById()时, set为null 未生效,其他字段更新。 userInfo.setStatus(OrderEnum.DRAFTS.getType()); userInfo.setSubmitBy(null); userInfo.updateById(11222)
出现这种null不更新的缘由
MyBatis-Plus对字段的验证策略导致
MyBatis-Plus默认进了不是全量更新的策略
默认忽略为null 的字段
修改null无法更新的缘由
//1.修改MyBatis-Plus 全局默认策略
缺点:这样做会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为null
mybatis-plus:
global-config:
#字段策略 0:"忽略判断",1:"非 NULL 判断",2:"非空判断"
field-strategy: 0
//2.修改实体类注解,改变字段的忽略判断
缺点:需要注意数据库字段是否设置为 非null ,如果为非null 也更新不成功
@TableField( updateStrategy = FieldStrategy.IGNORED)
private Date settleTime;
其他说明
FieldStrategy的功能
Mybatis-Plus字段策略FieldStrategy的功能:
在进行新增、更新时
根据配置的策略判断
是否对实体对象的值进行空值判断
如果策略为字段不能为空,则不会对为空的字段进行赋值或更新。
在进行where条件查询时
根据whereStrategy策略判断是否对字段进行空值判断
如果策略为字段不能为空,则为空的字段不会作为查询条件组装到where条件中。
三个配置,对应三种使用场景
insertStrategy : 在insert操作时的字段策略,是否进行空值判断,插入空值
updateStrategy : 在update操作时的字段策略,是否进行空值判断,插入空值
whereStrategy : 在where条件组装时,是否进行控制判断,将空值作为查询条件
FieldStrategy类型简介
FieldStrategy
一共有5种策略类型
public enum FieldStrategy {
IGNORED,
NOT_NULL,
NOT_EMPTY,
DEFAULT,
NEVER;
private FieldStrategy() {
}
}
| 值 | 备注 |
| IGNORED | 忽略空值判断,实体对象的字段是什么值就用什么值更新,支持null值更新操作 |
| NOT_NULL | 进行非NULL判断,也是默认策略,相当于age!=null |
| NOT_EMPTY | 进行非空判断,主要是针对字符串类型,相当于name != null and name != ‘’ |
| NEVER | 从不更新,不管字段是否有值,都不进行更新 |
| DEFAULT | 追随全局配置 |
FieldStrategy配置示例
1.全局策略配置
在全局配置中,三者的默认值都是FieldStrategy.NOT_NULL,即进行空值判断,不对NULL值数据进行处理。
public DbConfig() {
this.idType = IdType.ASSIGN_ID;
this.tableUnderline = true;
this.capitalMode = false;
this.logicDeleteValue = "1";
this.logicNotDeleteValue = "0";
this.insertStrategy = FieldStrategy.NOT_NULL;
this.updateStrategy = FieldStrategy.NOT_NULL;
this.whereStrategy = FieldStrategy.NOT_NULL;
}
在spring boot中可以通过配置属性修改全局字段策略:
mybatis-plus.global-config.db-config.update-strategy=not_null
mybatis-plus.global-config.db-config.insert-strategy=not_null
mybatis-plus.global-config.db-config.where-strategy=not_null
单字段策略配置
在实体对象中
使用@TableField注解
可针对单个字段指定字段策略
示例分享
忽略判断-IGNORED
@TableName(value ="user")
@Data
public class User implements Serializable {
@TableId
private Long id;
private String name;
private Integer age;
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String email;
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


