核心步骤
无论使用哪种方式,连接 Oracle 数据库的核心步骤都遵循以下模式:

- 加载 JDBC 驱动:告诉 Java 程序使用哪个数据库的驱动。
- 获取数据库连接:使用 JDBC URL、用户名和密码建立与数据库的连接。
- 创建执行语句:通过连接对象创建
Statement或PreparedStatement来执行 SQL。 - 执行 SQL 并处理结果:执行查询,并遍历
ResultSet获取数据。 - 关闭资源:非常重要! 按照相反的顺序关闭
ResultSet、Statement和Connection,以释放数据库资源。
使用 JDBC(传统方式)
这是最基础也是最核心的方式,所有高级框架(如 MyBatis, Hibernate)的底层都是 JDBC。
准备工作
-
安装 Oracle 数据库:确保你有一个可访问的 Oracle 数据库实例。
-
获取 Oracle JDBC 驱动 (ojdbc.jar):
- 你可以从 Oracle 官网下载,通常需要登录 Oracle 账户。
- Maven 用户:这是最推荐的方式,在
pom.xml中添加依赖,它会自动下载驱动。 - Gradle 用户:在
build.gradle中添加依赖。
Maven (
pom.xml) 示例:
(图片来源网络,侵删)<!-- 请根据你的 Oracle 版本选择合适的 ojdbc 驱动 --> <!-- 对于 Oracle 19c 及以上版本 --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> </dependency> <!-- 或者使用 Universal Connection Pool (UCP) 驱动,它也包含了 JDBC 功能 --> <!-- <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> </dependency> -->注意:
ojdbc8用于 Java 8,ojdbc11用于 Java 11+,请根据你的 JDK 版本选择。
Java 代码示例
以下是一个完整的、可运行的 Java 类,用于测试连接并执行一个简单的查询。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleJdbcTest {
// --- 请根据你的实际情况修改以下信息 ---
private static final String DB_URL = "jdbc:oracle:thin:@//your_host:your_port/your_service_name";
// 或者使用 SID 格式 (较老的方式): "jdbc:oracle:thin:@your_host:your_port:your_sid"
private static final String USER = "your_username";
private static final String PASS = "your_password";
// -----------------------------------------
public static void main(String[] args) {
// try-with-resources 语句,可以自动关闭资源,非常推荐!
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 'Hello from Oracle!' as message FROM DUAL")) {
// 检查连接是否成功
if (conn != null) {
System.out.println("连接 Oracle 成功!");
} else {
System.out.println("连接 Oracle 失败!");
return;
}
// 处理查询结果
while (rs.next()) {
// 通过列名或列索引获取数据
String message = rs.getString("message");
System.out.println("查询结果: " + message);
}
} catch (SQLException e) {
System.err.println("连接 Oracle 数据库时出错!");
e.printStackTrace();
}
}
}
如何填写 JDBC URL?
JDBC URL 的格式至关重要,Oracle 主要支持两种格式:
thin + Service Name (推荐,现代版本)

