• Mybatis-Plus--update(), updateById()将字段更新为null


    原文网址:Mybatis-Plus--update(), updateById()将字段更新为null_IT利刃出鞘的博客-CSDN博客

    简介

    说明

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

    问题描述

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

    原因

    概述

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

    源码分析

    字段策略的源码:com.baomidou.mybatisplus.annotation.FieldStrategy

    1. package com.baomidou.mybatisplus.annotation;
    2. /**
    3. * 字段策略枚举类
    4. */
    5. public enum FieldStrategy {
    6. /**
    7. * 忽略判断
    8. */
    9. IGNORED,
    10. /**
    11. * 非NULL判断
    12. */
    13. NOT_NULL,
    14. /**
    15. * 非空判断(只对字符串类型字段,其他类型字段依然为非NULL判断)
    16. */
    17. NOT_EMPTY,
    18. /**
    19. * 默认的,一般只用于注解里
    20. * <p>1. 在全局里代表 NOT_NULL</p>
    21. * <p>2. 在注解里代表 跟随全局</p>
    22. */
    23. DEFAULT,
    24. /**
    25. * 不加入 SQL
    26. */
    27. NEVER
    28. }

            可以看到,FieldStrategy.DEFAULT:默认等于FieldStrategy.NOT_NULL,也就是:字段不为Null时才拼接SQL。 

    所有策略

            实际上,Mybatis-Plus在增删改查时默认对Null等情况都进行了判断。

            源码里的注释已经很清楚了,本处不再赘述。源码位置:com.baomidou.mybatisplus.annotation.TableField

    1. package com.baomidou.mybatisplus.annotation;
    2. import org.apache.ibatis.mapping.ParameterMapping;
    3. import org.apache.ibatis.mapping.ResultMapping;
    4. import org.apache.ibatis.type.JdbcType;
    5. import org.apache.ibatis.type.TypeHandler;
    6. import org.apache.ibatis.type.UnknownTypeHandler;
    7. import java.lang.annotation.*;
    8. @Documented
    9. @Retention(RetentionPolicy.RUNTIME)
    10. @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
    11. public @interface TableField {
    12. // 其他代码
    13. /**
    14. * 字段验证策略之 insert: 当insert操作时,该字段拼接insert语句时的策略
    15. * <p>
    16. * IGNORED: 直接拼接 insert into table_a(column) values (#{columnProperty});
    17. * NOT_NULL: insert into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>)
    18. * NOT_EMPTY: insert into table_a(<if test="columnProperty != null and columnProperty!=''">column</if>) values (<if test="columnProperty != null and columnProperty!=''">#{columnProperty}</if>)
    19. * NOT_EMPTY 如果针对的是非 CharSequence 类型的字段则效果等于 NOT_NULL
    20. *
    21. * @since 3.1.2
    22. */
    23. FieldStrategy insertStrategy() default FieldStrategy.DEFAULT;
    24. /**
    25. * 字段验证策略之 update: 当更新操作时,该字段拼接set语句时的策略
    26. * <p>
    27. * IGNORED: 直接拼接 update table_a set column=#{columnProperty}, 属性为null/空string都会被set进去
    28. * NOT_NULL: update table_a set <if test="columnProperty != null">column=#{columnProperty}</if>
    29. * NOT_EMPTY: update table_a set <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>
    30. * NOT_EMPTY 如果针对的是非 CharSequence 类型的字段则效果等于 NOT_NULL
    31. *
    32. * @since 3.1.2
    33. */
    34. FieldStrategy updateStrategy() default FieldStrategy.DEFAULT;
    35. /**
    36. * 字段验证策略之 where: 表示该字段在拼接where条件时的策略
    37. * <p>
    38. * IGNORED: 直接拼接 column=#{columnProperty}
    39. * NOT_NULL: <if test="columnProperty != null">column=#{columnProperty}</if>
    40. * NOT_EMPTY: <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>
    41. * NOT_EMPTY 如果针对的是非 CharSequence 类型的字段则效果等于 NOT_NULL
    42. *
    43. * @since 3.1.2
    44. */
    45. FieldStrategy whereStrategy() default FieldStrategy.DEFAULT;
    46. }

    设置为null的方案

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

    方案1:使用UpdateWrapper更新

    1. @Autowired
    2. private UserService userService;
    3. @ApiOperation("修改")
    4. @PostMapping("/edit")
    5. public void edit(User user) {
    6. userService.lambdaUpdate()
    7. .eq(User::getId, user.getId())
    8. .set(User::getUserName, user.getUserName())
    9. .set(User::getNickName, null)
    10. .update();
    11. }

    方案2:设置全局的field-strategy(不推荐)

    application.yml

    1. mybatis-plus:
    2. global-config:
    3. # 字段策略 0:忽略判断,直接拼SQL, 1:非NULL, 2:非空,3:默认;4:永远不加入SQL
    4. field-strategy: 0

    注意

            这是全局配置,会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为null,可能会影响其他业务数据的正确性。 

            所以,尽量不要用此法。

    方案3:设置某个字段的field-strategy

    方法

    只在需要更新为null的字段上,设置忽略策略,如下:

    1. /**
    2. * 昵称
    3. */
    4. @TableField(strategy = FieldStrategy.IGNORED)
    5. private String nickName;

    更新的方法:

    1. @Autowired
    2. private UserService;
    3. @ApiOperation("修改")
    4. @PostMapping("/edit")
    5. public void edit(Long id) {
    6. User user = new User();
    7. user.setId(id);
    8. user.setNickName(null);
    9. userService.lambdaUpdate()
    10. .eq(User::getId, user.getId())
    11. .update(user);
    12. }

    注意

            不同的业务对字段的需求可能不一样,将字段指定为忽略判断(直接拼SQL)可能会影响其他业务。

            所以,此方法也不推荐。 

    其他网址

    【Mybatis-Plus】使用updateById()、update()将字段更新为null_好好生活_的博客-CSDN博客_updatebyid

    mybatis-plus更新字段的时候设置为null,忽略实体null判断_汤姆猫丶的博客-CSDN博客_mybatisplus 更新字段为null

  • 相关阅读:
    Ansys Zemax | 大功率激光系统的STOP分析2:如何进行光机械设计准备
    Go-Excelize API源码阅读(三十二)—— UnprotectSheet
    深入理解JavaScript堆栈、事件循环、执行上下文和作用域以及闭包
    264. 丑数 II Python
    UE4 C++:事件绑定(输入、碰撞检测、定时器)
    IDEA 使用
    DAY1-深度学习100例-卷积神经网络(CNN)实现mnist手写数字识别
    节日网页HTML代码 学生网页课程设计期末作业下载 清明节大学生网页设计制作成品下载 DW节日网页作业代码下载
    MySQL之索引
    PWA 踩坑 - 第一次加载页面后无法获取CacheStorage某些资源
  • 原文地址:https://blog.csdn.net/feiying0canglang/article/details/125523684