杰瑞科技汇

Java连接Oracle数据库有哪些关键步骤?

目录

  1. 准备工作
    • 安装并配置 Oracle 数据库
    • 获取数据库连接信息
    • 下载 Oracle JDBC 驱动
  2. 项目环境配置
    • 使用 IDE (如 IntelliJ IDEA, Eclipse) 手动添加 JAR 包
    • 使用 Maven 或 Gradle 自动管理依赖
  3. Java 连接代码示例
    • 基础连接示例
    • 使用 try-with-resources 的安全连接示例(推荐)
    • 执行查询示例
    • 执行更新/插入/删除示例
  4. 连接字符串 (URL) 格式详解
  5. 最佳实践
    • 使用连接池 (强烈推荐)
    • 使用配置文件
    • 处理异常
    • 使用 PreparedStatement 防止 SQL 注入
  6. 常见问题与解决方案

准备工作

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

Java连接Oracle数据库有哪些关键步骤?-图1
(图片来源网络,侵删)

a. 安装并配置 Oracle 数据库

确保你有一台可以正常访问的 Oracle 数据库服务器(可以是本地安装的,也可以是远程服务器),你需要一个有效的用户名和密码。

b. 获取数据库连接信息

你需要知道以下信息来建立连接:

  • 主机名: 数据库服务器的 IP 地址或域名 ( localhost168.1.100)
  • 端口号: Oracle 数据库监听的端口 (默认为 1521)
  • Service Name/SID: 这是标识具体数据库实例的名称。
    • Service Name: Oracle 推荐的现代方式,通常在 tnsnames.ora 文件中或通过 lsnrctl services 命令查看。
    • SID: 旧式的标识方式,如果不确定,优先使用 Service Name。

c. 下载 Oracle JDBC 驱动

Java 通过 JDBC (Java Database Connectivity) 规范来连接数据库,你需要 Oracle 提供的 JDBC 驱动程序。

  • 下载地址: Oracle JDBC 驱动下载页面
  • 选择版本: 根据你的 Oracle 数据库版本和 JDK 版本选择合适的驱动。ojdbc8.jar 用于 JDK 8,ojdbc11.jar 用于 JDK 11 及更高版本,注意,ojdbc11.jar 是一个模块化的 JAR 文件。

项目环境配置

将下载的 JDBC 驱动添加到你的 Java 项目中。

Java连接Oracle数据库有哪些关键步骤?-图2
(图片来源网络,侵删)

手动添加 JAR 包(适用于 IDE)

如果你使用 IntelliJ IDEA 或 Eclipse:

  1. 将下载的 ojdbcX.jar 文件复制到你的项目目录下(lib 文件夹)。
  2. 在你的 IDE 中,右键点击项目 -> Project Structure (或 Properties) -> Modules -> Dependencies
  3. 点击 号,选择 JARs or directories...,然后选择你刚才复制的 ojdbcX.jar 文件。
  4. Apply/OK 即可。

使用 Maven(推荐)

这是目前最主流和推荐的方式,在你的 pom.xml 文件中添加依赖。

由于 Oracle 驱动不在中央仓库,你需要手动安装到你的本地 Maven 仓库,或者使用一个包含所有 Oracle 驱动的第三方仓库。

步骤 1: 将 JAR 安装到本地 Maven 仓库 打开你的命令行,运行以下命令(请将路径替换为你实际的 JAR 文件路径):

Java连接Oracle数据库有哪些关键步骤?-图3
(图片来源网络,侵删)
mvn install:install-file \
  -Dfile=/path/to/your/ojdbc8.jar \
  -DgroupId=com.oracle.database.jdbc \
  -DartifactId=ojdbc8 \
  -Dversion=19.3.0.0 \
  -Dpackaging=jar
  • DgroupId, DartifactId, Dversion 是你自定义的坐标,后续在 pom.xml 中需要对应。

步骤 2: 在 pom.xml 中添加依赖

<dependencies>
    <!-- 其他依赖... -->
    <!-- Oracle JDBC 驱动依赖 -->
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>19.3.0.0</version>
    </dependency>
</dependencies>

或者,使用一个包含 Oracle 驱动的公共仓库(如 jitpack.io) 这种方式更简单,无需手动安装。

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>
<dependencies>
    <!-- 其他依赖... -->
    <!-- Oracle JDBC 驱动依赖 -->
    <dependency>
        <groupId>com.github.gavlyukovskiy</groupId>
        <artifactId>datasource-proxy-jdbc</artifactId>
        <version>1.9</version>
        <type>pom</type>
        <scope>runtime</scope>
    </dependency>
</dependencies>

注意:这种方法实际上引入了一个代理数据源,它会自动处理不同版本的 Oracle 驱动,非常方便。

使用 Gradle

