使用Mybatis-plus更新null字段的问题分析及解决过程

 更新时间:2026年05月08日 09:15:10   作者:十步杀一人_千里不留行  
文章主要讲述了在使用MybatisPlus对Oracle数据库的某个字段进行set为Null操作时遇到的问题及解决方案,尝试了全局配置和在字段上加注解等方法均未解决问题,最终通过在el表达式中指定javaType解决了问题

一、起因

业务需要对Oracle数据库的某个字段进行set为Null的操作。

网上找了很多帖子,不外乎那么几种解决办法,但都讲的不完全对,而且对我的场景不适用,大白话就是没用!

二、网上的解决方案,我这里不适用

1.全局配置:这种方案不考虑,因为只有这个表的这个字段需要更新为null,其他的表字段不需要更新null

2.在要更新为null的字段上加上注解 strategy = FieldStrategy.IGNORED。

这个值默认是要进行非空检查的,来看源码:

//字段策略枚举类
public enum FieldStrategy {
    IGNORED(0, "忽略判断"),
    NOT_NULL(1, "非 NULL 判断"),
    NOT_EMPTY(2, "非空判断");
    //省略部分代码
}

我们要的效果是此处忽略非空检查,所以应该如下配置:

@TableField(value = "BIRTHDAY",strategy = FieldStrategy.IGNORED)
private Date birthday;

这里要说一句,其实全局配置也是更改这个默认值,但你改了全局,你觉得行吗?不行滴,小兄弟!!!

重点来了,网上的教程都是到这里就OK了,但不好意思,我的配置了之后依然报错。不行啊,大兄弟!!!

三、真正的解决之道,完美

配置了上面的选项后,依然报错,提示javaType的类型是other,看了一下源码,果然javaType的默认值是other。

接下来重点又来了,对于如何配置javaType,网上的解决方案是自己写sql语句,在sql里面指定javaType,如下所示:

<insert id="save" parameterType="com.tarena.entity.Cost">
  insert into cost values(
      cost_seq.nextval,
      #{name,jdbcType=VARCHAR},
      #{base_duration,jdbcType=INTEGER},
      #{base_cost,jdbcType=DOUBLE}
  )
</insert>

这种方案我没尝试,应该是可以的。但是,但是,但是,我们为什么要用Mybatis Plus吗,大家想想,不就是为了不写SQL吗,如果要写SQL我还废什么话,写SQL他也不会给我报上面的错误。所以,任性,我就是不想写SQL,那么,下面就是终极解决方案。

Mybatis Plus支持通过el表达式指定javaType。先来看下源码怎么说的,源码里面说的很清楚了。

    /**
     * <p>
     * 当该Field为类对象时, 可使用#{对象.属性}来映射到数据表.
     * </p>
     * <p>
     * 支持:@TableField(el = "role, jdbcType=BIGINT)<br>
     * 支持:@TableField(el = "role, typeHandler=com.baomidou.springcloud.typehandler.PhoneTypeHandler")
     * </p>
     */
    String el() default "";

还是不知道怎么用?

看最终的配置方式1

    /** 检验结果单位(码值:lab_result_unit)*/
	@TableField(value="lab_result_unit",strategy = FieldStrategy.IGNORED,el = "labResultUnit,jdbcType=DECIMAL")
	private Integer labResultUnit;

最终配置方式2

修改application.yml:

mybatis-plus:
  configuration:
    jdbc-type-for-null: 'null' #注意:单引号

网上很多文章都针对自己的场景能解决问题,但真的还是具体问题需要具体分析,最终才能找到适合自己问题的解决之道。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java多线程中的异常处理机制简析

    java多线程中的异常处理机制简析

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉,需要了解的朋友可以参考下
    2012-11-11
  • Java实现五子棋单机版

    Java实现五子棋单机版

    这篇文章主要为大家详细介绍了Java实现五子棋单机版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Spring的事务控制实现方法

    Spring的事务控制实现方法

    这篇文章主要为大家详细介绍了Spring的事务控制实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Kotlin与Java 泛型缺陷和应用场景详解

    Kotlin与Java 泛型缺陷和应用场景详解

    这篇文章主要为大家介绍了Kotlin与Java 泛型缺陷和应用场景详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 深入解析Java的Struts框架中的控制器DispatchAction

    深入解析Java的Struts框架中的控制器DispatchAction

    这篇文章主要介绍了深入解析Java的Struts框架中的控制器DispatchAction,Struts是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • Java使用jni清屏功能的实现(只针对cmd)

    Java使用jni清屏功能的实现(只针对cmd)

    JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。这篇文章主要介绍了Java使用jni清屏功能的实现(只针对cmd) ,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • Spring5新功能日志框架Log4j2整合示例

    Spring5新功能日志框架Log4j2整合示例

    这篇文章主要为大家介绍了Spring5新功能之日志框架Log4j2的整合示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

    Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

    这篇文章主要介绍了Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括创建工作簿、工作表、行和单元格,设置样式和字体,合并单元格,添加公式和下拉选择等功能,需要的朋友可以参考下
    2025-03-03
  • 总结Java调用Python程序方法

    总结Java调用Python程序方法

    这篇文章主要介绍了总结Java调用Python程序方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 解决@ConfigurationProperties注解的使用及乱码问题

    解决@ConfigurationProperties注解的使用及乱码问题

    这篇文章主要介绍了解决@ConfigurationProperties注解的使用及乱码问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10

最新评论