杰瑞科技汇

Java JDBC连接Oracle,配置步骤有哪些?

目录

  1. 准备工作
    • 安装 Oracle 数据库
    • 获取数据库连接信息
    • 下载 JDBC 驱动
    • 配置项目(Maven/Gradle)
  2. 核心代码示例
    • 基本连接步骤
    • 完整可运行的示例代码
    • 代码详解
  3. 最佳实践
    • 使用 try-with-resources 管理资源
    • 使用连接池
    • 使用 PreparedStatement 防止 SQL 注入
    • 处理异常
  4. 常见问题与解决方案

准备工作

在编写代码之前,请确保您已经完成了以下准备工作:

Java JDBC连接Oracle,配置步骤有哪些?-图1
(图片来源网络,侵删)

a. 安装 Oracle 数据库

您需要一台可以访问的 Oracle 数据库服务器,这可以是本地安装的 Oracle Database (如 Oracle Express Edition),也可以是远程服务器上的数据库。

b. 获取数据库连接信息

您需要从您的 DBA(数据库管理员)或数据库配置中获取以下关键信息:

  • 主机名: 数据库服务器的地址 (localhost168.1.100)。
  • 端口号: Oracle 的默认监听端口是 1521
  • SID (System Identifier): 数据库的实例名 (ORCL, XE)。
  • Service Name: (可选,现代 Oracle 推荐使用) 数据库的服务名 (orclpdb1)。
  • 用户名: 连接数据库的用户名 (scott, hr)。
  • 密码: 对应用户的密码。

注意: SID 和 Service Name 的区别:

  • SID: 是数据库实例的标识,是传统的连接方式。
  • Service Name: 是一个更灵活的、基于服务的连接方式,特别是在 RAC (Real Application Clusters) 和 PDB (Pluggable Database) 环境中更为常用,如果不确定,可以尝试使用 Service Name

c. 下载 JDBC 驱动 (OJDBC)

JDBC 只是一个规范,要连接 Oracle,您需要 Oracle 提供的 JDBC 驱动程序,称为 OJDBC (Oracle JDBC Driver)。

Java JDBC连接Oracle,配置步骤有哪些?-图2
(图片来源网络,侵删)
  1. 访问 Oracle 官方驱动下载页面:Oracle JDBC Drivers
  2. 根据您的 Oracle 数据库版本和 Java 版本选择合适的驱动,对于 Oracle 19c 数据库,通常选择 ojdbc8.jar (对应 Java 8) 或 ojdbc11.jar (对应 Java 11+)。
  3. 下载 .jar 文件。

d. 配置项目

您需要将下载的 OJDBC 驱动添加到您的 Java 项目的类路径中。

手动添加 (适用于 IDE 如 IntelliJ IDEA / Eclipse)

  1. 在您的项目中创建一个 lib 文件夹。
  2. 将下载的 ojdbcX.jar 文件复制到 lib 文件夹中。
  3. 在 IDE 中,右键点击项目 -> Build Path (或 Project Structure) -> Libraries -> Add JARs... (或 Add External JARs...),然后选择 lib 文件夹中的 ojdbcX.jar

使用 Maven (推荐) 在您的 pom.xml 文件中添加 OJDBC 依赖,Maven 中央仓库可能没有 Oracle 的官方驱动,您需要使用 Oracle 的 Maven 仓库。

<project>
    ...
    <dependencies>
        <!-- Oracle JDBC 驱动依赖 -->
        <!-- 请根据你的 Oracle 版本和 Java 版本选择合适的坐标 -->
        <!-- 对于 Oracle 19c 和 Java 8 -->
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>19.3.0.0</version>
        </dependency>
        <!-- 对于 Oracle 21c 和 Java 11+ -->
        <!-- <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc11</artifactId>
            <version>21.5.0.0</version>
        </dependency> -->
    </dependencies>
    <!-- Oracle 驱动不在中央仓库,需要配置仓库 -->
    <repositories>
        <repository>
            <id>oracle-maven</id>
            <name>Oracle Maven Repository</name>
            <url>https://maven.oracle.com</url>
            <layout>default</layout>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </releases>
        </repository>
    </repositories>
    ...
