目录
- 准备工作
- 安装 Oracle 数据库
- 下载 Oracle JDBC 驱动 (OJDBC)
- 配置 Java 开发环境
- 核心步骤详解
- 步骤 1: 添加 JDBC 驱动到项目
- 步骤 2: 加载 JDBC 驱动类
- 步骤 3: 定义数据库连接 URL
- 步骤 4: 建立数据库连接
- 步骤 5: 创建
Statement或PreparedStatement - 步骤 6: 执行 SQL 查询并处理结果集
- 步骤 7: 关闭资源 (非常重要!)
- 完整代码示例
- 示例 1: 使用 JDBC (传统方式)
- 示例 2: 使用连接池 (HikariCP - 推荐方式)
- 常见问题与最佳实践
ClassNotFoundException解决方案- 最佳实践总结
准备工作
在编写 Java 代码之前,确保你的环境已经准备就绪。

a. 安装 Oracle 数据库
你需要一个可用的 Oracle 数据库实例(Oracle Express Edition),并确保你知道以下连接信息:
- 主机名: 数据库服务器的 IP 地址或域名 (
localhost或168.1.100)。 - 端口号: Oracle 数据库的监听端口,默认是
1521。 - SID (System Identifier) 或 Service Name: 这是标识特定数据库实例的名称。
- SID: 是一个较老的方式,
ORCL。 - Service Name: 是 Oracle 推荐的新方式,通常与全局数据库名相同,
orclpdb1。 - 你可以使用
lsnrctl status命令来查看你的数据库实例的 SID 或 Service Name。
- SID: 是一个较老的方式,
- 用户名和密码: 用于连接数据库的数据库用户凭证 (
scott/tiger)。
b. 下载 Oracle JDBC 驱动 (OJDBC)
Java 通过 JDBC 驱动与 Oracle 数据库通信,你需要下载 Oracle 提供的官方 JDBC 驱动。
- 访问 Oracle 官方下载页面:Oracle JDBC Drivers
- 根据你的 Oracle 数据库版本和 Java 版本选择合适的驱动,如果你使用 Oracle 19c,可以选择
ojdbc8.jar(适用于 Java 8) 或ojdbc11.jar(适用于 Java 11+)。 - 下载后,你会得到一个
.jar文件。
c. 配置 Java 开发环境
确保你的系统已经安装了 JDK,并且配置好了 JAVA_HOME 和 PATH 环境变量。
核心步骤详解
步骤 1: 添加 JDBC 驱动到项目
这是最关键的一步,你需要将下载的 ojdbcX.jar 文件添加到你的 Java 项目中,根据你使用的构建工具,方法不同:

使用 Maven (推荐)
在 pom.xml 文件中添加依赖,请根据你下载的驱动版本选择正确的 groupId 和 artifactId,对于较新的版本,通常是:
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version> <!-- 请使用你下载的版本号 -->
</dependency>
使用 Gradle
在 build.gradle 文件中添加依赖:

