我们将涵盖从最基础的 JDBC 连接到现代的连接池和 Spring Boot 配置。

准备工作
在开始之前,请确保您已经准备好以下几样东西:
- JDK (Java Development Kit): 确保您的系统上已安装并配置好 JDK (JDK 8, 11, 17 等)。
- Oracle 数据库: 一个可以正常访问的 Oracle 数据库实例(可以是本地安装的,也可以是远程服务器上的)。
- Oracle JDBC 驱动: 这是连接 Java 和 Oracle 数据库的桥梁,您需要下载对应的 JDBC 驱动 JAR 文件。
- 下载地址: Oracle JDBC 驱动下载页面
- 如何选择: 根据您的 Oracle 数据库版本和 JDK 版本选择合适的驱动,对于 Oracle 19c 数据库,推荐使用
ojdbc8.jar(JDK 8) 或ojdbc11.jar(JDK 11+)。 - 注意: 从 Oracle 21c 开始,JDBC 驱动可能会与数据库安装包一起提供,或者需要从 Maven Central 等仓库获取。
第一步:获取数据库连接信息
您需要从您的 Oracle DBA 或系统管理员那里获取以下信息:
- URL (数据库连接串): 格式通常为
jdbc:oracle:thin:@<host>:<port>:<service_name>host: 数据库服务器的 IP 地址或主机名。port: 数据库监听的端口号,默认是1521。service_name: 数据库的服务名,这是 Oracle 推荐的标识方式。- (旧版 SID): 如果您的数据库使用的是旧的 SID 方式,URL 格式为
jdbc:oracle:thin:@<host>:<port>:<sid>,现代应用建议尽量使用service_name。
- User: 数据库用户名(
scott,hr, 或您自己创建的用户)。 - Password: 对应用户的密码。
第二步:添加 JDBC 驱动到项目中
您需要将下载的 ojdbcX.jar 文件添加到您的 Java 项目的类路径中。
手动添加 (适用于 IDE 如 IntelliJ IDEA, Eclipse)
- 将
ojdbcX.jar文件复制到您的项目目录下(lib文件夹)。 - 在您的 IDE 中,右键点击项目 -> Project Structure (或类似选项)。
- 找到 Modules -> Dependencies 选项卡。
- 点击 Add 或 号,选择 JARs or directories...。
- 选择您刚刚复制的
ojdbcX.jar文件。 - 点击 OK 保存。
使用 Maven (推荐)
在您的 pom.xml 文件中添加以下依赖。强烈推荐使用这种方式,因为它可以自动管理依赖版本。

注意: Oracle 的 JDBC 驱动在 Maven 中央仓库中不可用,您需要使用 Oracle 的官方 Maven 仓库。
-
在
pom.xml的<repositories>部分添加 Oracle 仓库:<repositories> <repository> <id>oracle</id> <name>Oracle Maven Repository</name> <url>https://maven.oracle.com</url> <layout>default</layout> <releases> <enabled>true</enabled> </releases> </repository> </repositories> -
在
pom.xml的<dependencies>部分添加 JDBC 驱动依赖:<dependencies> <!-- Oracle JDBC 驱动 (请根据您的 JDK 和 DB 版本选择合适的版本) --> <!-- 对于 JDK 8 和 Oracle 19c/21c --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> <!-- 请使用您需要的版本 --> </dependency> <!-- 对于 JDK 11+ --> <!-- <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc11</artifactId> <version>19.3.0.0</version> </dependency> --> </dependencies>
第三步:编写 Java 连接代码
下面是几种常见的连接方式,从最基础的到最佳实践。