</project>

使用 Gradle 在您的 build.gradle 文件中添加依赖。

Java JDBC连接Oracle,配置步骤有哪些?-图3
(图片来源网络,侵删)
plugins {
    id 'java'
}
repositories {
    mavenCentral()
    // 添加 Oracle Maven 仓库
    maven {
        url 'https://maven.oracle.com'
    }
}
dependencies {
    // Oracle JDBC 驱动依赖
    // 请根据你的 Oracle 版本和 Java 版本选择合适的坐标
    // 对于 Oracle 19c 和 Java 8
    implementation 'com.oracle.database.jdbc:ojdbc8:19.3.0.0'
    // 对于 Oracle 21c 和 Java 11+
    // implementation 'com.oracle.database.jdbc:ojdbc11:21.5.0.0'
}

核心代码示例

a. 基本连接步骤

使用 JDBC 连接数据库并执行查询的标准流程如下:

  1. 加载驱动: 使用 Class.forName() 加载 OJDBC 驱动类。
  2. 获取连接: 使用 DriverManager.getConnection() 方法,传入数据库 URL、用户名和密码,创建一个 Connection 对象。
  3. 创建语句: 通过 Connection 对象创建一个 StatementPreparedStatement 对象。
  4. 执行查询: 使用 Statement.executeQuery() 执行 SQL 查询,返回一个 ResultSet 对象。
  5. 处理结果集: 遍历 ResultSet,获取查询结果。
  6. 关闭资源: 按照相反的顺序关闭 ResultSetStatementConnection

b. 完整可运行的示例代码

这个示例将连接到 Oracle 数据库,查询 scott/tiger 用户下的 emp 表,并打印出员工姓名和工资。

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:ORCL"; // 使用 SID
    // private static final String DB_URL = "jdbc:oracle:thin:@localhost:1521/ORCLPDB1"; // 使用 Service Name
    private static final String USER = "scott";
    private static final String PASS = "tiger";
    // ------------------------------------
    public static void main(String[] args) {
        // 1. 加载驱动 (对于新版本的JDBC驱动,这步通常是可选的,但写上更安全)
        try {
            Class.forName("oracle.jdbc.OracleDriver");
        } catch (ClassNotFoundException e) {
            System.err.println("找不到 Oracle JDBC Driver!");
            e.printStackTrace();
            return;
        }
        // try-with-resources 语句会自动关闭资源
        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT ename, sal FROM emp")) {
            System.out.println("连接数据库成功!");
            System.out.println("员工姓名\t工资");
            // 3. 遍历结果集
            while (rs.next()) {
                // 通过列名获取数据,更具可读性且不易出错
                String name = rs.getString("ename");
                double salary = rs.getDouble("sal");
                // 4. 输出结果
                System.out.println(name + "\t\t" + salary);
            }
        } catch (SQLException e) {
            System.err.println("数据库操作出错!");
            e.printStackTrace();
        }
    }
}

c. 代码详解

  • 数据库 URL 格式:
    • jdbc:oracle:thin:: 协议名,表示使用瘦客户端驱动。
    • @主机名:端口号:SID@主机名:端口号/SERVICE_NAME: 连接标识符。
  • Class.forName("oracle.jdbc.OracleDriver"): 这行代码的作用是显式地加载驱动类,以便 DriverManager 能够识别它,从 JDBC 4.0 (Java 6) 开始,如果驱动 jar 文件在类路径中并且实现了 Service Provider 机制,这步是自动的,但显式调用可以确保兼容性。
  • DriverManager.getConnection(): 这是建立数据库连接的核心方法,它返回一个 Connection 对象,代表一个与数据库的会话。
  • try-with-resources: 这是一个 Java 7 引入的语法糖,可以自动实现 AutoCloseable 接口的对象(如 Connection, Statement, ResultSet)在 try 块执行完毕后自动关闭,即使发生异常也能保证资源被释放,是必须遵循的最佳实践。
  • stmt.executeQuery(sql): 用于执行返回结果集的 SQL 查询(如 SELECT),对于 INSERT, UPDATE, DELETE 等不返回结果集的语句,应使用 stmt.executeUpdate(),它返回一个整数,表示受影响的行数。
  • rs.next(): 将光标从当前位置向下移动一行,如果新行有效,则返回 true,否则返回 false
  • rs.getString("ename"): 通过列名获取指定列的值,这是推荐的方式,因为它不依赖于列的顺序,代码更健壮。

