杰瑞科技汇

java连接oracle数据库 jdbc

目录

  1. 环境准备
    • 安装 Java 开发环境 (JDK)
    • 安装 Oracle 数据库
    • 下载 Oracle JDBC 驱动 (ojdbc.jar)
  2. JDBC 连接 URL 格式
  3. 完整代码示例
    • 基础版 (不带连接池)
    • 使用 try-with-resources (推荐)
  4. 使用连接池 (最佳实践)
    • 什么是连接池?
    • 使用 HikariCP 示例
  5. 常见问题与解决方案
    • ClassNotFoundExceptionNoClassDefFoundError
    • Invalid URL or password / IO Error: The Network Adapter could not establish the connection
    • ORA-00604: error occurred at recursive SQL level 1

环境准备

在开始编码之前,请确保您的开发环境已经准备就绪。

a. 安装 Java 开发环境 (JDK)

确保您的系统已经安装了 JDK (建议 JDK 8 或更高版本),JAVA_HOME 环境变量已正确配置。

b. 安装 Oracle 数据库

您需要有一个可访问的 Oracle 数据库实例,这可以是:

java连接oracle数据库 jdbc-图1

  • 本地安装的 Oracle Database (如 Oracle Express Edition - XE)。
  • 云端的 Oracle Database 服务 (如 Oracle Cloud Autonomous Database)。
  • Docker 容器中的 Oracle Database。

请记住您的数据库连接信息:

  • 主机名: localhost 或数据库服务器的 IP 地址。
  • 端口: Oracle 默认端口是 1521
  • 服务名/SID: 这是标识特定数据库实例的名称,对于较新的 Oracle 版本,推荐使用 服务名,您可以在 tnsnames.ora 文件中找到它,或者询问您的 DBA。
  • 用户名: scott
  • 密码: tiger

c. 下载 Oracle JDBC 驱动 (ojdbc.jar)

这是 Java 程序与 Oracle 数据库通信的桥梁。

  1. 访问 Oracle 官方下载页面:Oracle JDBC Drivers
  2. 根据您的 Oracle 数据库版本和 JDK 版本选择合适的驱动,通常选择 "ojdbc8.jar" (适用于 JDK 8) 或 "ojdbc11.jar" (适用于 JDK 11+)。
  3. 下载 .jar 文件。

如何使用驱动? 将下载的 ojdbcX.jar 文件添加到您的项目中,具体方法取决于您的开发工具:

  • IDE (如 IntelliJ IDEA, Eclipse):

    java连接oracle数据库 jdbc-图2

    • 右键点击您的项目 -> Build Path / Project Structure -> Libraries -> Add External JARs... -> 选择您下载的 ojdbcX.jar 文件。
  • Maven 项目: 在您的 pom.xml 文件中添加以下依赖。注意: Oracle 驱动在 Maven 中央仓库不可用,您需要从 Oracle Maven 仓库或手动安装。

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

    或者,如果您想从 Oracle 的 Maven 仓库拉取:

    <repositories>
        <repository>
            <id>oracle</id>
            <url>https://maven.oracle.com</url>
        </repository>
    </repositories>
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>19.3.0.0</version>
    </dependency>
  • Gradle 项目: 在您的 build.gradle 文件中添加:

    implementation group: 'com.oracle.database.jdbc', name: 'ojdbc8', version: '19.3.0.0'

JDBC 连接 URL 格式

连接 URL 是一个字符串,告诉 JDBC 驱动如何连接到数据库,Oracle 的 URL 格式如下:

java连接oracle数据库 jdbc-图3

jdbc:oracle:thin:@<host>:<port>:<service_name_or_SID>
  • jdbc:oracle:thin:: 指定使用 Oracle 的 "thin" 驱动,这是一个纯 Java 实现的驱动,不依赖 Oracle 客户端库。
  • <host>: 数据库服务器的 IP 地址或主机名。
  • <port>: 数据库监听的端口号,默认为 1521
  • <service_name_or_SID>: 数据库的服务名或 SID。

示例: 假设您的数据库信息如下:

  • 主机: myoraclehost.com
  • 端口: 1521
  • 服务名: ORCLPDB1

那么连接 URL jdbc:oracle:thin:@myoraclehost.com:1521:ORCLPDB1


完整代码示例

a. 基础版 (不带连接池)

这个示例展示了最基本、最直接的连接方式。注意: 这种方式没有正确处理资源关闭,不推荐在生产环境中使用。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleJdbcBasicExample {
    // 数据库连接信息
    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) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // 1. 注册 JDBC 驱动 (对于较新的JDK,这一步通常可以省略)
            Class.forName("oracle.jdbc.driver.OracleDriver");
            // 2. 打开连接
            System.out.println("Connecting to database...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            // 3. 创建执行语句
            System.out.println("Creating statement...");
            stmt = conn.createStatement();
            String sql = "SELECT * FROM emp WHERE ROWNUM <= 5";
            rs = stmt.executeQuery(sql);
            // 4. 处理结果集
            System.out.println("Empno\tEname");
            while (rs.next()) {
                // 通过列名获取数据,更具可读性
                int id = rs.getInt("empno");
                String name = rs.getString("ename");
                System.out.println(id + "\t" + name);
            }
        } catch (SQLException e) {
            // 处理 JDBC 错误
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // 处理 Class.forName 错误
            e.printStackTrace();
        } finally {
            // 5. 关闭资源 (非常重要!)
            try {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            System.out.println("Database connection closed.");
        }
    }
}

b. 使用 try-with-resources (推荐)

Java 7 引入了 try-with-resources 语句,它可以自动实现 AutoCloseable 接口的资源关闭,使代码更简洁、更安全。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleJdbcTryWithResourcesExample {
    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, Statement, 和 ResultSet
        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT * FROM emp WHERE ROWNUM <= 5")) {
            System.out.println("Connected to database successfully!");
            System.out.println("Empno\tEname");
            while (rs.next()) {
                int id = rs.getInt("empno");
                String name = rs.getString("ename");
                System.out.println(id + "\t" + name);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println("Resources are now closed automatically.");
    }
}

使用连接池 (最佳实践)

在高并发应用中,频繁地创建和销毁数据库连接会带来巨大的性能开销。连接池 应运而生,它预先

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