使用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 #注意:单引号
网上很多文章都针对自己的场景能解决问题,但真的还是具体问题需要具体分析,最终才能找到适合自己问题的解决之道。