在你的 build.gradle 文件中添加依赖(同样需要先安装到本地仓库或使用第三方仓库)。

先安装到本地仓库

// 在 settings.gradle 或根 build.gradle 中添加
repositories {
    mavenCentral()
}
// 在你的模块 build.gradle 中添加
dependencies {
    // 其他依赖...
    implementation group: 'com.oracle.database.jdbc', name: 'ojdbc8', version: '19.3.0.0'
}

Java 连接代码示例

a. 基础连接示例

这是一个最简单的连接示例,但不推荐在生产环境中使用,因为它没有正确关闭资源。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class SimpleOracleConnection {
    public static void main(String[] args) {
        // 1. 定义数据库连接信息
        String dbURL = "jdbc:oracle:thin:@//localhost:1521/XEPDB1"; // XEPDB1 是 Service Name
        String dbUser = "your_username";
        String dbPassword = "your_password";
        Connection conn = null;
        try {
            // 2. 加载 JDBC 驱动 (对于新版本驱动,这步通常是可选的)
            Class.forName("oracle.jdbc.OracleDriver");
            // 3. 建立连接
            System.out.println("正在连接到 Oracle 数据库...");
            conn = DriverManager.getConnection(dbURL, dbUser, dbPassword);
            System.out.println("连接成功!");
            // 4. 在这里执行你的 SQL 语句...
        } catch (ClassNotFoundException e) {
            System.err.println("找不到 Oracle JDBC 驱动类。");
            e.printStackTrace();
        } catch (SQLException e) {
            System.err.println("数据库连接失败或 SQL 执行错误。");
            e.printStackTrace();
        } finally {
            // 5. 关闭连接 (非常重要!)
            if (conn != null) {
                try {
                    conn.close();
                    System.out.println("数据库连接已关闭。");
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

b. 使用 try-with-resources 的安全连接示例(推荐)

try-with-resources 语句可以自动实现 AutoCloseable 接口的资源(如 Connection, Statement, ResultSet)的关闭,代码更简洁、安全。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class SafeOracleConnection {
    public static void main(String[] args) {
        String dbURL = "jdbc:oracle:thin:@//localhost:1521/XEPDB1";
        String dbUser = "your_username";
        String dbPassword = "your_password";
        // try-with-resources 会自动关闭 Connection
        try (Connection conn = DriverManager.getConnection(dbURL, dbUser, dbPassword)) {
            System.out.println("连接成功!");
            // 在这里执行你的 SQL 语句...
            // conn 会在 try 块执行完毕后自动关闭
        } catch (SQLException e) {
            System.err.println("数据库连接或操作失败。");
            e.printStackTrace();
        }
        System.out.println("连接已自动关闭。");
    }
}

c. 执行查询示例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
public class OracleQueryExample {
    public static void main(String[] args) {
        String dbURL = "jdbc:oracle:thin:@//localhost:1521/XEPDB1";
        String dbUser = "your_username";
        String dbPassword = "your_password";
        String sql = "SELECT employee_id, first_name, last_name FROM employees WHERE rownum <= 5";
        // try-with-resources 确保 Connection, Statement, ResultSet 都被关闭
        try (Connection conn = DriverManager.getConnection(dbURL, dbUser, dbPassword);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
            System.out.println("查询结果:");
            System.out.println("ID\t姓名");
            System.out.println("--------------------");
            while (rs.next()) {
                // 通过列名获取数据,更健壮
                int id = rs.getInt("employee_id");
                String firstName = rs.getString("first_name");
                String lastName = rs.getString("last_name");
                System.out.printf("%d\t%s %s%n", id, firstName, lastName);
            }
        } catch (SQLException e) {
            System.err.println("查询执行失败。");
            e.printStackTrace();
        }
    }
}

d. 执行更新/插入/删除示例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class OracleUpdateExample {
    public static void main(String[] args) {
        String dbURL = "jdbc:oracle:thin:@//localhost:1521/XEPDB1";
        String dbUser = "your_username";
        String dbPassword = "your_password";
        // 使用问号作为占位符,防止 SQL 注入
        String sql = "UPDATE employees SET salary = salary + ? WHERE employee_id = ?";
        try (Connection conn = DriverManager.getConnection(dbURL, dbUser, dbPassword);
             // 使用 PreparedStatement
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            // 设置参数 (索引从 1 开始)
            pstmt.setDouble(1, 500.00); // 第一个问号,增加 500
            pstmt.setInt(2, 101);      // 第二个问号,员工 ID 为 101
            // 执行更新
            int affectedRows = pstmt.executeUpdate();
            System.out.println(affectedRows + " 行数据已更新。");
        } catch (SQLException e) {
            System.err.println("更新执行失败。");
            e.printStackTrace();
        }
    }
}

连接字符串 (URL) 格式详解

jdbc:oracle:thin:[<user>/<password>]@<host>:<port>:<service_name_or_sid>

  • jdbc:oracle:thin: 固定格式,表示使用 Oracle 的 "thin" 驱动,这是一个纯 Java 实现的驱动,无需客户端库。
  • [<user>/<password>]@: 可选部分,可以直接在 URL 中指定用户名和密码,如果不写,则需要在 getConnection 方法中传入。
  • <host>: 数据库服务器地址。
  • <port>: 数据库监听端口,默认为 1521
  • <service_name_or_sid>: 数据库标识。

常见格式示例:

  1. 使用 Service Name (推荐)

    String dbURL = "jdbc:oracle:thin:@//myhost:1521/myorcl";
    // 或者在 getConnection 时传入用户名密码
    // String dbURL = "jdbc:oracle:thin:@myhost:1521/myorcl";
  2. 使用 SID (旧式)

    String dbURL = "jdbc:oracle:thin:@myhost:1521:orcl";
  3. TNS 名称解析 (高级) 你可以在 tnsnames.ora 文件中定义一个连接别名,然后在 URL 中使用它。

    • tnsnames.ora 文件内容示例:
      MYORCL =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = myhost)(PORT = 1521))
          (CONNECT_DATA =
            (SERVER = DEDICATED)
            (SERVICE_NAME = myorcl)
          )
        )
    • Java 代码中使用别名:
      String dbURL = "jdbc:oracle:thin:@MYORCL";

最佳实践

a. 使用连接池 (强烈推荐)

直接使用 DriverManager.getConnection 每次都会创建一个新的物理连接,性能开销很大,连接池(如 HikariCP, Apache DBCP)会预先创建一组连接,并复用它们,极大地提高了性能和稳定性。

使用 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 ConnectionPoolExample {
        private static HikariDataSource dataSource;
        static {
            HikariConfig config = new HikariConfig();
            config.setJdbcUrl("jdbc:oracle:thin:@//localhost:1521/XEPDB1");
            config.setUsername("your_username");
            config.setPassword("your_password");
            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 Connection getConnection() throws SQLException {
            return dataSource.getConnection();
        }
        public static void main(String[] args) {
            try (Connection conn = getConnection();
                 Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery("SELECT 'Hello from Pool' as message FROM dual")) {
                if (rs.next()) {
                    System.out.println(rs.getString("message"));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

b. 使用配置文件

不要将数据库连接信息硬编码在代码中,建议使用 properties 文件。

  • db.properties:

    db.url=jdbc:oracle:thin:@//localhost:1521/XEPDB1
    db.username=your_username
    db.password=your_password
  • 在 Java 代码中加载:

    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.util.Properties;
    public class ConfigExample {
        public static void main(String[] args) {
            Properties props = new Properties();
            try (InputStream input = ConfigExample.class.getClassLoader().getResourceAsStream("db.properties")) {
                if (input == null) {
                    System.out.println("Sorry, unable to find db.properties");
                    return;
                }
                props.load(input);
                String dbURL = props.getProperty("db.url");
                String dbUser = props.getProperty("db.username");
                String dbPassword = props.getProperty("db.password");
                try (Connection conn = DriverManager.getConnection(dbURL, dbUser, dbPassword)) {
                    System.out.println("使用配置文件连接成功!");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

c. 使用 PreparedStatement

只要 SQL 语句中包含用户输入,就必须使用 PreparedStatement,它可以对输入进行转义,有效防止 SQL 注入攻击。

d. 处理异常

妥善处理 SQLException,记录详细的错误日志,以便于排查问题。


常见问题与解决方案

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

    • 原因: JDBC 驱动 JAR 文件没有添加到项目的 classpath 中。
    • 解决: 确保你已经正确地将 ojdbcX.jar 添加到项目的依赖或库中。
  2. java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection

    • 原因: 无法连接到指定的主机和端口。
    • 解决:
      • 检查 dbURL 中的主机名 (localhost 或 IP 地址) 和端口号 (1521) 是否正确。
      • 确保数据库服务正在运行。
      • 检查防火墙是否阻止了端口的访问。
      • 尝试使用 tnsping 命令测试网络连通性。
  3. java.sql.SQLException: ORA-01017: invalid username/password; logon denied

    • 原因: 用户名或密码错误。
    • 解决: 检查 dbUserdbPassword 是否正确。
  4. java.sql.SQLException: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

    • 原因: 连接字符串中的 Service Name 或 SID 不正确。
    • 解决:
      • 确认你使用的是 Service Name 还是 SID。
      • 连接到数据库服务器,执行 SELECT name FROM v$database; 查询数据库名称。
      • 执行 lsnrctl services 命令查看监听器当前服务的数据库实例名称。

希望这份详细的指南能帮助你成功地在 Java 中连接 Oracle 数据库!

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