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

 更新时间:2022年08月09日 15:13:12   作者:IT利刃出鞘  
本文主要介绍了Mybatis-Plus中update()和updateById()将字段更新为null,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

简介

说明

本文介绍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)可能会影响其他业务。

所以,此方法也不推荐。 

参考文章

【Mybatis-Plus】使用updateById()、update()将字段更新为null

mybatis-plus更新字段的时候设置为null,忽略实体null判断

到此这篇关于Mybatis-Plus中update()和updateById()将字段更新为null的文章就介绍到这了,更多相关Mybatis-Plus 字段更新为null内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)

    Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)

    这篇文章主要介绍了Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)的相关资料,需要的朋友可以参考下
    2016-09-09
  • idea启动Tomcat时控制台乱码的解决方法(亲测有效)

    idea启动Tomcat时控制台乱码的解决方法(亲测有效)

    最近在idea中启动tomcat出现控制台乱码问题,尝试了很多方法,最后终于解决了,所以下面这篇文章主要给大家介绍了关于idea启动Tomcat时控制台乱码的解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Java延时执行的三种实现方式

    Java延时执行的三种实现方式

    本文主要介绍了Java延时执行的三种实现方式,主要包括了Thread.sleep()方法,.sleep()使用Timer类或使用ScheduledExecutorService接口,感兴趣的可以了解一下
    2023-12-12
  • spring boot项目快速构建的全步骤

    spring boot项目快速构建的全步骤

    这篇文章主要给大家介绍了关于spring boot项目快速构建的全步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Windows下Java调用可执行文件代码实例

    Windows下Java调用可执行文件代码实例

    这篇文章主要介绍了Windows下Java调用可执行文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java编程小实例—数字时钟的实现代码示例

    Java编程小实例—数字时钟的实现代码示例

    正所谓拳不离手曲不离口,java学习的过程中,练习还是要多一点比较好。接下来分享给大家一个Java编程的小实例,供朋友们参考。
    2017-10-10
  • Spring定时任务并行(异步)处理方式

    Spring定时任务并行(异步)处理方式

    这篇文章主要介绍了Spring定时任务并行(异步)处理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Spring中FactoryBean的高级用法实战教程

    Spring中FactoryBean的高级用法实战教程

    FactoryBean是Spring框架的高级特性,允许自定义对象的创建过程,适用于复杂初始化逻辑,本文给大家介绍Spring中FactoryBean的高级用法实战,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Java中实现树形菜单的两种方式

    Java中实现树形菜单的两种方式

    这篇文中,我一共会用两种方式来实现目录树的数据结构,两种写法逻辑是一样的,只是一种适合新手理解,一种看着简单明了但是对于小白不是很好理解,在这里我会很详细的讲解每一步代码,主要是方便新人看懂,弥补曾经自己学习过程中的苦恼,需要的朋友可以参考下
    2023-09-09
  • Spring Boot 入门教程

    Spring Boot 入门教程

    相信很多人都接触spring框架很长时间了,每次搭建spring框架的时候都需要配置好多的jar、xml,做很多繁琐重复的配置,稍微不留神就会出现各种各样的问题。今天给大家介绍一下如何利用Spring Boot快速的搭建一个简单的web应用
    2017-03-03

最新评论