MyBatis jdbcTypeForNull 配置详解

参数定义

jdbcTypeForNull 用于指定:当没有为参数提供特定 JDBC 类型时,null 值应当使用哪个 JDBC 类型

默认值OTHER
Oracle 推荐值NULL
配置位置(原生)mybatis-config.xml<settings>
配置位置(MP)application.ymlmybatis-plus.configuration

为什么需要有这个配置

null 本身没有类型信息,但 JDBC 的 PreparedStatement.setNull(int, int) 必须传入一个 SQL 类型码。MyBatis 因此在参数为 null 时需要一个”兜底类型”,jdbcTypeForNull 就是这个兜底值。

官方说明要点

某些数据库驱动需要指定列的 JDBC 类型;另一些驱动则可以使用 NULLVARCHAROTHER 等通用值。

Oracle 属于前者——它不接受通用类型 OTHER(类型码 1111),因此必须把这个兜底值改成 NULL

配置写法

# MyBatis-Plus(application.yml)
mybatis-plus:
  configuration:
    jdbc-type-for-null: 'null'
<!-- 原生 MyBatis(mybatis-config.xml) -->
<settings>
    <setting name="jdbcTypeForNull" value="NULL" />
</settings>

⚠️ 三个易错点

  1. YAML 必须加引号jdbc-type-for-null: 'null'。裸写 null 会被解析为 Java null,配置不生效且无任何提示。
  2. 值建议统一大写NULL,配置值通常不区分大小写,但大写更规范、也与枚举名一致。
  3. 数据库差异要心里有数:Oracle 必需此项配置,MySQL 一般无需改动。跨库项目应确认目标库的严格程度。

排查经验

出现”无效的列类型 1111”时,先确认配置是否真的生效,再怀疑驱动版本。一个快速的验证方式是在配置类中直接断点或将 JdbcTypeForNull 打印出来——因为 YAML 引号问题会让配置”看起来配了、实际没配”。

参考链接