核心概念:JDBC
Java 与任何数据库(包括 Oracle)的交互都遵循一个标准规范,叫做 JDBC (Java Database Connectivity),你可以把 JDBC 理解为一套 Java API,它定义了如何用 Java 语言来执行 SQL 语句、处理结果集等。

JDBC 的核心思想是“驱动-驱动程序”模型:
- JDBC API:这是 Java 提供的一套标准接口(在
java.sql和javax.sql包中),Connection,Statement,ResultSet等,你的 Java 代码只和这些接口打交道,而不关心具体是哪个数据库。 - JDBC 驱动程序:这是由数据库厂商(如 Oracle)实现的一套类,它实现了 JDBC API 的所有接口,驱动程序的作用是“翻译”你的 Java 调用,转换成 Oracle 数据库能够理解的协议和命令。
你的 Java 代码流程是:
你的代码 -> JDBC API (标准接口) -> JDBC 驱动程序 (Oracle实现) -> Oracle 数据库
Oracle JDBC 驱动程序
这是连接 Java 和 Oracle 数据库的桥梁,你需要先获取它。
驱动类型
目前最常用的是 Type 4 (纯 Java 驱动),它直接使用 Java Socket 与数据库通信,无需任何本地库,是跨平台的最佳选择。

如何获取驱动程序(JAR 文件)
你有两种主要方式来获取 Oracle JDBC 驱动的 JAR 文件:
使用 Maven (推荐)
这是现代 Java 项目的标准做法,你只需要在 pom.xml 文件中添加依赖即可。
<!-- pom.xml -->
<dependencies>
<!-- Oracle JDBC 驱动 -->
<!-- 注意:groupId 和 artifactId 可能因版本而异,这是较新的写法 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<!--
版本号请根据你的 Oracle 数据库版本选择。
对于 Oracle 19c,可以使用 19.3.0.0。
对于 Oracle 21c,可以使用 21.5.0.0。
-->
<version>19.3.0.0</version>
</dependency>
</dependencies>
Maven 会自动帮你下载并管理这个 JAR 文件。
手动下载 JAR 文件
- 访问 Oracle 官方网站:Oracle JDBC 驱动下载页面
- 根据你的 Oracle 数据库版本和 JDK 版本选择合适的驱动。
- 下载
ojdbcX.jar文件(ojdbc8.jar或ojdbc11.jar)。 - 将下载的 JAR 文件添加到你的项目的
classpath中。
Java 连接 Oracle 数据库代码示例
下面是一个完整的、可运行的 Java 示例,演示如何连接 Oracle 数据库、执行查询并处理结果。
准备工作
- 确保你的 Oracle 数据库服务正在运行。
- 确保你有一个可以连接的用户名和密码。
- 知道你的数据库的 连接字符串。
连接字符串格式:
jdbc:oracle:thin:@<主机名>:<端口号>:<服务名/SID>
thin: 表示使用 Type 4 驱动。<主机名>: 数据库服务器的 IP 地址或域名。<端口号>: Oracle 的监听端口,默认是1521。<服务名/SID>:- 服务名: 更现代的标识方式,推荐使用。
ORCLCDB。 - SID: 旧的标识方式,
ORCL。
- 服务名: 更现代的标识方式,推荐使用。
示例代码
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:ORCLCDB"; // 使用服务名
// private static final String DB_URL = "jdbc:oracle:thin:@localhost:1521:ORCL"; // 使用 SID
private static final String USER = "your_username"; // 你的数据库用户名
private static final String PASS = "your_password"; // 你的数据库密码
public static void main(String[] args) {
// try-with-resources 语句,可以自动关闭资源,防止内存泄漏
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM employees WHERE ROWNUM <= 5")) {
// 检查连接是否成功
if (conn != null) {
System.out.println("成功连接到 Oracle 数据库!");
}
System.out.println("\n--- 查询结果 (前5条记录) ---");
// 遍历结果集
while (rs.next()) {
// 假设 employees 表有 id, name, salary 列
int id = rs.getInt("id");
String name = rs.getString("name");
double salary = rs.getDouble("salary");
System.out.println("ID: " + id + ", 姓名: " + name + ", 薪资: " + salary);
}
} catch (SQLException e) {
// 捕获并处理 SQL 异常
System.err.println("数据库连接或查询出错!");
e.printStackTrace();
}
}
}
最佳实践
在实际项目中,直接在代码中硬编码连接信息是非常糟糕的做法,以下是推荐的实践:
使用连接池
每次请求都创建和销毁数据库连接是非常消耗资源的。连接池 可以复用已建立的数据库连接,极大地提高性能。
- 常用连接池:
- HikariCP: 目前性能最好的连接池,是 Spring Boot 2.x 的默认选择。
- Apache DBCP: 一个经典的选择。
- C3P0: 也是一个老牌的连接池。
使用 HikariCP 的示例 (Maven 依赖):
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
Java 代码:
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 {
private static HikariDataSource dataSource;
static {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:ORCLCDB");
config.setUsername("your_username");
config.setPassword("your_password");
config.setDriverClassName("oracle.jdbc.OracleDriver");
// 连接池配置
config.setMaximumPoolSize(10); // 最大连接数
config.setMinimumIdle(5); // 最小空闲连接数
config.setConnectionTimeout(30000); // 连接超时时间 (毫秒)
dataSource = new HikariDataSource(config);
}
public static void main(String[] args) {
try (Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 'Hello from HikariCP!' as message FROM dual")) {
if (rs.next()) {
System.out.println(rs.getString("message"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用配置文件
将数据库连接信息(URL, 用户名, 密码)放在一个外部的配置文件中(如 application.properties 或 config.properties),而不是写在代码里。
config.properties 文件:
db.url=jdbc:oracle:thin:@localhost:1521:ORCLCDB db.username=your_username db.password=your_password db.pool.size=10
Java 代码读取配置文件:
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class ConfigFileExample {
public static void main(String[] args) {
Properties props = new Properties();
try (InputStream input = ConfigFileExample.class.getClassLoader().getResourceAsStream("config.properties")) {
if (input == null) {
System.out.println("Sorry, unable to find config.properties");
return;
}
props.load(input);
} catch (Exception e) {
e.printStackTrace();
}
String url = props.getProperty("db.url");
String user = props.getProperty("db.username");
String pass = props.getProperty("db.password");
// 使用 try-with-resources
try (Connection conn = DriverManager.getConnection(url, user, pass)) {
System.out.println("使用配置文件成功连接到数据库!");
// ... 执行查询
} catch (SQLException e) {
e.printStackTrace();
}
}
}
使用框架 (如 Spring / Spring Boot)
在现代化的 Java 项目中,通常不会手动编写 JDBC 代码,框架(尤其是 Spring 和 Spring Boot)极大地简化了数据库操作。
- Spring Data JPA / MyBatis: 这些框架提供了更高级的抽象,让你可以用面向对象或 XML 的方式操作数据库,而无需写原生 SQL。
- Spring Boot Auto-Configuration: Spring Boot 能够自动检测
classpath中的ojdbc8.jar和application.properties中的配置,并自动为你配置好数据源和JdbcTemplate或EntityManager。
Spring Boot application.yml 示例:
spring:
datasource:
url: jdbc:oracle:thin:@localhost:1521:ORCLCDB
username: your_username
password: your_password
driver-class-name: oracle.jdbc.OracleDriver
hikari:
maximum-pool-size: 10
常见问题
ClassNotFoundException: oracle.jdbc.OracleDriver
原因: JVM 在运行时找不到 Oracle JDBC 驱动的类。 解决:
- 如果你使用 Maven/Gradle,确保
pom.xml或build.gradle中的依赖已正确添加并已下载。 - 如果你使用手动 JAR,确保
ojdbcX.jar文件已经添加到了你的项目的classpath中。
IO Exception: The Network Adapter could not establish the connection
原因: Java 程序无法通过网络连接到 Oracle 数据库,这是最常见的问题。 解决:
- 检查数据库服务: 确认 Oracle 数据库实例(如
ORCLCDB)已经启动。 - 检查监听器: 确认 Oracle 的监听器正在监听
1521端口,可以在数据库服务器上执行lsnrctl status命令检查。 - 检查防火墙: 确保运行 Java 程序的机器和数据库服务器之间的网络是通的,并且防火墙没有阻止
1521端口。 - 检查连接字符串: 确保 后面的主机名、端口号和服务名/SID 都完全正确。
| 技术点 | 描述 | 推荐实践 |
|---|---|---|
| JDBC | Java 访问数据库的官方标准 API。 | 理解其基本原理(接口与驱动分离)。 |
| 驱动程序 | 连接 Java 和 Oracle 的桥梁,通常是 ojdbcX.jar。 |
使用 Maven 管理依赖,避免手动下载和配置 classpath。 |
| 连接字符串 | 定义如何定位数据库的 URL。 | 格式为 jdbc:oracle:thin@host:port:service_name。 |
| 代码结构 | 使用 try-with-resources 确保 Connection, Statement, ResultSet 被正确关闭。 |
必须使用,防止资源泄漏。 |
| 性能优化 | 避免频繁创建和销毁连接。 | 使用连接池,如 HikariCP。 |
| 安全与配置 | 不要硬编码数据库凭据。 | 使用配置文件,并结合 Spring Boot 等框架进行管理。 |
对于新项目,强烈推荐使用 Spring Boot + Maven + HikariCP 的组合,这能让你以最简单、最健壮的方式实现 Java 与 Oracle 数据库的交互。
