使用Mybatis-plus更新null字段的解决方案

目录

一、起因

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

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

看最终的配置方式:


一、起因

业务需要对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' #注意:单引号

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


我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

参考文章

  1. https://blog.csdn.net/Weixiaohuai/article/details/88049036
  2. https://blog.csdn.net/forever_insist/article/details/91536452
  3. https://www.cnblogs.com/guanghe/p/9317476.html
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十步杀一人_千里不留行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值