根本原因是MyBatis-Plus对NULL值未指定JDBC类型,Oracle不支持JdbcType.OTHER(1111),需在application.yml中配置mybatis-plus: configuration: jdbc-type-for-null: 'null'。
Oracle报错“无效的列类型1111”怎么修
根本原因是 mybatis-plus 在 oracle 场景下对 null 值参数未指定 jdbc 类型,oracle 驱动默认尝试用 jdbctype.other(对应类型码 1111)绑定,而该类型不被 oracle 接受。
直接在 application.yml 中补上配置即可解决:
mybatis-plus:
configuration:
jdbc-type-for-null: 'null'
注意:'null' 是字符串字面量,不是 Java 的 null 关键字,必须加单引号;若用 application.properties,写成 mybatis-plus.configuration.jdbc-type-for-null=null 即可(无需引号)。
这个配置生效的前提是:MyBatis-Plus 版本 ≥ 3.4.0,且未手动覆盖 Configuration 实例(比如自定义 SqlSessionFactoryBean 时忘了 setConfiguration)。
连接时报“不支持的字符集 ZHS16GBK”怎么办
这是 Oracle JDBC 驱动缺少 NLS(National Language Support)包导致的,典型现象是启动时抛出 java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK。
必须显式引入 orai18n 依赖,仅靠 ojdbc8 不够:
- 使用 Maven 时,在
pom.xml中添加:
<dependency> <groupId>com.oracle.database.nls</groupId> <artifactId>orai18n</artifactId> <version>21.5.0.0</version> </dependency>
版本必须与 ojdbc8 一致(推荐 21.5.0.0 或 19.21.0.0),否则可能引发 ClassDefNotFound 或乱码;Maven 仓库里 com.oracle.database.nls:orai18n 已取代旧版的 com.oracle:orai18n。
另外检查 JDBC URL 是否含多余参数,如 useUnicode=true 这类 MySQL 风格参数在 Oracle 下无效,反而可能干扰字符集协商。
Oracle ID生成策略要改哪些地方
Oracle 不支持 AUTO_INCREMENT,MyBatis-Plus 默认的 IdType.ASSIGN_ID(雪花算法)虽可用,但若想用序列(SEQUENCE),必须三处同步改:
- 实体类字段上加
@TableId(type = IdType.INPUT),并确保插入前已赋值(比如通过select seq_name.nextval from dual) - 或更常用的是:用
@TableId(type = IdType.NONE)+ 自定义INSERTSQL,SQL 中显式调用seq_name.nextval - 全局配置关闭自动填充 ID:
mybatis-plus.global-config.db-config.id-type=none,避免和局部注解冲突
别碰 IdType.AUTO——它只适配 MySQL/PostgreSQL 的自增主键,Oracle 下会直接报 ORA-02289: sequence does not exist 或空指针。
如果用的是 MyBatis-Plus 3.5+,还可以配合 @KeySequence 注解绑定序列名,但需确认 Oracle 用户有该序列的 SELECT 权限,否则运行时报 ORA-00942。
ojdbc 依赖选哪个版本才稳
别用 ojdbc6 或 ojdbc7,它们不支持 JDK 11+ 和 Oracle 12c 及以上的新协议;Spring Boot 2.6+ / 3.x 项目一律用 ojdbc8。
推荐组合:
- JDK 17 / Spring Boot 3.x →
ojdbc821.5.0.0 +orai18n21.5.0.0 - JDK 8 / Spring Boot 2.5.x →
ojdbc819.21.0.0 +orai18n19.21.0.0
注意 ojdbc8 的 <scope>runtime</scope> 不能省,否则编译期找不到驱动类;同时删掉任何残留的 ojdbc6、classes12.jar 等旧包,Maven 依赖树里出现多个 Oracle 驱动会引发 LinkageError。
最易被忽略的是:Oracle 驱动版本必须和实际数据库版本对齐。比如连 Oracle 19c 却用了 12.2 的驱动,某些数据类型(如 JSON 字段)会直接报 invalid column type,而不是语义清晰的类型不匹配提示。


















