核心思想
Java 连接 Oracle 数据库,本质上是通过一个“翻译官”(即 JDBC 驱动程序)让 Java 程序能够理解并执行 Oracle 数据库能听懂的 SQL 语言。

整个过程主要分为以下几步:
- 获取 JDBC 驱动:下载 Oracle 提供的 JDBC 驱动程序(一个
.jar文件)。 - 配置环境:将驱动
.jar文件添加到你的 Java 项目中。 - 编写 Java 代码:使用 JDBC API 编写代码,加载驱动、建立连接、执行 SQL、处理结果、关闭资源。
第一步:准备工作
确认 Oracle 11g 服务状态
确保你的 Oracle 11g 数据库服务已经启动,你可以使用 SQL*Plus、PL/SQL Developer 或其他工具连接一下,确认数据库是可访问的。
下载 Oracle JDBC 驱动
这是最关键的一步,你需要从 Oracle 官网下载对应版本的 JDBC 驱动。
-
访问官网:前往 Oracle 官方的 JDBC 驱动下载页面。
(图片来源网络,侵删) -
选择版本:由于你用的是 Oracle 11g,建议下载 Oracle Database 11g Release 2 (11.2) 的 JDBC 驱动,通常这个版本的驱动兼容性最好。
-
选择文件:在下载页面,找到 "Download" 按钮,点击后会进入一个需要登录/同意许可协议的页面,你需要下载的文件通常是:
- ojdbc6.jar:用于 Java 6, 7, 8 (推荐,因为最常用且稳定)。
- ojdbc7.jar:用于 Java 7, 8。
- ojdbc8.jar:用于 Java 8, 11, 17 (如果你的项目使用的是较新版本的 Java,这个也可以,但 ojdbc6 是最经典的选择)。
请务必下载
.jar文件,这是一个 Java 归档文件,里面包含了驱动所需的类。
准备数据库连接信息
你需要从你的 DBA(数据库管理员)或自己配置的数据库中获取以下信息:

