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; }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。