关于Mybatis-plus设置字段为空的正确写法
作者:sWX375883
Mybatis-plus设置字段为空的写法
使用Mybatis-plus在进行字段更新操作设置字段值为null,使用如下的操作语句:
LambdaUpdateWrapper<Entity> wrapper = new LambdaUpdateWrapper<>(); wrapper.set(Entity::getField,null); wrapper.eq(Entity::getId,1);
发现打印出来的sql只有更新条件,没有field=null,导致更新报错。
这是为什么呢?这是因为Mybatis-plus在更新的时候做了null判断,默认不更新为null的传参字段,但业务如此,我们应该怎么写呢?
方法一:调整全局的验证策略
注入配置 GlobalConfiguration 属性 fieldStrategy
方法二:调整字段验证注解
根据具体情况,在需要更新的字段中调整验证注解,如验证非空:
@TableField(strategy=FieldStrategy.NOT_EMPTY)
方法三:使用 UpdateWrapper
使用以下方法来进行更新操作:
例1.
this.mapper.update(null, Wrappers.<Entity>lambdaUpdate() .set(Entity::getField, null) .eq(Entity::getId, id));
例2.
UpdateWrapper<Entity> updateWrapper = new UpdateWrapper<>(); updateWrapper.set("field", null); updateWrapper.eq("id", 2) this.update(updateWrapper);
这样我们就很容易的处理了使用Mybatis-plus设置字段为空不生效的问题了。
MyBatis-Plus更新字段为null 不生效
在使用mybatis-plus时,发现当前端传入的值为null值时,结果无论怎么操作后端都不执行更新null字段的操作,数据库中的需要被更新为null的字段没有被更新。
原因
通过sql查看发现null字段未在sql中执行,经过查阅发现mybaits-plus在更新时排除了null字段
MyBatis-Plus对字段的验证策略导致的,MyBatis-Plus默认进⾏了不是全量更新的策略,默认忽略为null 的字段的
解决办法
1.如果要更新的字段是String类型
可以把前端传入的null改为空字符串(“”),这样mybati-plus就不会忽略更新该字段
2.使用mybatis-plus的字段注入
在可能为空的Model类字段上方加@TableField(fill = FieldFill.INSERT_UPDATE),问题解决。
如:
/** * 介绍说明(非必填) */ @TableField(fill = FieldFill.UPDATE) private String explanation;
共有四种可选,默认不处理
3.修改MyBatis-Plus 全局默认策略
缺点:这样做会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为null
mybatis-plus: global-config: #字段策略 0:"忽略判断",1:"非 NULL 判断",2:"非空判断" field-strategy: 0
4.修改实体类注解,改变字段的忽略判断
缺点:需要注意数据库字段是否设置为 非null ,如果为非null 也更新不成功
@TableField( updateStrategy = FieldStrategy.IGNORED) private Date settleTime;
( updateStrategy = FieldStrategy.IGNORED) private Date settleTime;
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。