插入或更新的字段有 空字符串 或者 null
FieldStrategy 有三种策略:
- IGNORED:忽略
- NOT_NULL:非 NULL,默认策略
- NOT_EMPTY:非空
当用户有更新字段为 空字符串 或者 null
的需求时,需要对 FieldStrategy
策略进行调整:
方式一:调整全局的验证策略
注入配置 GlobalConfiguration 属性 fieldStrategy
application.yml
mybatis-plus:
global-config:
# 字段策略 0:忽略判断,直接拼SQL, 1:非NULL, 2:非空,3:默认;4:永远不加入SQL
field-strategy: 0
注意
这是全局配置,会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为null,可能会影响其他业务数据的正确性。
所以,尽量不要用此法。
方式二:调整字段验证注解
根据具体情况,在需要更新的字段中调整验证注解,如验证非空:
@TableField(strategy=FieldStrategy.NOT_EMPTY)
默认的字段策略会忽略掉,所以我们可以将要设置为null 的字段的策略更改下.例如;
@TableField(strategy = FieldStrategy.IGNORED)
private LocalDateTime offlineTime;
这样再次调用updateById,就ok了
由于做了这个更改,可能后续会有其他人误操作此表的时候,真的将这个字段不知情的情况下置为了null,可能造成严重事故!!!
方式三:使用 UpdateWrapper
(3.x)
使用以下方法来进行更新或插入操作:
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(User::getOfflineTime,null); // 设置null
updateWrapper.set(User::getContent,null); // 设置null
updateWrapper.eq(User::getId,article.getId()); // 必须设置id,否则所有的数据都会被修改
userMapper.update(user, updateWrapper);
或者
userService.lambdaUpdate()
.eq(User::getId, user.getId())
.set(User::getUserName, user.getUserName())
.set(User::getNickName, null)
.update();
例子:根据Id主键更新User这个对象,其中email由前端传参,如果不传、空字符串或者传null,则更新该字段为null;
// 插入或更新的字段有 空字符串 或者 null
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
// 设置更新的记录id,缺少这个会更新所有记录
wrapper.eq(User::getId, User.getId());
// 更新时字段值不传、为空字符串、为null可以更新
wrapper.set(User::getEmail, user.getEmail());
update(user,wrapper);
注:需要设置更新记录的id,否则会更新全部的记录;