简介

说明

本文介绍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内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Mybatis-Plus中update()和updateById()将字段更新为null的更多相关文章

  1. ios检查是否nsarray == null

    我收到了JSON的一些响应,并且工作正常,但是我需要检查一些空值,我找到不同的答案,但似乎不工作,我试过了那么发生了什么呢?如何解决这个问题并在我的数组中检查null?

  2. ios – TabBarController返回null

    我在故事板中有一个tabbarcontroller作为初始视图控制器这是如何返回null的本来就是我想要做的为什么我会变空?

  3. Swift解析Json返回值为null的问题

    nil用来给对象赋值,NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值,而NSNull则用于集合操作,虽然它们表示的都是空值,但使用的场合完全不同。

  4. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  5. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. MyBatis-Plus乐观锁插件的用法小结

    乐观锁很乐观,对任何事情都保持着一个乐观的态度,认为别人不会修改数据,所以不会上锁,只是在更新数据的时候,去判断这条数据有没有被别人修改过,这篇文章主要介绍了MyBatis-Plus乐观锁插件的用法,需要的朋友可以参考下

  7. Mybatis-Plus主键生成策略的方法

    本文主要介绍了Mybatis-Plus主键生成策略的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. mybatis-plus自带QueryWrapper自定义sql实现复杂查询实例详解

    MyBatis-Plus是一个MyBatis(opens new window)的增强工具,在 MyBatis的基础上只做增强不做改变,MyBatis可以无损升级为MyBatis-Plus,这篇文章主要给大家介绍了关于mybatis-plus自带QueryWrapper自定义sql实现复杂查询的相关资料,需要的朋友可以参考下

  9. Java的ConcurrentHashMap中不能存储null的原因解析

    众所周知,在Java中Map可以存储null,而ConcurrentHashMap不能存储null值,那么为什么呢?今天通过源码分析给大家详细解读,感兴趣的朋友一起看看吧

  10. 使用JSON.toJSONString格式化成json字符串时保留null属性

    这篇文章主要介绍了使用JSON.toJSONString格式化成json字符串时保留null属性,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部