implementation 'com.oracle.database.jdbc:ojdbc8:19.3.0.0' // 请使用你下载的版本号
手动添加 (IDE 或项目)
如果你不使用构建工具,可以直接将 ojdbcX.jar 文件复制到你的项目中,然后在 IDE (如 IntelliJ IDEA 或 Eclipse) 中将其添加为库。
- IntelliJ IDEA:
File->Project Structure->Modules->Dependencies-> ->JARs or directories...,然后选择你的ojdbcX.jar文件。 - Eclipse: 右键你的项目 ->
Build Path->Configure Build Path->Libraries->Add External JARs...,然后选择你的ojdbcX.jar文件。
步骤 2: 加载 JDBC 驱动类
在 JDBC 4.0 (Java 6+) 之后,这一步通常是自动完成的,你不需要再显式地调用 Class.forName(),但为了兼容性和理解原理,了解它是有帮助的。
// 显式加载驱动类 (在 JDBC 4.0 之前是必须的)
Class.forName("oracle.jdbc.OracleDriver");
步骤 3: 定义数据库连接 URL
URL 的格式定义了如何连接到数据库。
使用 SID 的格式:
jdbc:oracle:thin:@<hostname>:<port>:<SID>
使用 Service Name 的格式 (推荐):
jdbc:oracle:thin:@<hostname>:<port>/<service_name>
示例: 假设你的数据库信息如下:
- 主机名:
localhost - 端口:
1521 - Service Name:
orclpdb1
URL
jdbc:oracle:thin:@localhost:1521/orclpdb1
步骤 4: 建立数据库连接
使用 DriverManager 类的 getConnection() 方法来建立连接,你需要提供 URL、用户名和密码。
String url = "jdbc:oracle:thin:@localhost:1521/orclpdb1";
String user = "scott";
String password = "tiger";
Connection connection = null;
try {
connection = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接成功!");
} catch (SQLException e) {
System.err.println("数据库连接失败!");
e.printStackTrace();
}
步骤 5: 创建 Statement 或 PreparedStatement
一旦有了 Connection 对象,你就可以创建一个 Statement 对象来执行 SQL 语句。
Statement: 用于执行静态的、不带参数的 SQL 语句。注意:不要使用Statement来拼接 SQL,这会导致 SQL 注入漏洞!PreparedStatement(强烈推荐): 用于执行预编译的 SQL 语句,它可以包含参数占位符 (),能有效防止 SQL 注入,并且对于需要多次执行的 SQL 语句性能更好。
// 使用 PreparedStatement (推荐) String sql = "SELECT ename, sal FROM emp WHERE deptno = ?"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, 10); // 设置第一个参数 (?) 的值为 10
步骤 6: 执行 SQL 查询并处理结果集
使用 executeQuery() 方法执行查询语句,它会返回一个 ResultSet 对象,该对象包含了查询的结果。
ResultSet rs = pstmt.executeQuery();
// 遍历结果集
while (rs.next()) {
// 通过列名获取数据,更具可读性且不易出错
String name = rs.getString("ename");
double salary = rs.getDouble("sal");
System.out.println("姓名: " + name + ", 薪资: " + salary);
}
步骤 7: 关闭资源 (非常重要!)
数据库连接是有限的宝贵资源。必须在使用完毕后关闭它们,否则会导致连接泄露,最终使应用程序崩溃,关闭的顺序应该是:ResultSet -> Statement -> Connection。
最佳实践是使用 try-with-resources 语句,它可以自动关闭实现了 AutoCloseable 接口的对象(如 Connection, Statement, ResultSet)。
完整代码示例
示例 1: 使用 JDBC (传统方式)
这是一个不使用连接池的简单示例,展示了所有基本步骤。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class OracleJdbcExample {
// 数据库连接信息
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, PreparedStatement, 和 ResultSet
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement pstmt = conn.prepareStatement("SELECT ename, sal FROM emp WHERE deptno = ?");
ResultSet rs = pstmt.executeQuery()) {
System.out.println("数据库连接成功!");
// 设置参数
pstmt.setInt(1, 10);
// 执行查询
System.out.println("查询部门 10 的员工信息:");
System.out.println("------------------------------");
// 处理结果集
while (rs.next()) {
String name = rs.getString("ename");
double salary = rs.getDouble("sal");
System.out.println("姓名: " + name + ", 薪资: " + salary);
}
} catch (SQLException e) {
System.err.println("数据库操作出错!");
e.printStackTrace();
}
}
}
示例 2: 使用连接池 (HikariCP - 推荐方式)
在生产环境中,绝对不要每次都创建和销毁连接,应该使用连接池来管理连接,它可以显著提高性能和稳定性,HikariCP 是目前性能最好的 JDBC 连接池。
第一步: 添加 HikariCP 依赖 (Maven)
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version> <!-- 使用最新稳定版 -->
</dependency>
第二步: 使用 HikariCP 创建连接
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class OracleHikariCPExample {
private static HikariDataSource dataSource;
// 初始化连接池 (通常在应用启动时执行一次)
static {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:oracle:thin:@localhost:1521/orclpdb1");
config.setUsername("scott");
config.setPassword("tiger");
config.setDriverClassName("oracle.jdbc.OracleDriver");
// 连接池配置 (可选,但推荐)
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();
PreparedStatement pstmt = conn.prepareStatement("SELECT ename, sal FROM emp WHERE deptno = ?");
ResultSet rs = pstmt.executeQuery()) {
System.out.println("从连接池中成功获取连接!");
pstmt.setInt(1, 20);
System.out.println("查询部门 20 的员工信息:");
System.out.println("------------------------------");
while (rs.next()) {
String name = rs.getString("ename");
double salary = rs.getDouble("sal");
System.out.println("姓名: " + name + ", 薪资: " + salary);
}
} catch (SQLException e) {
System.err.println("数据库操作出错!");
e.printStackTrace();
}
}
// 应用关闭时关闭连接池
public static void closeDataSource() {
if (dataSource != null && !dataSource.isClosed()) {
dataSource.close();
}
}
}
常见问题与最佳实践
ClassNotFoundException: oracle.jdbc.OracleDriver
原因: JVM 在运行时找不到 OracleDriver 类,这几乎总是因为你没有正确地将 ojdbcX.jar 文件添加到项目的类路径中。
解决方案:
- 检查依赖: 如果你使用 Maven/Gradle,检查
pom.xml或build.gradle文件,确保依赖配置正确。 - 检查 JAR 位置: 如果你手动添加 JAR,确保它位于项目的
lib目录下,IDE 已经将其正确识别为库。 - 刷新项目: 在 IDE 中右键项目 -> "Maven" -> "Reload Project" (IntelliJ) 或 "Project" -> "Clean..." (Eclipse),然后重新构建项目。
- 检查 JAR 内容: 用解压工具打开
ojdbcX.jar,确保里面确实有oracle/jdbc/OracleDriver.class文件。
- 总是使用
PreparedStatement: 防止 SQL 注入,提高性能。 - 总是使用
try-with-resources: 确保Connection,Statement,ResultSet等资源被正确关闭,避免资源泄露。 - 使用连接池: 在任何生产环境中,都应使用 HikariCP 等高性能连接池来管理数据库连接。
- 将配置外部化: 不要将数据库 URL、用户名、密码等硬编码在代码中,应该放在配置文件(如
application.properties)或环境变量中。 - 处理异常: 对数据库操作可能抛出的
SQLException进行适当的处理和记录。 - 使用连接池配置: 根据你的应用负载和数据库服务器的性能,合理配置连接池的最大/最小连接数、超时时间等参数。
