spring boot 2.7–3.0 用 ojdbc8(com.oracle.database.jdbc),3.1+ 用 ojdbc11(jdk 17+);url 必须规范,如 jdbc:oracle:thin:@//host:port/service_name;mybatis 需显式配置 typehandler、序列主键及 setbigstringtryclob=true。
oracle jdbc驱动版本和spring boot兼容性怎么选
spring boot 2.7+ 默认不包含 oracle 驱动,必须手动引入;用错版本会直接报 java.lang.classnotfoundexception: oracle.jdbc.oracledriver 或连接时抛 invalid oracle url specified。
- Spring Boot 2.7–3.0:推荐
ojdbc8(对应 JDK 8+,Oracle 12c/19c/21c),Maven 坐标中groupId必须是com.oracle.database.jdbc,旧的oracle.jdbc已废弃 - Spring Boot 3.1+:需用
ojdbc11(JDK 17+),否则运行时报Unsupported major.minor version - 别在
pom.xml里同时引ojdbc8和ojdbc11,MyBatis 会因类加载冲突导致Cannot load driver class: oracle.jdbc.driver.OracleDriver
application.yml 中 Oracle 连接配置的关键字段
Oracle 的 JDBC URL 格式比 MySQL 严格,写错一个字符就无法解析;spring.datasource.url 不支持空格、中文、未转义特殊符号,且必须显式指定服务名(service-name)或 SID(sid)。
- 推荐用服务名方式:
jdbc:oracle:thin:@//host:port/service_name—— 注意双斜杠//和末尾无:SID - 如果连的是老库(Oracle 10g 或未配监听器服务名),才改用 SID:
jdbc:oracle:thin:@host:port:SID -
spring.datasource.hikari.connection-timeout建议设为30000(30秒),Oracle 网络闪断后默认重试策略较弱,太短易报IO Error: The Network Adapter could not establish the connection - 务必加
spring.datasource.hikari.data-source-properties.oracle.net.CONNECT_TIMEOUT=10000,否则 Hikari 无法穿透 Oracle 底层超时控制
MyBatis 的 Oracle 特殊映射怎么写才不翻车
Oracle 没有 boolean 类型,也没有 auto-increment,用 MyBatis 插入/查询时字段类型不匹配,会导致 ORA-00932: inconsistent datatypes 或空值插入失败。
-
NUMBER(1)字段映射 Boolean:在@Select或 XML 的<resultmap></resultmap>里用typeHandler="org.apache.ibatis.type.BooleanTypeHandler",不能只靠 Java 字段类型自动推断 - 主键用序列(sequence):XML 中插入语句要写
SELECT seq_name.NEXTVAL FROM DUAL,并用useGeneratedKeys="false"+keyProperty手动赋值;注解方式需配合@SelectKey,且before=true - 大文本(
CLOB)读取:Java 侧用String接收即可,但写入时若内容超 4000 字符,必须确保 JDBC 驱动已启用SetBigStringTryClob=true(加在 URL 后:?SetBigStringTryClob=true)
MyBatis-Plus 在 Oracle 下的坑点
MyBatis-Plus 自动分页、逻辑删除、自动填充在 Oracle 上表现和 MySQL 不同,不调整会查不出数据或更新失败。
- 分页插件必须配
OracleDialect:mybatis-plus.configuration.dialect=oracle(3.4.3+),否则PageHelper生成的ROWNUMSQL 语法错误,报ORA-00904: "ROWNUM" invalid identifier - 逻辑删除字段类型必须是
NUMBER(1),且全局配置mybatis-plus.global-config.db-config.logic-delete-field对应字段要用@TableLogic显式标注,否则 Oracle 会把字符串"1"当作字面量比较,查不到记录 - 自动填充的
@TableField(fill = FieldFill.INSERT)在 Oracle 中对DATE字段生效,但若数据库列定义为TIMESTAMP WITH TIME ZONE,Java 侧必须用OffsetDateTime,否则插入时报ORA-01861: literal does not match format string
Oracle 的大小写敏感、空字符串等价 null、NLS 设置影响排序这些底层行为,不会在 Spring Boot 启动日志里提示,但会在某次联表查询或模糊匹配时突然暴露。调 SELECT * FROM NLS_SESSION_PARAMETERS 看当前会话字符集,比盲目改代码更省时间。
立即学习“Java免费学习笔记(深入)”;










