目录
- 环境准备
- 安装 Java 开发环境 (JDK)
- 安装 Oracle 数据库
- 下载 Oracle JDBC 驱动 (ojdbc.jar)
- JDBC 连接 URL 格式
- 完整代码示例
- 基础版 (不带连接池)
- 使用
try-with-resources(推荐)
- 使用连接池 (最佳实践)
- 什么是连接池?
- 使用 HikariCP 示例
- 常见问题与解决方案
ClassNotFoundException或NoClassDefFoundErrorInvalid URL or password/IO Error: The Network Adapter could not establish the connectionORA-00604: error occurred at recursive SQL level 1
环境准备
在开始编码之前,请确保您的开发环境已经准备就绪。
a. 安装 Java 开发环境 (JDK)
确保您的系统已经安装了 JDK (建议 JDK 8 或更高版本),JAVA_HOME 环境变量已正确配置。
b. 安装 Oracle 数据库
您需要有一个可访问的 Oracle 数据库实例,这可以是:

- 本地安装的 Oracle Database (如 Oracle Express Edition - XE)。
- 云端的 Oracle Database 服务 (如 Oracle Cloud Autonomous Database)。
- Docker 容器中的 Oracle Database。
请记住您的数据库连接信息:
- 主机名:
localhost或数据库服务器的 IP 地址。 - 端口: Oracle 默认端口是
1521。 - 服务名/SID: 这是标识特定数据库实例的名称,对于较新的 Oracle 版本,推荐使用 服务名,您可以在
tnsnames.ora文件中找到它,或者询问您的 DBA。 - 用户名:
scott。 - 密码:
tiger。
c. 下载 Oracle JDBC 驱动 (ojdbc.jar)
这是 Java 程序与 Oracle 数据库通信的桥梁。
- 访问 Oracle 官方下载页面:Oracle JDBC Drivers
- 根据您的 Oracle 数据库版本和 JDK 版本选择合适的驱动,通常选择 "ojdbc8.jar" (适用于 JDK 8) 或 "ojdbc11.jar" (适用于 JDK 11+)。
- 下载
.jar文件。
如何使用驱动?
将下载的 ojdbcX.jar 文件添加到您的项目中,具体方法取决于您的开发工具:
-
IDE (如 IntelliJ IDEA, Eclipse):

- 右键点击您的项目 -> Build Path / Project Structure -> Libraries -> Add External JARs... -> 选择您下载的
ojdbcX.jar文件。
- 右键点击您的项目 -> Build Path / Project Structure -> Libraries -> Add External JARs... -> 选择您下载的
-
Maven 项目: 在您的
pom.xml文件中添加以下依赖。注意: Oracle 驱动在 Maven 中央仓库不可用,您需要从 Oracle Maven 仓库或手动安装。<dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> <!-- 请使用您下载的版本号 --> </dependency>或者,如果您想从 Oracle 的 Maven 仓库拉取:
<repositories> <repository> <id>oracle</id> <url>https://maven.oracle.com</url> </repository> </repositories> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> </dependency> -
Gradle 项目: 在您的
build.gradle文件中添加:implementation group: 'com.oracle.database.jdbc', name: 'ojdbc8', version: '19.3.0.0'
JDBC 连接 URL 格式
连接 URL 是一个字符串,告诉 JDBC 驱动如何连接到数据库,Oracle 的 URL 格式如下:

jdbc:oracle:thin:@<host>:<port>:<service_name_or_SID>
jdbc:oracle:thin:: 指定使用 Oracle 的 "thin" 驱动,这是一个纯 Java 实现的驱动,不依赖 Oracle 客户端库。<host>: 数据库服务器的 IP 地址或主机名。<port>: 数据库监听的端口号,默认为1521。<service_name_or_SID>: 数据库的服务名或 SID。
示例: 假设您的数据库信息如下:
- 主机:
myoraclehost.com - 端口:
1521 - 服务名:
ORCLPDB1
那么连接 URL
jdbc:oracle:thin:@myoraclehost.com:1521:ORCLPDB1
完整代码示例
a. 基础版 (不带连接池)
这个示例展示了最基本、最直接的连接方式。注意: 这种方式没有正确处理资源关闭,不推荐在生产环境中使用。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleJdbcBasicExample {
// 数据库连接信息
private static final String DB_URL = "jdbc:oracle:thin:@localhost:1521:ORCLPDB1";
private static final String USER = "scott";
private static final String PASS = "tiger";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1. 注册 JDBC 驱动 (对于较新的JDK,这一步通常可以省略)
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2. 打开连接
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
// 3. 创建执行语句
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql = "SELECT * FROM emp WHERE ROWNUM <= 5";
rs = stmt.executeQuery(sql);
// 4. 处理结果集
System.out.println("Empno\tEname");
while (rs.next()) {
// 通过列名获取数据,更具可读性
int id = rs.getInt("empno");
String name = rs.getString("ename");
System.out.println(id + "\t" + name);
}
} catch (SQLException e) {
// 处理 JDBC 错误
e.printStackTrace();
} catch (ClassNotFoundException e) {
// 处理 Class.forName 错误
e.printStackTrace();
} finally {
// 5. 关闭资源 (非常重要!)
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("Database connection closed.");
}
}
}
b. 使用 try-with-resources (推荐)
Java 7 引入了 try-with-resources 语句,它可以自动实现 AutoCloseable 接口的资源关闭,使代码更简洁、更安全。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleJdbcTryWithResourcesExample {
private static final String DB_URL = "jdbc:oracle:thin:@localhost:1521:ORCLPDB1";
private static final String USER = "scott";
private static final String PASS = "tiger";
public static void main(String[] args) {
// try-with-resources 会自动关闭 Connection, Statement, 和 ResultSet
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM emp WHERE ROWNUM <= 5")) {
System.out.println("Connected to database successfully!");
System.out.println("Empno\tEname");
while (rs.next()) {
int id = rs.getInt("empno");
String name = rs.getString("ename");
System.out.println(id + "\t" + name);
}
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("Resources are now closed automatically.");
}
}
使用连接池 (最佳实践)
在高并发应用中,频繁地创建和销毁数据库连接会带来巨大的性能开销。连接池 应运而生,它预先