方式 1:基础 JDBC 连接 (不推荐用于生产)
这种方式直接创建连接,执行查询,然后关闭所有资源。注意:必须确保 Connection, Statement, ResultSet 在 finally 块中关闭,以防止资源泄漏。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SimpleOracleJdbcConnection {
// 数据库连接信息 (请替换为您自己的信息)
static final String DB_URL = "jdbc:oracle:thin:@//localhost:1521/ORCLCDB"; // 使用 //host:port/service_name 格式
static final String USER = "hr";
static final String PASS = "your_password";
public static void main(String[] args) {
// 使用 try-with-resources 语句,可以自动关闭资源 (JDK 7+)
// 这是推荐的现代方式,无需手动在 finally 中关闭
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT employee_id, first_name, last_name FROM employees WHERE rownum < 5")) {
// 注册 JDBC 驱动 (对于新版本的 JDBC 驱动,这步通常不是必需的,但加上更安全)
// Class.forName("oracle.jdbc.OracleDriver");
System.out.println("连接到 Oracle 数据库成功!");
// 遍历结果集
while (rs.next()) {
// 通过列名获取数据,更安全且不易出错
int id = rs.getInt("employee_id");
String firstName = rs.getString("first_name");
String lastName = rs.getString("last_name");
System.out.print("ID: " + id);
System.out.print(", 名字: " + firstName);
System.out.println(", 姓氏: " + lastName);
}
} catch (SQLException e) {
System.err.println("连接数据库失败!");
e.printStackTrace();
}
}
}
方式 2:使用连接池 (强烈推荐)
在真实的应用程序中,频繁地创建和销毁连接是非常消耗资源的,连接池(如 HikariCP, DBCP)可以预先创建一组连接,应用程序需要时从池中获取,用完后归还,极大地提高了性能和稳定性。
这里以目前性能最好的 HikariCP 为例。
-
添加 HikariCP 依赖到
pom.xml:<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.SQLException; import java.sql.Statement;
public class HikariCPOracleConnection {
// HikariCP 数据源
private static HikariDataSource dataSource;
static {
// 配置 HikariCP
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:oracle:thin:@//localhost:1521/ORCLCDB");
config.setUsername("hr");
config.setPassword("your_password");
// 连接池优化配置 (可选,但推荐)
config.setDriverClassName("oracle.jdbc.OracleDriver");
config.setMaximumPoolSize(10); // 最大连接数
config.setMinimumIdle(5); // 最小空闲连接数
config.setConnectionTimeout(30000); // 连接超时时间 (毫秒)
config.setIdleTimeout(600000); // 空闲连接超时时间 (毫秒)
config.setMaxLifetime(1800000); // 连接最大存活时间 (毫秒)
config.setLeakDetectionThreshold(15000); // 连接泄漏检测时间 (毫秒)
// 创建数据源
dataSource = new HikariDataSource(config);
}
public static void main(String[] args) {
// 从连接池中获取一个连接
try (Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT employee_id, first_name FROM employees WHERE rownum < 3")) {
System.out.println("从 HikariCP 连接池成功获取连接!");
while (rs.next()) {
System.out.println("ID: " + rs.getInt("employee_id") + ", 名字: " + rs.getString("first_name"));
}
} catch (SQLException e) {
System.err.println("获取连接或查询失败!");
e.printStackTrace();
}
}
}
```
方式 3:在 Spring Boot 中连接
Spring Boot 极大地简化了数据库连接,通过自动配置和 application.properties 文件,几乎可以做到零配置。
-
创建 Spring Boot 项目 (可以使用 Spring Initializr),并添加
Spring Data JPA和Oracle Driver依赖。 -
在
src/main/resources/application.properties文件中配置数据源:# Oracle 数据源配置 spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/ORCLCDB spring.datasource.username=hr spring.datasource.password=your_password spring.datasource.driver-class-name=oracle.jdbc.OracleDriver # HikariCP 连接池配置 (Spring Boot 默认使用 HikariCP) spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.idle-timeout=30000 spring.datasource.hikari.connection-timeout=20000
-
创建一个实体类和 Repository 接口:
Employee.java(实体类)import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Employee { @Id private Long id; private String firstName; private String lastName; // Getters and Setters... }EmployeeRepository.java(数据访问层)import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface EmployeeRepository extends JpaRepository<Employee, Long> { } -
创建一个 Service 来使用 Repository:
EmployeeService.javaimport org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class EmployeeService { @Autowired private EmployeeRepository employeeRepository; public List<Employee> findFirst3Employees() { return employeeRepository.findAll().subList(0, 3); } }
Spring Boot 应用已经可以自动管理数据库连接了,您只需要注入 EmployeeRepository 并使用它即可。
常见问题与解决方案
-
java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:...- 原因: JDBC 驱动没有被加载到类路径中。
- 解决方案:
- 确认
ojdbcX.jar已经正确添加到项目的类路径中。 - 如果使用 Maven,确认
pom.xml中的依赖已正确下载并刷新了项目。 - 对于非常老的 JDBC 驱动,可能需要手动加载驱动:
Class.forName("oracle.jdbc.OracleDriver");,对于新版本驱动,这通常不是必需的。
- 确认
-
java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection- 原因: 无法连接到指定的数据库服务器。
- 解决方案:
- 检查
DB_URL中的host和port是否正确。 - 确认 Oracle 数据库服务正在运行。
- 检查服务器的防火墙是否允许从您的客户端 IP 地址访问
1521端口。 - 使用
tnsping命令测试网络连通性:tnsping your_service_name。
- 检查
-
java.sql.SQLException: ORA-01017: invalid username/password; logon denied- 原因: 用户名或密码错误。
- 解决方案: 仔细检查
USER和PASS变量中的用户名和密码是否正确,注意大小写和特殊字符。
-
java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver- 原因: 与第一个问题类似,运行时找不到驱动类。
- 解决方案: 再次确认
ojdbcX.jar已在类路径中,并且项目已正确编译和打包。
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 基础 JDBC | 简单,无需额外依赖 | 性能差,资源管理繁琐,易出错 | 学习 JDBC 原理,简单测试脚本 |
| 连接池 (HikariCP) | 高性能,高并发,资源复用,稳定 | 需要额外配置 | 所有生产环境 Java 应用 |
| Spring Boot | 配置极其简单,自动管理,生态集成 | 需要 Spring Boot 框架 | 基于 Spring Boot 的所有项目 |
对于任何实际的项目开发,强烈推荐使用连接池(如 HikariCP),如果您的项目是基于 Spring Boot 的,那么直接使用其自动配置的数据源是最佳选择。
