目录
- 准备工作
- 安装 Oracle 数据库
- 获取数据库连接信息
- 下载 JDBC 驱动
- 配置项目(Maven/Gradle)
- 核心代码示例
- 基本连接步骤
- 完整可运行的示例代码
- 代码详解
- 最佳实践
- 使用
try-with-resources管理资源 - 使用连接池
- 使用
PreparedStatement防止 SQL 注入 - 处理异常
- 使用
- 常见问题与解决方案
准备工作
在编写代码之前,请确保您已经完成了以下准备工作:

a. 安装 Oracle 数据库
您需要一台可以访问的 Oracle 数据库服务器,这可以是本地安装的 Oracle Database (如 Oracle Express Edition),也可以是远程服务器上的数据库。
b. 获取数据库连接信息
您需要从您的 DBA(数据库管理员)或数据库配置中获取以下关键信息:
- 主机名: 数据库服务器的地址 (
localhost或168.1.100)。 - 端口号: Oracle 的默认监听端口是
1521。 - SID (System Identifier): 数据库的实例名 (
ORCL,XE)。 - Service Name: (可选,现代 Oracle 推荐使用) 数据库的服务名 (
orclpdb1)。 - 用户名: 连接数据库的用户名 (
scott,hr)。 - 密码: 对应用户的密码。
注意: SID 和 Service Name 的区别:
- SID: 是数据库实例的标识,是传统的连接方式。
- Service Name: 是一个更灵活的、基于服务的连接方式,特别是在 RAC (Real Application Clusters) 和 PDB (Pluggable Database) 环境中更为常用,如果不确定,可以尝试使用
Service Name。
c. 下载 JDBC 驱动 (OJDBC)
JDBC 只是一个规范,要连接 Oracle,您需要 Oracle 提供的 JDBC 驱动程序,称为 OJDBC (Oracle JDBC Driver)。

- 访问 Oracle 官方驱动下载页面:Oracle JDBC Drivers
- 根据您的 Oracle 数据库版本和 Java 版本选择合适的驱动,对于 Oracle 19c 数据库,通常选择
ojdbc8.jar(对应 Java 8) 或ojdbc11.jar(对应 Java 11+)。 - 下载
.jar文件。
d. 配置项目
您需要将下载的 OJDBC 驱动添加到您的 Java 项目的类路径中。
手动添加 (适用于 IDE 如 IntelliJ IDEA / Eclipse)
- 在您的项目中创建一个
lib文件夹。 - 将下载的
ojdbcX.jar文件复制到lib文件夹中。 - 在 IDE 中,右键点击项目 ->
Build Path(或Project Structure) ->Libraries->Add JARs...(或Add External JARs...),然后选择lib文件夹中的ojdbcX.jar。
使用 Maven (推荐)
在您的 pom.xml 文件中添加 OJDBC 依赖,Maven 中央仓库可能没有 Oracle 的官方驱动,您需要使用 Oracle 的 Maven 仓库。
<project>
...
<dependencies>
<!-- Oracle JDBC 驱动依赖 -->
<!-- 请根据你的 Oracle 版本和 Java 版本选择合适的坐标 -->
<!-- 对于 Oracle 19c 和 Java 8 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
</dependency>
<!-- 对于 Oracle 21c 和 Java 11+ -->
<!-- <dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<version>21.5.0.0</version>
</dependency> -->
</dependencies>
<!-- Oracle 驱动不在中央仓库,需要配置仓库 -->
<repositories>
<repository>
<id>oracle-maven</id>
<name>Oracle Maven Repository</name>
<url>https://maven.oracle.com</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
</repository>
</repositories>
...
</project>
使用 Gradle
在您的 build.gradle 文件中添加依赖。

