mapper.updateById()时, set为null 未生效,其他字段更新。
puDeclareElements.setStatus(OrderEnum.DRAFTS.getType());
puDeclareElements.setSubmitBy(null);
puDeclareElementsService.updateById(puDeclareElements)
MyBatis-Plus对字段的验证策略导致的,MyBatis-Plus默认进了不是全量更新的策略,默认忽略为null 的字段的
缺点
:这样做会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为null
mybatis-plus:
global-config:
#字段策略 0:"忽略判断",1:"非 NULL 判断",2:"非空判断"
field-strategy: 0
缺点
:需要注意数据库字段是否设置为 非null ,如果为非null 也更新不成功
@TableField( updateStrategy = FieldStrategy.IGNORED)
private Date settleTime;
Mybatis-Plus中FieldStrategy说明
: https://baomidou.com/pages/223848/#tableid
Mybatis-Plus字段策略FieldStrategy的作用主要是在进行新增、更新时,根据配置的策略判断是否对实体对象的值进行空值判断,如果策略为字段不能为空,则不会对为空的字段进行赋值或更新。
同样,在进行where条件查询时,根据whereStrategy策略判断是否对字段进行空值判断,如果策略为字段不能为空,则为空的字段不会作为查询条件组装到where条件中。
三个配置,对应三种使用场景
insertStrategy : 在insert操作时的字段策略,是否进行空值判断,插入空值
updateStrategy : 在update操作时的字段策略,是否进行空值判断,插入空值
whereStrategy : 在where条件组装时,是否进行控制判断,将空值作为查询条件
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.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注解可以针对单个字段指定字段策略。
@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;
}
再次执行上面的单元测试:
PS:后面就不一一举例了。可以看官网。写的很详细。