杰瑞科技汇

Java JDBC连接Oracle,驱动配置与连接语句怎么写?

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

Java JDBC连接Oracle,驱动配置与连接语句怎么写?-图1
(图片来源网络,侵删)

准备工作

在开始之前,请确保您已经准备好以下几样东西:

  1. JDK (Java Development Kit): 确保您的系统上已安装并配置好 JDK (JDK 8, 11, 17 等)。
  2. Oracle 数据库: 一个可以正常访问的 Oracle 数据库实例(可以是本地安装的,也可以是远程服务器上的)。
  3. 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)

  1. ojdbcX.jar 文件复制到您的项目目录下(lib 文件夹)。
  2. 在您的 IDE 中,右键点击项目 -> Project Structure (或类似选项)。
  3. 找到 Modules -> Dependencies 选项卡。
  4. 点击 Add 或 号,选择 JARs or directories...
  5. 选择您刚刚复制的 ojdbcX.jar 文件。
  6. 点击 OK 保存。

使用 Maven (推荐)

在您的 pom.xml 文件中添加以下依赖。强烈推荐使用这种方式,因为它可以自动管理依赖版本。

Java JDBC连接Oracle,驱动配置与连接语句怎么写?-图2
(图片来源网络,侵删)

注意: Oracle 的 JDBC 驱动在 Maven 中央仓库中不可用,您需要使用 Oracle 的官方 Maven 仓库。

  1. 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>
  2. 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 连接代码

下面是几种常见的连接方式,从最基础的到最佳实践。

Java JDBC连接Oracle,驱动配置与连接语句怎么写?-图3
(图片来源网络,侵删)

方式 1:基础 JDBC 连接 (不推荐用于生产)

这种方式直接创建连接,执行查询,然后关闭所有资源。注意:必须确保 Connection, Statement, ResultSetfinally 块中关闭,以防止资源泄漏。

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 为例。

  1. 添加 HikariCP 依赖到 pom.xml:

    <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.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 文件,几乎可以做到零配置。

  1. 创建 Spring Boot 项目 (可以使用 Spring Initializr),并添加 Spring Data JPAOracle Driver 依赖。

  2. 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
  3. 创建一个实体类和 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> {
    }
  4. 创建一个 Service 来使用 Repository:

    EmployeeService.java

    import 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 并使用它即可。


常见问题与解决方案

  1. java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:...

    • 原因: JDBC 驱动没有被加载到类路径中。
    • 解决方案:
      1. 确认 ojdbcX.jar 已经正确添加到项目的类路径中。
      2. 如果使用 Maven,确认 pom.xml 中的依赖已正确下载并刷新了项目。
      3. 对于非常老的 JDBC 驱动,可能需要手动加载驱动:Class.forName("oracle.jdbc.OracleDriver");,对于新版本驱动,这通常不是必需的。
  2. java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection

    • 原因: 无法连接到指定的数据库服务器。
    • 解决方案:
      1. 检查 DB_URL 中的 hostport 是否正确。
      2. 确认 Oracle 数据库服务正在运行。
      3. 检查服务器的防火墙是否允许从您的客户端 IP 地址访问 1521 端口。
      4. 使用 tnsping 命令测试网络连通性:tnsping your_service_name
  3. java.sql.SQLException: ORA-01017: invalid username/password; logon denied

    • 原因: 用户名或密码错误。
    • 解决方案: 仔细检查 USERPASS 变量中的用户名和密码是否正确,注意大小写和特殊字符。
  4. java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver

    • 原因: 与第一个问题类似,运行时找不到驱动类。
    • 解决方案: 再次确认 ojdbcX.jar 已在类路径中,并且项目已正确编译和打包。
方式 优点 缺点 适用场景
基础 JDBC 简单,无需额外依赖 性能差,资源管理繁琐,易出错 学习 JDBC 原理,简单测试脚本
连接池 (HikariCP) 高性能,高并发,资源复用,稳定 需要额外配置 所有生产环境 Java 应用
Spring Boot 配置极其简单,自动管理,生态集成 需要 Spring Boot 框架 基于 Spring Boot 的所有项目

对于任何实际的项目开发,强烈推荐使用连接池(如 HikariCP),如果您的项目是基于 Spring Boot 的,那么直接使用其自动配置的数据源是最佳选择。

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