setting null for parameter #1 with JdbcType OTHER . Try setting a different Jdbc...

2026年01月04日 17:25 processing

错误信息

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

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. 原因分析


  • 根本原因:MyBatis 尝试向数据库传递一个 null 参数时,未明确指定其 JDBC 类型(jdbcType=null),导致 MyBatis 默认使用 OTHER 类型(代码 1111),而数据库驱动不支持该类型。

  • 问题位置:映射参数 saknr(第 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(如 VARCHARINTEGER 等),避免依赖默认值。

  • 配置检查:在项目启动时验证 MyBatis 配置,确保 jdbcTypeForNull 已设为数据库支持的合法类型(如 NULLVARCHAR`)。

  • 工具推荐:使用 MyBatis 插件(如 MyBatis PageHelper)或 IDE 插件(如 MyBatisX)自动检测映射类型缺失问题。

  • 修复后建议:优先选择方案一(局部修复),若项目中有大量可为空的参数,可结合方案二(全局配置)。