setting null for parameter #1 with JdbcType OTHER . Try setting a different Jdbc...
错误信息
AI 解决方案
代码报错分析
1. 错误翻译
``
原文:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='saknr', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: Invalid column type: 1111
译文:MyBatis 系统异常:嵌套异常为类型处理异常——无法为映射设置参数(属性 'saknr',输入模式,Java 类型为 Object,JDBC 类型为空)。原因:使用 JDBC 类型 OTHER 设置第1个参数的空值时出错。建议为该参数设置不同的 JDBC 类型,或调整 jdbcTypeForNull 配置属性。根本原因:SQL 异常——无效的列类型 1111。
`
2. 原因分析
参数时,未明确指定其 JDBC 类型(jdbcType=null),导致 MyBatis 默认使用 OTHER 类型(代码 1111),而数据库驱动不支持该类型。 (第 1 个参数)在传入 null 值时未定义 jdbcType。 3. 解决方案
方案一:在 MyBatis 映射文件中指定 jdbcType
`
xml
<!-- 原参数可能类似这样: -->
<!-- <select id="queryData" parameterType="map"> -->
<!-- SELECT FROM table WHERE saknr = #{saknr} -->
<!-- </select> --> <!-- 修改为(明确 jdbcType): -->
<select id="queryData" parameterType="map">
SELECT
FROM table WHERE saknr = #{saknr, jdbcType=VARCHAR}
</select>
` 方案二:在 MyBatis 配置中全局设置
jdbcTypeForNull
`xml
<!-- mybatis-config.xml -->
<configuration>
<settings>
<!-- 将空值的默认 JDBC 类型设为 NULL(支持数据库驱动) -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
</configuration>
` 方案三:在注解中指定类型(使用
@Param + 动态 SQL)
`java
// 适用于注解方式
@Select("SELECT * FROM table WHERE saknr = #{saknr, jdbcType=VARCHAR}")
List<Data> queryData(@Param("saknr") String saknr);
`
4. ️ 预防措施
明确参数类型:为所有可能为 null 的参数显式设置 jdbcType(如 VARCHAR、INTEGER 等),避免依赖默认值。
配置检查:在项目启动时验证 MyBatis 配置,确保 jdbcTypeForNull 已设为数据库支持的合法类型(如 NULL 或 VARCHAR`)。 修复后建议:优先选择方案一(局部修复),若项目中有大量可为空的参数,可结合方案二(全局配置)。