ORACLE数据库结合MyBatis-Plus3.X更新null值失败解决方案

在使用MyBatis-Plus3.3.0与Oracle11g的项目中遇到更新数据时忽略空值的困扰。官方文档提出的三种方案中,推荐采用为每个字段指定更新策略,如@TableField(value=AGE jdbcType=JdbcType.DOUBLE, updateStrategy=FieldStrategy.IGNORED)。但这种方式在实际操作中可能出现错误,提示无效的列类型。可能的原因是未正确指定字段类型。参考Mybatis的JdbcType与数据库类型对应关系进行修正可以解决此问题。

在项目中使用oralce11g以及MyBatis-Plus3.3.0版本,由于MyBatis-Plus的更新表数据的机制默认采用的是忽略空值,即java bean某个属性映射的字段值为空,则update语句中不会出现该字段。看了官方文档,提到三种解决方案:

方案一:更改全局策略是个大坑,万一前端传过来的属性相比新增时有遗漏,则会数据丢失;

方案二:3.0以上版本中将strategy去掉,新增了insertStrategy以及updateStrategy,显然官方文档更新不及时,实测在bean字段上注解@TableField(value="AGE", updateStrategy=FieldStrategr.IGNORE),会报错,控制台显示:无效的列类型:111;

方案三:需要针对项目中所有需要更新NULL值的位置编写个性化方法,过于臃肿及繁琐,因此不考虑。

因此个人最推荐第二种方案,第二种方案产生报错的问题是,没有指定字段类型,那咱们就指定字段类型,例如:

@TableField(value = "AGE", jdbcType = JdbcType.DOUBLE, updateStrategy = FieldStrategy.IGNORED)
private Long age;

另,可参考Mybatis JdbcType与Oracle、MySql数据类型对应列表链接,转自@loongshawn,https://blog.youkuaiyun.com/loongshawn/article/details/50496460

MyBatis-Plus中,`configuration.jdbc-type-for-null` 是一个重要的配置项,主要用于处理SQL参数为 `null` 时的 `JdbcType` 类型。 ### 作用 在MyBatis数据库交互过程中,当SQL语句的参数为 `null` 时,需要指定一个 `JdbcType` 类型。不同的数据库对于 `null` 的处理方式有所不同,默认情况下MyBatis-Plus使用 `JdbcType.OTHER`。然而,某些数据库(如Oracle)可能不支持 `JdbcType.OTHER`,在插入或更新 `null` 时会报错,例如出现 `Error setting null for parameter # with JdbcType OTHER` 的异常。通过配置 `configuration.jdbc-type-for-null`,可以指定当参数为 `null` 时使用的 `JdbcType`,从而避免此类错误 [^1][^3]。 ### 配置方式 #### Java代码配置 可以通过自定义 `ConfigurationCustomizer` 来配置 `jdbcTypeForNull`。示例代码如下: ```java import org.apache.ibatis.session.Configuration; import org.apache.ibatis.type.JdbcType; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusCustomizers; @Configuration public class MyBatisPlusConfig { @Bean public ConfigurationCustomizer configurationCustomizer() { return new MybatisPlusCustomizers() { @Override public void customize(Configuration configuration) { configuration.setJdbcTypeForNull(JdbcType.NULL); } }; } } ``` 上述代码中,通过创建一个 `ConfigurationCustomizer` 实例,并重写 `customize` 方法,将 `jdbcTypeForNull` 设置为 `JdbcType.NULL`,以适应Oracle数据库的需求 [^1]。 #### YAML配置 如果使用YAML配置文件,也可以直接在 `mybatis-plus` 配置下设置 `jdbc-type-for-null`。示例如下: ```yaml mybatis-plus: configuration: jdbc-type-for-null: NULL ``` 这种方式更加简洁,直接在配置文件中指定 `jdbc-type-for-null` 的为 `NULL`。 ### 使用场景 当项目使用的数据库(如Oracle)对 `null` 的 `JdbcType` 有特殊要求时,就需要配置 `configuration.jdbc-type-for-null`。在开发过程中,如果遇到插入或更新 `null` 时出现 `JdbcType` 相关的错误,可通过配置该属性解决问题 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值