plugins {
id 'java'
}
repositories {
mavenCentral()
// 添加 Oracle Maven 仓库
maven {
url 'https://maven.oracle.com'
}
}
dependencies {
// Oracle JDBC 驱动依赖
// 请根据你的 Oracle 版本和 Java 版本选择合适的坐标
// 对于 Oracle 19c 和 Java 8
implementation 'com.oracle.database.jdbc:ojdbc8:19.3.0.0'
// 对于 Oracle 21c 和 Java 11+
// implementation 'com.oracle.database.jdbc:ojdbc11:21.5.0.0'
}
核心代码示例
a. 基本连接步骤
使用 JDBC 连接数据库并执行查询的标准流程如下:
- 加载驱动: 使用
Class.forName()加载 OJDBC 驱动类。 - 获取连接: 使用
DriverManager.getConnection()方法,传入数据库 URL、用户名和密码,创建一个Connection对象。 - 创建语句: 通过
Connection对象创建一个Statement或PreparedStatement对象。 - 执行查询: 使用
Statement.executeQuery()执行 SQL 查询,返回一个ResultSet对象。 - 处理结果集: 遍历
ResultSet,获取查询结果。 - 关闭资源: 按照相反的顺序关闭
ResultSet、Statement和Connection。
b. 完整可运行的示例代码
这个示例将连接到 Oracle 数据库,查询 scott/tiger 用户下的 emp 表,并打印出员工姓名和工资。
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"; // 使用 SID
// private static final String DB_URL = "jdbc:oracle:thin:@localhost:1521/ORCLPDB1"; // 使用 Service Name
private static final String USER = "scott";
private static final String PASS = "tiger";
// ------------------------------------
public static void main(String[] args) {
// 1. 加载驱动 (对于新版本的JDBC驱动,这步通常是可选的,但写上更安全)
try {
Class.forName("oracle.jdbc.OracleDriver");
} catch (ClassNotFoundException e) {
System.err.println("找不到 Oracle JDBC Driver!");
e.printStackTrace();
return;
}
// try-with-resources 语句会自动关闭资源
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ename, sal FROM emp")) {
System.out.println("连接数据库成功!");
System.out.println("员工姓名\t工资");
// 3. 遍历结果集
while (rs.next()) {
// 通过列名获取数据,更具可读性且不易出错
String name = rs.getString("ename");
double salary = rs.getDouble("sal");
// 4. 输出结果
System.out.println(name + "\t\t" + salary);
}
} catch (SQLException e) {
System.err.println("数据库操作出错!");
e.printStackTrace();
}
}
}
c. 代码详解
- 数据库 URL 格式:
jdbc:oracle:thin:: 协议名,表示使用瘦客户端驱动。@主机名:端口号:SID或@主机名:端口号/SERVICE_NAME: 连接标识符。
Class.forName("oracle.jdbc.OracleDriver"): 这行代码的作用是显式地加载驱动类,以便DriverManager能够识别它,从 JDBC 4.0 (Java 6) 开始,如果驱动 jar 文件在类路径中并且实现了Service Provider机制,这步是自动的,但显式调用可以确保兼容性。DriverManager.getConnection(): 这是建立数据库连接的核心方法,它返回一个Connection对象,代表一个与数据库的会话。try-with-resources: 这是一个 Java 7 引入的语法糖,可以自动实现AutoCloseable接口的对象(如Connection,Statement,ResultSet)在try块执行完毕后自动关闭,即使发生异常也能保证资源被释放,是必须遵循的最佳实践。stmt.executeQuery(sql): 用于执行返回结果集的 SQL 查询(如SELECT),对于INSERT,UPDATE,DELETE等不返回结果集的语句,应使用stmt.executeUpdate(),它返回一个整数,表示受影响的行数。rs.next(): 将光标从当前位置向下移动一行,如果新行有效,则返回true,否则返回false。rs.getString("ename"): 通过列名获取指定列的值,这是推荐的方式,因为它不依赖于列的顺序,代码更健壮。
最佳实践
a. 使用 PreparedStatement 防止 SQL 注入
在上面的例子中,我们使用了 Statement,它不能防止 SQL 注入,对于任何包含用户输入的 SQL 查询,都应该使用 PreparedStatement。
// 使用 PreparedStatement 的示例
String sql = "SELECT ename, sal FROM emp WHERE deptno = ?";
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
// 设置参数 (索引从1开始)
pstmt.setInt(1, 10); // 假设用户输入的部门号是 10
try (ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getString("ename") + "\t" + rs.getDouble("sal"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
b. 使用连接池
直接使用 DriverManager.getConnection() 每次都会创建一个新的物理连接,这是一个非常耗时的操作,在高并发应用中,必须使用连接池来复用连接,以提高性能。
流行的连接池库:
- HikariCP: 目前性能最好的连接池,是 Spring Boot 2.x 的默认选择。
- Apache DBCP: 经典的连接池实现。
- C3P0: 另一个广泛使用的连接池。
使用 HikariCP 的示例:
-
添加 Maven 依赖:
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> </dependency> -
配置并使用连接池:
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; public class HikariCPExample { public static void main(String[] args) { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:ORCL"); config.setUsername("scott"); config.setPassword("tiger"); config.setDriverClassName("oracle.jdbc.OracleDriver"); // 连接池配置 (可选) config.setMaximumPoolSize(10); // 最大连接数 config.setMinimumIdle(5); // 最小空闲连接数 config.setConnectionTimeout(30000); // 连接超时时间 (毫秒) // 创建数据源 try (HikariDataSource ds = new HikariDataSource(config); Connection conn = ds.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT 'Hello from HikariCP!' as message FROM dual")) { System.out.println("成功从连接池获取连接!"); if (rs.next()) { System.out.println(rs.getString("message")); } } catch (SQLException e) { e.printStackTrace(); } } }
常见问题与解决方案
问题 1: java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
原因: OJDBC 驱动 jar 文件没有被添加到项目的类路径中。
解决方案: 检查您的 IDE 或构建工具(Maven/Gradle)的配置,确保 ojdbcX.jar 已正确引入。
问题 2: java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@...
原因: 通常是 URL 格式错误,或者 Class.forName() 没有成功执行导致驱动未被加载。
解决方案:
- 仔细检查数据库 URL 是否正确(主机、端口、SID/Service Name)。
- 确保代码中包含了
Class.forName("oracle.jdbc.OracleDriver");。
问题 3: java.sql.SQLException: Invalid username/password; logon denied
原因: 用户名或密码错误。 解决方案: 确认您提供的数据库用户名和密码完全正确,注意大小写。
问题 4: java.net.ConnectException: Connection refused: connect
原因:
- Oracle 数据库服务没有启动。
- 防火墙阻止了端口
1521的连接。 - 主机名或 IP 地址错误。 解决方案:
- 检查 Oracle 服务的状态,确保其正在运行。
- 检查服务器的防火墙设置,允许来自您客户端的
1521端口访问。 - 使用
ping命令测试网络连通性,使用tnsping命令测试 Oracle 监听器是否正常。tnsping ORCL
希望这份详细的指南能帮助您成功使用 Java 连接 Oracle 数据库!
