目录
- 准备工作
- 安装 JDK
- 安装 Oracle 数据库
- 下载 Oracle JDBC 驱动
- 准备数据库信息
- 核心步骤与代码示例
- 步骤 1: 加载 JDBC 驱动
- 步骤 2: 建立数据库连接
- 步骤 3: 创建
Statement或PreparedStatement - 步骤 4: 执行 SQL 查询
- 步骤 5: 处理结果集
- 步骤 6: 关闭资源
- 完整代码示例
- 示例 1: 查询数据 (使用
PreparedStatement) - 示例 2: 插入数据 (使用
PreparedStatement)
- 示例 1: 查询数据 (使用
- 最佳实践
- 使用
try-with-resources(推荐) - 使用连接池
- 处理异常
- 防止 SQL 注入
- 使用
- 常见问题与解决方案
ClassNotFoundExceptionSQLException: No suitable driver foundORA-12514: TNS:listener does not currently know of service requested in connect descriptor
准备工作
在编写代码之前,请确保您已经完成了以下准备工作。
a. 安装 JDK
确保您的系统已安装 Java Development Kit (JDK),并且配置了 JAVA_HOME 环境变量,您可以通过 java -version 和 javac -version 命令来验证。
b. 安装 Oracle 数据库
确保您有一个正在运行的 Oracle 数据库实例(Oracle Express Edition - XE),并且已经创建了一个用户和表。

我们创建一个测试用户 testuser 和密码 password,并创建一个 employees 表:
-- 连接到 SYS 或 SYSTEM 用户,创建新用户
CREATE USER testuser IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO testuser;
-- 切换到新用户,创建表
-- conn testuser/password
CREATE TABLE employees (
id NUMBER PRIMARY KEY,
name VARCHAR2(100),
email VARCHAR2(100),
salary NUMBER(10, 2)
);
-- 插入一些测试数据
INSERT INTO employees (id, name, email, salary) VALUES (1, '张三', 'zhangsan@example.com', 8000);
INSERT INTO employees (id, name, email, salary) VALUES (2, '李四', 'lisi@example.com', 9500);
COMMIT;
c. 下载 Oracle JDBC 驱动
您需要 Oracle 提供的 JDBC 驱动程序,最常用的是 Thin Driver,这是一个纯 Java 驱动,无需客户端库。
- 访问 Oracle 官网下载页面:Oracle JDBC Driver Downloads
- 根据您的 Oracle 数据库版本选择对应的驱动,对于 Oracle 19c,您可以下载 "ojdbc8.jar" (JDK 8) 或 "ojdbc10.jar" (JDK 10+)。
- 下载后,将
.jar文件添加到您的 Java 项目的类路径中。
如何添加到类路径 (以 IntelliJ IDEA 为例):

- 右键点击您的项目 ->
Open Module Settings。 - 导航到
Libraries-> 点击 号 ->Java。 - 找到并选择您下载的
ojdbcX.jar文件,点击OK。
d. 准备数据库连接信息
您需要以下信息来连接数据库:
- URL: 格式为
jdbc:oracle:thin:@<host>:<port>:<service_name>host: 数据库服务器的 IP 地址或主机名 (localhost)。port: 数据库监听的端口号 (默认为1521)。service_name: 数据库的服务名 (SID 已逐渐被弃用,推荐使用 Service Name),您可以通过 SQL 查询SELECT value FROM v$parameter WHERE name = 'service_names'来获取。
- User: 您的数据库用户名 (
testuser)。 - Password: 您的数据库密码 (
password)。
示例 URL:
jdbc:oracle:thin:@localhost:1521:ORCLPDB1 (这是一个典型的 Oracle PDB 服务名)
核心步骤与代码示例
以下是使用 JDBC 连接 Oracle 数据库的六个核心步骤。

步骤 1: 加载 JDBC 驱动
虽然对于 JDBC 4.0 (JDK 6+) 及以上版本,驱动通常会自动加载,但显式加载是更健壮的做法。
Class.forName("oracle.jdbc.OracleDriver");
步骤 2: 建立数据库连接
使用 DriverManager 的 getConnection() 方法,传入 URL、用户名和密码。
String url = "jdbc:oracle:thin:@localhost:1521:ORCLPDB1"; String user = "testuser"; String password = "password"; Connection conn = DriverManager.getConnection(url, user, password);
步骤 3: 创建 Statement 或 PreparedStatement
Statement: 用于执行静态 SQL 语句。注意: 容易引发 SQL 注入,不推荐直接使用。PreparedStatement: 用于执行预编译的 SQL 语句。强烈推荐使用,因为它可以防止 SQL 注入,并且对于重复执行的 SQL 有性能优势。
// 推荐:使用 PreparedStatement String sql = "SELECT id, name, email, salary FROM employees WHERE salary > ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setDouble(1, 8500.0); // 设置第一个 ? 的值
步骤 4: 执行 SQL 查询
- 对于
SELECT查询,使用executeQuery()方法,它返回一个ResultSet对象。 - 对于
INSERT,UPDATE,DELETE等操作,使用executeUpdate()方法,它返回一个整数,表示受影响的行数。
// 执行查询 ResultSet rs = pstmt.executeQuery();
步骤 5: 处理结果集
使用 while 循环遍历 ResultSet,并通过 getXXX() 方法(如 getInt(), getString(), getDouble())获取数据。
while (rs.next()) {
// 通过列名获取数据,更具可读性且不易出错
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
double salary = rs.getDouble("salary");
System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email + ", Salary: " + salary);
}
步骤 6: 关闭资源
为了防止资源泄漏,必须按创建的逆序关闭所有 JDBC 对象:ResultSet -> Statement/PreparedStatement -> Connection。
rs.close(); pstmt.close(); conn.close();
完整代码示例
示例 1: 查询数据 (使用 PreparedStatement)
这个示例查询薪资高于 8500 的员工。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class OracleJdbcQueryExample {
public static void main(String[] args) {
// 数据库连接信息
String dbUrl = "jdbc:oracle:thin:@localhost:1521:ORCLPDB1";
String dbUser = "testuser";
String dbPassword = "password";
// SQL 查询语句
String sql = "SELECT id, name, email, salary FROM employees WHERE salary > ?";
// 使用 try-with-resources 自动管理资源 (推荐)
try (Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
// 设置查询参数
pstmt.setDouble(1, 8500.0);
// 执行查询
try (ResultSet rs = pstmt.executeQuery()) {
System.out.println("薪资高于 8500 的员工:");
System.out.println("----------------------------------");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
double salary = rs.getDouble("salary");
System.out.printf("ID: %d, Name: %s, Email: %s, Salary: %.2f%n", id, name, email, salary);
}
}
} catch (SQLException e) {
System.err.println("