这是 Oracle Database 10g R2 及以后版本推荐的方式,更灵活。
-
语法:
jdbc:oracle:thin:@//<host>:<port>/<service_name> -
示例:
jdbc:oracle:thin:@//localhost:1521/ORCLCDB -
如何获取 Service Name?
- 使用 SQL*Plus 或其他客户端工具连接数据库。
- 执行 SQL 查询:
SELECT value FROM v$parameter WHERE name = 'service_names'; - 或者查询动态性能视图:
SELECT name FROM v$active_services;
thin + SID (旧版本)
在一些较老的系统或特定配置中可能会用到。
-
语法:
jdbc:oracle:thin:@<host>:<port>:<sid> -
示例:
jdbc:oracle:thin:@localhost:1521:ORCL -
如何获取 SID?
- 连接到数据库后,执行
SELECT instance_name FROM v$instance;的结果通常就是 SID。
- 连接到数据库后,执行
使用连接池(生产环境推荐)
在真实的应用中,频繁地创建和销毁连接是非常消耗资源的,连接池(Connection Pool)可以复用数据库连接,极大地提高性能。
准备工作
除了 Oracle JDBC 驱动,你还需要一个连接池库。HikariCP 是目前性能最好、最流行的选择。
Maven (pom.xml) 示例:
<!-- Oracle JDBC 驱动 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
</dependency>
<!-- HikariCP 连接池 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
Java 代码示例
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleHikariCPTest {
private static HikariDataSource dataSource;
// 静态代码块,在类加载时初始化连接池
static {
HikariConfig config = new HikariConfig();
// --- 请根据你的实际情况修改以下信息 ---
config.setJdbcUrl("jdbc:oracle:thin:@//your_host:your_port/your_service_name");
config.setUsername("your_username");
config.setPassword("your_password");
// 连接池优化配置 (推荐)
config.setDriverClassName("oracle.jdbc.OracleDriver");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
config.setMaximumPoolSize(10); // 最大连接数
config.setMinimumIdle(5); // 最小空闲连接数
config.setConnectionTimeout(30000); // 连接超时时间 (毫秒)
config.setIdleTimeout(600000); // 空闲连接超时时间 (毫秒)
config.setMaxLifetime(1800000); // 连接最大存活时间 (毫秒)
// -----------------------------------------
dataSource = new HikariDataSource(config);
}
public static void main(String[] args) {
// 从连接池中获取一个连接
try (Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 'Hello from Oracle with HikariCP!' as message FROM DUAL")) {
System.out.println("成功从 HikariCP 连接池获取连接!");
while (rs.next()) {
String message = rs.getString("message");
System.out.println("查询结果: " + message);
}
} catch (SQLException e) {
System.err.println("从连接池获取连接或执行查询时出错!");
e.printStackTrace();
}
// 在应用关闭时,关闭整个连接池
// dataSource.close();
}
}
常见问题与排查
-
java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver- 原因:JDBC 驱动
.jar文件没有被添加到项目的 classpath 中。 - 解决:
- 如果你使用 Maven/Gradle,确保
pom.xml或build.gradle中的依赖配置正确,并执行了mvn install或gradle build。 - 如果你手动管理 jar,请确保
ojdbc.jar在运行时(如lib目录下)或编译时(IDE 的 Library)可用。
- 如果你使用 Maven/Gradle,确保
- 原因:JDBC 驱动
-
java.sql.SQLException: IO Error: The Network Adapter could not establish the connection- 原因:网络问题,Java 应用无法访问到指定的 Oracle 数据库主机和端口。
- 排查:
- 检查主机名/IP:
your_host是否正确?是否可以ping通? - 检查端口:
your_port(通常是1521) 是否正确?是否被防火墙阻拦? - 测试监听:在数据库服务器上,使用
lsnrctl status命令检查监听器是否正在运行,以及它是否正在监听正确的端口和协议。
- 检查主机名/IP:
-
java.sql.SQLException: ORA-01017: invalid username/password; logon denied- 原因:用户名或密码错误。
- 解决:仔细核对
USER和PASS变量。
-
java.sql.SQLException: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor- 原因:在 JDBC URL 中指定的
Service Name或SID不正确,或者监听器没有配置该服务。 - 排查:
- 确认你使用的是
Service Name还是SID格式。 - 在数据库服务器上,使用
lsnrctl services命令查看监听器上注册了哪些服务。 - 使用 SQL 查询确认正确的 Service Name 或 SID(见上文)。
- 确认你使用的是
- 原因:在 JDBC URL 中指定的
-
java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:...- 原因:虽然驱动类找到了,但 JDBC URL 的格式可能不被识别,或者
Class.forName()没有被调用(在旧版 JDBC 中需要)。 - 解决:
- 检查 JDBC URL 的拼写,确保完全符合
jdbc:oracle:thin:@//...的格式。 - 在现代 JDBC (4.0+) 中,
DriverManager会自动注册驱动,通常不需要手动Class.forName("oracle.jdbc.OracleDriver"),但如果遇到问题,可以尝试加上这行代码。
- 检查 JDBC URL 的拼写,确保完全符合
- 原因:虽然驱动类找到了,但 JDBC URL 的格式可能不被识别,或者
- 使用 Maven/Gradle 管理依赖:避免手动管理 jar 文件,简化项目配置和迁移。
- 使用连接池:在生产环境中,绝对不要每次都创建新连接,HikariCP 是首选。
- 使用
try-with-resources:确保Connection,Statement,ResultSet等资源在使用后能被自动关闭,防止资源泄漏。 - 将数据库配置外部化:不要将 URL、用户名、密码等硬编码在代码中,应该使用配置文件(如
application.properties)或环境变量来管理。 - 使用
PreparedStatement:对于有参数的 SQL 查询,始终使用PreparedStatement,它可以防止 SQL 注入攻击,并可能提高性能(通过预编译)。