最佳实践

a. 使用 PreparedStatement 防止 SQL 注入

在上面的例子中,我们使用了 Statement,它不能防止 SQL 注入,对于任何包含用户输入的 SQL 查询,都应该使用 PreparedStatement

// 使用 PreparedStatement 的示例
String sql = "SELECT ename, sal FROM emp WHERE deptno = ?";
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
     PreparedStatement pstmt = conn.prepareStatement(sql)) {
    // 设置参数 (索引从1开始)
    pstmt.setInt(1, 10); // 假设用户输入的部门号是 10
    try (ResultSet rs = pstmt.executeQuery()) {
        while (rs.next()) {
            System.out.println(rs.getString("ename") + "\t" + rs.getDouble("sal"));
        }
    }
} catch (SQLException e) {
    e.printStackTrace();
}

b. 使用连接池

直接使用 DriverManager.getConnection() 每次都会创建一个新的物理连接,这是一个非常耗时的操作,在高并发应用中,必须使用连接池来复用连接,以提高性能。

流行的连接池库:

  • HikariCP: 目前性能最好的连接池,是 Spring Boot 2.x 的默认选择。
  • Apache DBCP: 经典的连接池实现。
  • C3P0: 另一个广泛使用的连接池。

使用 HikariCP 的示例:

  1. 添加 Maven 依赖:

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>5.0.1</version>
    </dependency>
  2. 配置并使用连接池:

    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 {
        public static void main(String[] args) {
            HikariConfig config = new HikariConfig();
            config.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:ORCL");
            config.setUsername("scott");
            config.setPassword("tiger");
            config.setDriverClassName("oracle.jdbc.OracleDriver");
            // 连接池配置 (可选)
            config.setMaximumPoolSize(10); // 最大连接数
            config.setMinimumIdle(5);      // 最小空闲连接数
            config.setConnectionTimeout(30000); // 连接超时时间 (毫秒)
            // 创建数据源
            try (HikariDataSource ds = new HikariDataSource(config);
                 Connection conn = ds.getConnection();
                 Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery("SELECT 'Hello from HikariCP!' as message FROM dual")) {
                System.out.println("成功从连接池获取连接!");
                if (rs.next()) {
                    System.out.println(rs.getString("message"));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

常见问题与解决方案

问题 1: java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver

原因: OJDBC 驱动 jar 文件没有被添加到项目的类路径中。 解决方案: 检查您的 IDE 或构建工具(Maven/Gradle)的配置,确保 ojdbcX.jar 已正确引入。

问题 2: java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@...

原因: 通常是 URL 格式错误,或者 Class.forName() 没有成功执行导致驱动未被加载。 解决方案:

  1. 仔细检查数据库 URL 是否正确(主机、端口、SID/Service Name)。
  2. 确保代码中包含了 Class.forName("oracle.jdbc.OracleDriver");

问题 3: java.sql.SQLException: Invalid username/password; logon denied

原因: 用户名或密码错误。 解决方案: 确认您提供的数据库用户名和密码完全正确,注意大小写。

问题 4: java.net.ConnectException: Connection refused: connect

原因:

  1. Oracle 数据库服务没有启动。
  2. 防火墙阻止了端口 1521 的连接。
  3. 主机名或 IP 地址错误。 解决方案:
  4. 检查 Oracle 服务的状态,确保其正在运行。
  5. 检查服务器的防火墙设置,允许来自您客户端的 1521 端口访问。
  6. 使用 ping 命令测试网络连通性,使用 tnsping 命令测试 Oracle 监听器是否正常。
    tnsping ORCL

希望这份详细的指南能帮助您成功使用 Java 连接 Oracle 数据库!

分享:
扫描分享到社交APP
上一篇
下一篇