当前位置: 首页 > news >正文

开发避坑指南(20) :MyBatis操作Oracle插入NULL值异常“无效列类型1111“解决方案

错误信息

[ERROR] - org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: 
Could not set parameters for mapping: ParameterMapping{property='orderNo', mode=IN, javaType=class java.lang.String, jdbcType=null, 
numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: 
Error setting null for parameter #4 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull 
configuration property. Cause: java.sql.SQLException: 无效的列类型: 1111

错误背景

使用mybatis的insert()方法插入Null值到oracle数据库时报错。

错误分析

从错误信息看,受影响的参数是第4个,相关报错的字段是orderNo,该字段的类型是字符串类型java.lang.String,而当前配置的类型是jdbcType=null。与MySQL不同,Oracle对NULL值的类型校验更严格,当MyBatis向Oracle插入NULL值时,默认会尝试使用JdbcType.OTHER类型,而Oracle驱动无法识别该类型,导致报错"无效的列类型: 1111"。

解决办法

将insert()方法修改为insertSelective(),仅插入非NULL字段值,自动忽略NULL值字段,避免数据库默认值被覆盖。

其他方案

(1)如果是xml中自定的插入语句,需要在XML映射文件指定jdbcType,比如:

<!-- 在参数占位符中显式声明jdbcType -->
<insert id="insertData">INSERT INTO table_name (column1, column2) VALUES (#{param1,jdbcType=VARCHAR}, #{param2,jdbcType=NUMERIC})
</insert>

(2)全局配置jdbcTypeForNull,如

<!-- mybatis-config.xml中配置 -->
<settings><setting name="jdbcTypeForNull" value="NULL"/>
</settings>

(3)MyBatis-Plus配置,如

# application.yml配置
mybatis-plus:configuration:jdbc-type-for-null: 'null'
http://www.dtcms.com/a/319653.html

相关文章:

  • 金仓KingbaseES逻辑架构,与Oracle/MySQL对比
  • Windows Oracle 11 g dmp数据库恢复笔记
  • 一种基于CEEMDAN-小波阈值联合降噪-快速谱峭度(FSK)/基尼谱Ginigram/Autogram的故障诊断 Matlab
  • 【已解决】-bash: mvn: command not found
  • [Oracle] FLOOR()函数
  • Oracle 12c + Pl/Sql windows系统下表空间创建、迁移,dmp备份导入,数据库字符集更改
  • 7. 什么是事件委托
  • 试用一个用v语言编写的单文件数据库vsql
  • RepoCoder:仓库级代码补全的迭代检索生成框架解析与应用前沿
  • 【FreeRTOS】(号外)任务间通讯2: 信号量- Counting Semaphore
  • NFS 服务器与iSCSI 服务器
  • USB枚举介绍 以及linux USBFFS应用demo
  • centos安装python、uv
  • Python包与虚拟环境工具全景对比:从virtualenv到uv的演进
  • python中用xlrd、xlwt读取和写入Excel中的日期值
  • python 常用条件判断语句用法
  • day44 力扣1143.最长公共子序列 力扣1035.不相交的线 力扣53. 最大子序和 力扣392.判断子序列
  • 关于时钟门控ICG的一切(与门及或门门控)
  • [论文阅读] 人工智能 + 软件工程 | 大型语言模型与静态代码分析工具:漏洞检测能力大比拼
  • 分布式事务与分布式锁
  • PCB布线
  • 大队列CT胰腺癌PANDA 模型 医生结合AI后,病灶检测灵敏度提升 8.5%,胰腺癌识别灵敏度提升 20.5%,住院医师性能接近专家水平
  • 补充一种激活函数:GeGLU
  • 关于AI应用案例计算机视觉、自然语言处理、推荐系统和生成式AI四大领域的详细技术分析。
  • 数学建模——粒子群算法
  • Gradle 全解析:Android 构建系统的核心力量
  • JavaScript构建工具
  • CSS overscroll-behavior:解决滚动穿透的 “边界控制” 专家
  • 《Day3-PyTorch 自动微分入门:从计算图到梯度下降的实践指南》
  • Redis中间件(三):Redis存储原理与数据模型