杰瑞科技汇

Java如何连接Oracle数据库?

目录

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

准备工作

在编写 Java 代码之前,确保你的环境已经准备就绪。

Java如何连接Oracle数据库?-图1
(图片来源网络,侵删)

a. 安装 Oracle 数据库

你需要一个可用的 Oracle 数据库实例(Oracle Express Edition),并确保你知道以下连接信息:

  • 主机名: 数据库服务器的 IP 地址或域名 (localhost168.1.100)。
  • 端口号: Oracle 数据库的监听端口,默认是 1521
  • SID (System Identifier) 或 Service Name: 这是标识特定数据库实例的名称。
    • SID: 是一个较老的方式,ORCL
    • Service Name: 是 Oracle 推荐的新方式,通常与全局数据库名相同,orclpdb1
    • 你可以使用 lsnrctl status 命令来查看你的数据库实例的 SID 或 Service Name。
  • 用户名和密码: 用于连接数据库的数据库用户凭证 (scott/tiger)。

b. 下载 Oracle JDBC 驱动 (OJDBC)

Java 通过 JDBC 驱动与 Oracle 数据库通信,你需要下载 Oracle 提供的官方 JDBC 驱动。

  1. 访问 Oracle 官方下载页面:Oracle JDBC Drivers
  2. 根据你的 Oracle 数据库版本和 Java 版本选择合适的驱动,如果你使用 Oracle 19c,可以选择 ojdbc8.jar (适用于 Java 8) 或 ojdbc11.jar (适用于 Java 11+)。
  3. 下载后,你会得到一个 .jar 文件。

c. 配置 Java 开发环境

确保你的系统已经安装了 JDK,并且配置好了 JAVA_HOMEPATH 环境变量。


核心步骤详解

步骤 1: 添加 JDBC 驱动到项目

这是最关键的一步,你需要将下载的 ojdbcX.jar 文件添加到你的 Java 项目中,根据你使用的构建工具,方法不同:

Java如何连接Oracle数据库?-图2
(图片来源网络,侵删)

使用 Maven (推荐)

pom.xml 文件中添加依赖,请根据你下载的驱动版本选择正确的 groupIdartifactId,对于较新的版本,通常是:

<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>19.3.0.0</version> <!-- 请使用你下载的版本号 -->
</dependency>

使用 Gradle

build.gradle 文件中添加依赖:

Java如何连接Oracle数据库?-图3
(图片来源网络,侵删)
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: 创建 StatementPreparedStatement

一旦有了 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 文件添加到项目的类路径中。

解决方案:

  1. 检查依赖: 如果你使用 Maven/Gradle,检查 pom.xmlbuild.gradle 文件,确保依赖配置正确。
  2. 检查 JAR 位置: 如果你手动添加 JAR,确保它位于项目的 lib 目录下,IDE 已经将其正确识别为库。
  3. 刷新项目: 在 IDE 中右键项目 -> "Maven" -> "Reload Project" (IntelliJ) 或 "Project" -> "Clean..." (Eclipse),然后重新构建项目。
  4. 检查 JAR 内容: 用解压工具打开 ojdbcX.jar,确保里面确实有 oracle/jdbc/OracleDriver.class 文件。
  1. 总是使用 PreparedStatement: 防止 SQL 注入,提高性能。
  2. 总是使用 try-with-resources: 确保 Connection, Statement, ResultSet 等资源被正确关闭,避免资源泄露。
  3. 使用连接池: 在任何生产环境中,都应使用 HikariCP 等高性能连接池来管理数据库连接。
  4. 将配置外部化: 不要将数据库 URL、用户名、密码等硬编码在代码中,应该放在配置文件(如 application.properties)或环境变量中。
  5. 处理异常: 对数据库操作可能抛出的 SQLException 进行适当的处理和记录。
  6. 使用连接池配置: 根据你的应用负载和数据库服务器的性能,合理配置连接池的最大/最小连接数、超时时间等参数。
分享:
扫描分享到社交APP
上一篇
下一篇