首页 > 其他分享 >Mybatis-Plus中update()和updateById()将字段更新为null

Mybatis-Plus中update()和updateById()将字段更新为null

时间:2023-07-05 10:32:20浏览次数:36  
标签:NULL updateById column columnProperty update Plus FieldStrategy null

目录
简介
问题描述
原因
概述
源码分析
所有策略
设置为null的方案
方案1:使用UpdateWrapper更新
方案2:设置全局的field-strategy(不推荐)
方案3:设置某个字段的field-strategy
参考文章

简介
说明
本文介绍Mybatis-Plus无法将字段更新为null的原因及解决方法。

问题描述
用Mybatis-Plus的update()或者updateById()来更新数据时,无法将字段设置为null值(更新后数据还是原来的值)。

原因

概述
默认情况下,Mybatis-Plus在更新时会判断字段是否为null,如果是null,则不设值(不将这个字段拼接为SQL的SET语句)。

源码分析
字段策略的源码:com.baomidou.mybatisplus.annotation.FieldStrategy
package com.baomidou.mybatisplus.annotation;
 
/**
 * 字段策略枚举类
 */
public enum FieldStrategy {
    /**
     * 忽略判断
     */
    IGNORED,
    
    /**
     * 非NULL判断
     */
    NOT_NULL,
    
    /**
     * 非空判断(只对字符串类型字段,其他类型字段依然为非NULL判断)
     */
    NOT_EMPTY,
    
    /**
     * 默认的,一般只用于注解里
     * <p>1. 在全局里代表 NOT_NULL</p>
     * <p>2. 在注解里代表 跟随全局</p>
     */
    DEFAULT,
    
    /**
     * 不加入 SQL
     */
    NEVER
}
可以看到,FieldStrategy.DEFAULT:默认等于FieldStrategy.NOT_NULL,也就是:字段不为Null时才拼接SQL。 

所有策略
实际上,Mybatis-Plus在增删改查时默认对Null等情况都进行了判断。
源码里的注释已经很清楚了,本处不再赘述。源码位置:com.baomidou.mybatisplus.annotation.TableField
package com.baomidou.mybatisplus.annotation;
 
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.mapping.ResultMapping;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.apache.ibatis.type.UnknownTypeHandler;
 
import java.lang.annotation.*;
 
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface TableField {
 
    // 其他代码
 
    /**
     * 字段验证策略之 insert: 当insert操作时,该字段拼接insert语句时的策略
     * <p>
     * IGNORED: 直接拼接 insert into table_a(column) values (#{columnProperty});
     * NOT_NULL: insert into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>)
     * NOT_EMPTY: insert into table_a(<if test="columnProperty != null and columnProperty!=''">column</if>) values (<if test="columnProperty != null and columnProperty!=''">#{columnProperty}</if>)
     * NOT_EMPTY 如果针对的是非 CharSequence 类型的字段则效果等于 NOT_NULL
     *
     * @since 3.1.2
     */
    FieldStrategy insertStrategy() default FieldStrategy.DEFAULT;
 
    /**
     * 字段验证策略之 update: 当更新操作时,该字段拼接set语句时的策略
     * <p>
     * IGNORED: 直接拼接 update table_a set column=#{columnProperty}, 属性为null/空string都会被set进去
     * NOT_NULL: update table_a set <if test="columnProperty != null">column=#{columnProperty}</if>
     * NOT_EMPTY: update table_a set <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>
     * NOT_EMPTY 如果针对的是非 CharSequence 类型的字段则效果等于 NOT_NULL
     *
     * @since 3.1.2
     */
    FieldStrategy updateStrategy() default FieldStrategy.DEFAULT;
 
    /**
     * 字段验证策略之 where: 表示该字段在拼接where条件时的策略
     * <p>
     * IGNORED: 直接拼接 column=#{columnProperty}
     * NOT_NULL: <if test="columnProperty != null">column=#{columnProperty}</if>
     * NOT_EMPTY: <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>
     * NOT_EMPTY 如果针对的是非 CharSequence 类型的字段则效果等于 NOT_NULL
     *
     * @since 3.1.2
     */
    FieldStrategy whereStrategy() default FieldStrategy.DEFAULT;
}

设置为null的方案
需求:根据用户id,设置userName(用户名),并将nickName(昵称)设置为null。

方案1:使用UpdateWrapper更新
@Autowired
private UserService userService;
 
@ApiOperation("修改")
@PostMapping("/edit")
public void edit(User user) {
    userService.lambdaUpdate()
            .eq(User::getId, user.getId())
            .set(User::getUserName, user.getUserName())
            .set(User::getNickName, null)
            .update();
}

方案2:设置全局的field-strategy(不推荐)
application.yml
mybatis-plus:
  global-config:
      # 字段策略 0:忽略判断,直接拼SQL, 1:非NULL, 2:非空,3:默认;4:永远不加入SQL
    field-strategy: 0
