Spring Boot集成MyBatis连接Oracle的核心难点是:ojdbc驱动需手动安装(因Oracle未授权Maven中央仓库托管)、OracleDriver类名易错、XML中SQL语法与MySQL不兼容,三者任一出错即导致ClassNotFoundException或ORA-错误。
spring boot 集成 mybatis 连接 oracle 并使用 xml 编写 sql,核心难点不在“能不能连”,而在于 ojdbc 驱动不可直接从 maven 中央仓库拉取、oracledriver 类名易写错、xml 中的 sql 语法与 mysql 不兼容——这三点不处理好,项目启动就报 classnotfoundexception 或 sqlexception: invalid column name。
为什么 com.oracle:ojdbc8 无法直接 mvn clean install
Oracle 官方明确要求 ojdbc 系列驱动(ojdbc6、ojdbc8、ojdbc11)必须通过 Oracle 账户下载,Maven 中央仓库不托管。直接在 pom.xml 写依赖会触发 Could not find artifact com.oracle:ojdbc8:jar:21.12.0.0 错误。
- 必须手动下载对应 JDK 版本的 JAR:JDK 8 用
ojdbc8.jar,JDK 11+ 推荐ojdbc11.jar - 执行命令安装到本地仓库(路径替换成你实际的 JAR 位置):
mvn install:install-file -DgroupId=com.oracle.database.jdbc -DartifactId=ojdbc8 -Dversion=21.12.0.0 -Dpackaging=jar -Dfile=/path/to/ojdbc8.jar
- Maven 坐标要和安装时一致,否则
dependency找不到——注意新版 groupId 已从com.oracle改为com.oracle.database.jdbc
application.yml 中 Oracle 连接配置的关键项
Oracle 的 JDBC URL 格式和 MySQL 差异明显,写错一个字符就会卡在连接池初始化阶段,日志里只显示 Failed to obtain JDBC Connection,不提示具体哪错。
-
spring.datasource.driver-class-name必须是oracle.jdbc.driver.OracleDriver(旧版)或oracle.jdbc.OracleDriver(12c+ 推荐),不能写成com.oracle.jdbc.Driver等不存在的类 -
spring.datasource.url推荐用 TNS 格式:jdbc:oracle:thin:@//host:port/service_name(双斜杠 + service_name),避免老式 SID 格式(@host:port:SID)在 12c+ 上失效 - 必须显式配置
spring.datasource.hikari.driver-class-name(如果用 HikariCP),否则 Spring Boot 2.4+ 可能因自动推导失败而跳过驱动加载 - Oracle 默认事务隔离级别是
READ_COMMITTED,但 MyBatis 的默认不加事务,若需一致性读,要在@Select或 XML 的fetchSize/resultSetType上做控制
MyBatis XML 文件中 Oracle 专属写法
XML 里的 SQL 不是“写完就能跑”,Oracle 对关键字、分页、空值处理有硬性约束,常见报错如 ORA-00936: missing expression 或 ORA-00918: column ambiguously defined 多半出在这里。
-
ORDER BY后不能跟字段别名(除非用子查询包裹),必须写原始列名或位置序号,例如:ORDER BY 1 DESC是合法的,ORDER BY user_name_alias会报错 - 分页要用
ROWNUM伪列,不能用LIMIT:<select id="listUsers" resulttype="User"> SELECT * FROM ( SELECT a.*, ROWNUM rn FROM ( SELECT id, name FROM users WHERE status = 1 ORDER BY id ) a WHERE ROWNUM #{pageStart} </select> - 插入时若主键是
SEQUENCE,必须用先查再插,且keyProperty要匹配实体字段名,order="BEFORE"不能漏 - Oracle 对大小写敏感(尤其带双引号的标识符),XML 中所有表名、字段名尽量全小写,避免映射失败
Mapper 接口与 XML 文件绑定失败的典型表现
启动没报错,但调用接口返回空集合或 BindingException,大概率是 XML 和接口没对上。
-
namespace必须和 Mapper 接口的全限定名完全一致,包括包路径,例如:namespace="com.example.dao.UserMapper" -
中的id必须和接口方法名严格一致(大小写、下划线都不容错) - 如果用了
@MapperScan("com.example.dao"),确保 XML 文件放在src/main/resources/com/example/dao/下,路径必须和包结构一致;否则得在application.yml显式配mybatis.mapper-locations=classpath:mapper/**/*.xml - Oracle 的
CLOB字段在 XML 中需用jdbcType="CLOB"显式声明,否则 MyBatis 可能映射为空字符串
最常被忽略的是 Oracle 驱动版本与 JDK、Oracle 数据库版本的三者兼容性——比如用 ojdbc8 连 Oracle 21c 是安全的,但连 11g 可能触发隐式类型转换异常;反过来,ojdbc6 在 JDK 11 上会抛 NoClassDefFoundError。动手前先查清楚三者的官方兼容矩阵,比反复试错快得多。