- 主机名: 数据库服务器的 IP 地址或域名 (
localhost或168.1.100)。 - 端口号: Oracle 的默认监听端口是
1521。 - SID (System Identifier): 数据库实例的名称,这是 Oracle 11g 最常用的标识方式。
orcl,orcl11g等。 - 服务名: Oracle 10g 及之后版本引入的概念,有时会和 SID 同时使用,对于 11g,两者通常可以互换,但 SID 更传统。
- 用户名: 连接数据库的用户名 (
scott,system)。 - 密码: 对应用户的密码。
第二步:配置项目(添加驱动 JAR)
你需要将下载的 ojdbc6.jar 文件添加到你的 Java 项目中,根据你使用的开发工具,方法略有不同。
使用 Maven (推荐)
这是最现代、最方便的方式,你不需要手动下载和添加 JAR 文件。
-
在你的
pom.xml文件中添加以下依赖,请确保版本号与你下载的驱动版本一致。<dependencies> <!-- Oracle JDBC Driver for 11g --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.4</version> <!-- 请根据你下载的版本修改 --> </dependency> </dependencies> -
保存
pom.xml文件,你的 IDE(如 IntelliJ IDEA 或 Eclipse)会自动下载该依赖。
手动添加 JAR (不使用 Maven)
如果你不使用 Maven,需要手动将 JAR 文件添加到项目的类路径中。
-
在 IntelliJ IDEA 中:
- 右键点击你的项目或模块。
- 选择
Open Module Settings(或F4)。 - 导航到
Libraries-> 号 ->Java。 - 找到并选择你下载的
ojdbc6.jar文件,点击OK。
-
在 Eclipse 中:
- 右键点击你的项目。
- 选择
Build Path->Configure Build Path。 - 在
Libraries标签页下,点击Add External JARs...。 - 找到并选择你下载的
ojdbc6.jar文件,点击Open。
第三步:编写 Java 连接代码
这里提供一个完整的、健壮的 Java 连接示例,代码中包含了详细的注释和最佳实践(如使用 try-with-resources 自动关闭资源)。
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:@localhost:1521:orcl";
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")) {
// 检查连接是否成功
if (conn != null) {
System.out.println("成功连接到 Oracle 数据库!");
}
// 处理查询结果
System.out.println("\n--- EMP 表前5条记录 ---");
while (rs.next()) {
// 通过列名获取数据,更安全、可读性更好
int empno = rs.getInt("EMPNO");
String ename = rs.getString("ENAME");
String job = rs.getString("JOB");
int mgr = rs.getInt("MGR");
java.sql.Date hiredate = rs.getDate("HIREDATE");
double sal = rs.getDouble("SAL");
double comm = rs.getDouble("COMM");
int deptno = rs.getInt("DEPTNO");
System.out.println("EMPNO: " + empno + ", ENAME: " + ename + ", JOB: " + job +
", HIREDATE: " + hiredate);
}
} catch (SQLException e) {
// 捕获并打印 SQL 异常
System.err.println("连接数据库或执行查询时出错!");
e.printStackTrace();
}
System.out.println("\n程序执行完毕。");
}
}
代码解析
-
驱动加载 (隐式):
- 在 JDBC 4.0 (Java 6+) 之后,
Class.forName()已经不再需要,只要你将ojdbc6.jar放在类路径中,DriverManager在尝试获取连接时会自动找到并加载 Oracle 驱动。
- 在 JDBC 4.0 (Java 6+) 之后,
-
数据库 URL:
jdbc:oracle:thin::这是 JDBC URL 的协议部分,thin表示使用 Oracle 的纯 Java 驱动(无需客户端库)。@localhost:1521:orcl:这是连接描述符。- 之后是主机名。
- 之后是端口号。
- 最后一个 之后是 SID。
- 注意:如果你的数据库配置了服务名,URL 可能会是
jdbc:oracle:thin:@localhost:1521:orcl.example.com(服务名)。
-
获取连接:
DriverManager.getConnection(DB_URL, USER, PASS)是核心方法,它尝试使用提供的 URL、用户名和密码建立连接。
-
执行查询:
conn.createStatement()创建一个Statement对象,用于执行 SQL 语句。stmt.executeQuery("...")执行一个查询,返回一个ResultSet对象,它就像一个指向查询结果的游标。
-
处理结果集:
rs.next()将游标移动到下一行,如果存在下一行则返回true。rs.getString("ENAME")等方法根据列名获取该行对应列的值。
-
资源关闭 (最佳实践):
try-with-resources语句确保了Connection,Statement, 和ResultSet在代码块执行完毕后(无论是否发生异常)都会被自动调用close()方法,从而释放数据库资源,这是防止资源泄漏的关键。
第四步:常见问题与解决方案
问题 1:java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
- 原因:JVM 在类路径中找不到 Oracle 驱动的类,这通常是因为
ojdbc6.jar没有被正确添加到项目的类路径中。 - 解决方案:
- 检查
ojdbc6.jar是否确实在你的项目库中。 - 如果你使用的是 Maven,确保
pom.xml中的依赖正确,Maven 已经重新加载了项目。 - 在 IDE 中,确保你执行的是包含了正确库的配置(IntelliJ 中的 "Artifacts" 或 "Run/Debug Configuration")。
- 检查
问题 2:java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@...
- 原因:URL 的格式不正确,或者驱动没有被正确加载。
- 解决方案:
- 仔细检查 URL:确保
jdbc:oracle:thin:@host:port:sid的格式完全正确,特别是主机、端口和 SID。 - 显式加载驱动(调试用):虽然通常不需要,但可以尝试在获取连接前显式加载驱动,这有时能帮助定位问题:
Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
- 仔细检查 URL:确保
问题 3:java.net.ConnectException: Connection refused 或 IO Exception: The Network Adapter could not establish the connection
- 原因:这是最常见的问题,表示你的 Java 程序无法连接到指定的 Oracle 服务器。
- 解决方案:
- 检查 Oracle 服务:确保 Oracle 的监听器服务已经启动,在 Windows 上,检查 "OracleOraDb11g_home1TNSListener" 服务是否正在运行,在 Linux 上,使用
lsnrctl status命令。 - 检查防火墙:确保运行数据库的机器的防火墙允许来自你 Java 程序所在机器的
1521端口的入站连接。 - 检查监听器配置:登录到数据库服务器,使用
netca或直接编辑listener.ora文件,确保监听器正在监听正确的 IP 地址和端口。 - 检查 TNSnames.ora (可选):如果你在客户端机器上配置了
tnsnames.ora文件,确保其中的条目与你的 URL 匹配,但对于简单的thin连接,通常不需要这个文件。
- 检查 Oracle 服务:确保 Oracle 的监听器服务已经启动,在 Windows 上,检查 "OracleOraDb11g_home1TNSListener" 服务是否正在运行,在 Linux 上,使用
问题 4:ORA-01017: invalid username/password; logon denied
- 原因:用户名或密码错误。
- 解决方案:检查代码中的
USER和PASS变量是否与数据库中的用户名和密码完全一致(注意大小写)。
连接 Java 和 Oracle 11g 的流程可以总结为: 下载驱动 -> 配置项目 -> 编写代码 -> 调试连接。
遵循以上步骤,特别是处理好 URL 格式和项目依赖,并使用 try-with-resources 管理资源,你就可以顺利地完成 Java 与 Oracle 11g 的连接了,祝你编码顺利!
