核心原理
Java 程序本身并不直接与 Oracle 数据库通信,它需要通过一个“桥梁”,这个桥梁就是 JDBC (Java Database Connectivity) API,这个 API 定义了一套标准的接口,而具体的实现则由数据库厂商(如 Oracle)提供,称为 JDBC Driver (驱动程序)。

整个连接过程可以概括为:
- 加载驱动:Java 程序启动时,加载 Oracle 的 JDBC 驱动。
- 建立连接:使用
DriverManager类,提供数据库的 URL、用户名和密码,来创建一个到数据库的物理连接。 - 创建语句:通过连接对象,创建
Statement或PreparedStatement对象,用于执行 SQL 语句。 - 执行查询:使用语句对象执行 SQL,并获取返回的结果集。
- 处理结果:遍历结果集,获取数据。
- 关闭资源:按顺序关闭结果集、语句和连接,释放资源。
详细步骤
第一步:获取 Oracle JDBC 驱动
你需要下载 Oracle 的 JDBC 驱动程序,目前最常用的是 ojdbc8.jar 或 ojdbc11.jar。
- 下载地址:你可以从 Oracle 官方网站下载,但通常需要登录账号,一个更方便的来源是 Maven 中央仓库。
- 版本选择:
- ojdbc8.jar: 用于 Java 8 和 Oracle 数据库 12c 及更高版本。
- ojdbc11.jar: 用于 Java 11 及更高版本。
第二步:配置项目环境
将下载的 JDBC 驱动 JAR 文件添加到你的 Java 项目中,根据你使用的开发工具,方法不同:
-
使用 IDE (如 IntelliJ IDEA 或 Eclipse):
(图片来源网络,侵删)- 右键你的项目 ->
Build Path/Project Structure->Libraries。 - 点击
Add External JARs...或 号。 - 选择你下载的
ojdbc8.jar文件,点击 OK。
- 右键你的项目 ->
-
使用 Maven (推荐): 在你的
pom.xml文件中添加以下依赖,Maven 会自动帮你下载和管理依赖。<!-- 对于 Java 8 --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> <!-- 请使用最新的稳定版本 --> </dependency> <!-- 对于 Java 11+ --> <!-- <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc11</artifactId> <version>21.5.0.0</version> <!-- 请使用最新的稳定版本 --> </dependency> --> -
使用 Gradle: 在你的
build.gradle文件中添加:// 对于 Java 8 implementation 'com.oracle.database.jdbc:ojdbc8:19.3.0.0' // 对于 Java 11+ // implementation 'com.oracle.database.jdbc:ojdbc11:21.5.0.0'
第三步:编写 Java 连接代码
下面是一个完整的、带有资源自动关闭(try-with-resources)的示例代码。
OracleJdbcExample.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleJdbcExample {
// --- 数据库连接信息 ---
// 请根据你的实际情况修改以下四个参数
private static final String DB_URL = "jdbc:oracle:thin:@//<your_oracle_host>:<your_oracle_port>/<your_service_name_or_sid>";
private static final String USER = "<your_username>";
private static final String PASS = "<your_password>";
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 'Hello from Oracle!' as message FROM dual")) {
// 检查连接是否成功
if (conn != null) {
System.out.println("成功连接到 Oracle 数据库!");
}
// 处理结果集
while (rs.next()) {
// 假设查询返回的列名为 "message"
String message = rs.getString("message");
System.out.println("查询结果: " + message);
}
} catch (SQLException e) {
System.err.println("连接 Oracle 数据库失败!");
e.printStackTrace();
}
}
}
数据库 URL 格式详解
代码中的 DB_URL 是最关键的部分,它决定了如何连接到数据库,Oracle 提供了多种 URL 格式:
@//host:port/service_name (推荐,现代 Oracle 数据库首选)
这是最常用和推荐的格式,适用于 Oracle Database 10g 及更高版本。
host: 数据库服务器的 IP 地址或主机名。port: Oracle 监听器端口,默认为1521。service_name: 数据库的服务名,你可以在数据库服务器上使用以下 SQL 查询:SELECT value FROM v$parameter WHERE name = 'service_names';
示例:
jdbc:oracle:thin:@//192.168.1.100:1521/ORCLCDB
@host:port:SID (传统方式)
SID 是数据库的标识符,在较老的 Oracle 版本中更常见。
SID: 数据库的系统标识符,你可以在数据库服务器上使用以下 SQL 查询:SELECT instance_name FROM v$instance;
示例:
jdbc:oracle:thin:@192.168.1.100:1521:ORCL
使用 TNSNames (适用于复杂网络环境)
如果你的网络配置复杂,或者使用了 TNSNAMES.ORA 文件,可以使用这种方式。
-
配置 TNSNAMES.ORA 文件: 在客户端机器上(运行 Java 程序的机器),找到
tnsnames.ora文件(通常在 Oracle 客户端安装目录的network/admin下),添加一个别名:MY_ORACLE_DB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCLCDB) ) ) -
Java 代码中使用别名:
DB_URL变为:jdbc:oracle:thin:@MY_ORACLE_DB
常见问题及解决方案
问题 1:java.sql.SQLException: No suitable driver found
- 原因:JVM 没有加载到 Oracle JDBC 驱动。
- 解决方案:
- 确保
ojdbc8.jar已正确添加到项目的 Classpath 中。 - 在代码中显式加载驱动(虽然现代 JDBC 驱动会自动注册,但显式加载是好的习惯):
// 在 DriverManager.getConnection 之前添加 Class.forName("oracle.jdbc.OracleDriver");
- 确保
问题 2:java.sql.SQLException: IO Error: The Network Adapter could not establish the connection
-
原因:网络不通,Java 程序无法访问到 Oracle 服务器的指定端口。
-
解决方案:
-
检查 IP 地址和端口:确认
DB_URL中的host和port是否正确。 -
检查防火墙:
- 客户端防火墙:确保运行 Java 程序的机器的防火墙允许从你的程序到
host:port的出站连接。 - 服务器防火墙:确保 Oracle 服务器所在网络的防火墙允许来自你客户端 IP 地址到
1521端口的入站连接。
- 客户端防火墙:确保运行 Java 程序的机器的防火墙允许从你的程序到
-
测试网络连通性:在客户端机器上使用
telnet命令测试是否能通到 Oracle 服务器。# Windows telnet <your_oracle_host> 1521 # Linux/macOS nc -zv <your_oracle_host> 1521
如果不通,说明网络问题,请检查网络配置和防火墙。
-
问题 3:java.sql.SQLException: ORA-01017: invalid username/password; logon denied
- 原因:用户名或密码错误。
- 解决方案:仔细核对
DB_URL中的USER和PASS是否与数据库中的用户名和密码完全一致(注意大小写)。
问题 4:java.sql.SQLException: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
- 原因:监听器知道你的请求,但找不到你指定的
service_name或SID。 - 解决方案:
- 确认服务名/SID:在数据库服务器上使用 SQL 查询确认
service_names或instance_name的值是否正确。 - 检查监听器状态:在数据库服务器上,使用
lsnrctl status命令检查监听器是否正在运行,以及它是否正在监听正确的服务名/SID。
- 确认服务名/SID:在数据库服务器上使用 SQL 查询确认
最佳实践
- 使用
try-with-resources:始终使用try-with-resources语句来管理Connection,Statement, 和ResultSet,以防止资源泄漏。 - 使用
PreparedStatement:对于任何包含用户输入的 SQL 查询,都应该使用PreparedStatement来防止 SQL 注入攻击,并提高性能。 - 使用连接池:在 Web 应用或高并发场景中,不要频繁创建和销毁连接,应使用连接池(如 HikariCP, DBCP, C3P0)来复用数据库连接,显著提升性能,Spring Boot 默认集成了 HikariCP。
- 配置
tnsnames.ora:对于生产环境,将复杂的连接字符串配置在tnsnames.ora文件中,而不是硬编码在 Java 代码里,便于维护。