注意
这是全局配置,会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为null,可能会影响其他业务数据的正确性。 
所以,尽量不要用此法。

方案3:设置某个字段的field-strategy
方法
只在需要更新为null的字段上,设置忽略策略,如下:
/**
 * 昵称
 */
@TableField(strategy = FieldStrategy.IGNORED)
private String nickName;
更新的方法:
@Autowired
private UserService;
 
@ApiOperation("修改")
@PostMapping("/edit")
public void edit(Long id) {
    User user = new User();
    user.setId(id);
    user.setNickName(null);
 
    userService.lambdaUpdate()
            .eq(User::getId, user.getId())
            .update(user);
}
注意
不同的业务对字段的需求可能不一样,将字段指定为忽略判断(直接拼SQL)可能会影响其他业务。
所以,此方法也不推荐。 

标签:NULL,updateById,column,columnProperty,update,Plus,FieldStrategy,null
From: https://blog.51cto.com/chengzheng183/6629496

相关文章

  • 解决yum update异常中断产生重复包、依赖冲突等问题
    前言事情的起因是执行了yumupdate后,嫌时间长,就手欠儿按了curl+c中断了更新,结果就导致了后面一些列问题问题问题一:Thereareunfinishedtransactionsremaining使用yum相关命令时,一直会有未完成事务的提醒,这时候我们需要完成这个事务。解决方法:使用yum-complete-trans......
  • MyBatisPlus(MP) 使用总结
    mybatisplus(MP)使用总结mybatisplus(MP)是mybatis框架的增强工具,提高开发效率;https://mp.baomidou.com/springboot+mybatis=mapper接口+配置文件1.标准开发@MapperpublicinterfaceUserDaoextendsBaseMapper{}2.分页查询3.条件查询4.条件查询null判断5.查询......
  • cvs update 的输出标志/update常用几个参
    update和checkout在执行中,会为每个文件打印一行提示信息,文件的状态通过前面的单个字符指明:Ufile文件按要求从仓库得到更新。用在那些仓库里面有但你的工作目录没有的文件,以及工作目录里面没有修改过,但旧于仓库的文件。PfileU',但是cvs服务......
  • mysql的update更新及delete删表记录where不带索引字段导致死锁
    为什么会发生这种的事故?InnoDB存储引擎的默认事务隔离级别是「可重复读」,但是在这个隔离级别下,在多个事务并发的时候,会出现幻读的问题,所谓的幻读是指在同一事务下,连续执行两次同样的查询语句,第二次的查询语句可能会返回之前不存在的行。因此InnoDB存储引擎自己实现了行锁,通过......
  • 企业IT管理的关键工具:ADManager Plus
    在当今数字化时代,企业的IT基础设施起着至关重要的作用。为了保证企业的正常运营和高效管理,企业需要一个强大而全面的IT管理解决方案。ADManagerPlus作为一款功能丰富、易于使用的工具,成为了许多企业的首选。本文将介绍ADManagerPlus的重要功能和优势,以及它如何帮助企业提高IT管理......
  • 2023-07-03 禁止uniapp之app端上下滑动出现的回弹效果:"app-plus": {"bounce": "none"}
    前言:uni项目打包到app(以Android为例)上运行,上下滑动页面的时候会出现一个半圆,这就是所谓的退弹,如需关闭可在pages.json文件中的globalStyle中添加一下代码即可:"app-plus":{"bounce":"none"}uniapp关于app-plus的更多配置可参考官网:https://uniapp.dcloud.net.cn/colloc......
  • saveOrUpdate failed with new sequence number
    Domainobject:<hibernate-mapping><classname="Trade"table="Trades"><idname="seqNum"column="SEQ_NUM"type="long"><generatorclass="sequence"><par......
  • Unable to update index for central http://repo1.maven.org/maven2/
    Unable to update index for central http://repo1.maven.org/maven2/ 就是这句,myeclipse启动后控制台输出这句话:解决办法:1.在myeclipse3.4(我用的这个版本)里面Window => Preferences => Myeclipse Enterprise Workbench => Maven4Myeclipse => Maven=>禁用Downl......
  • update-alternatives 的基本用法
    update-alternatives是Ubuntu的软件多版本管理工具,基本用法为,update-alternatives--install<link><name><path><priority>[--force]例如,我要创建一个符号链接/usr/bin/cmake,它指向实际安装路径/usr/local/bin/cmake,则可以使用如下命令,sudoupdate-alternatives......
  • 【WALT】WALT入口 update_task_ravg() 代码详解
    目录【WALT】WALT入口update_task_ravg()代码详解代码展示代码逻辑⑴ 判断是否进入WALT算法⑵ 获取WALT算法中上一个窗口的开始时间⑶如果任务刚初始化结束⑷ 更新任务及CPU的cycles⑸ 更新任务及CPU的demand及pred_demand⑹ 更新CPU的busytime⑺ 更新任务的p......