杰瑞科技汇

Java如何连接Oracle数据库?

核心概念:JDBC

Java 与任何数据库(包括 Oracle)的交互都遵循一个标准规范,叫做 JDBC (Java Database Connectivity),你可以把 JDBC 理解为一套 Java API,它定义了如何用 Java 语言来执行 SQL 语句、处理结果集等。

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

JDBC 的核心思想是“驱动-驱动程序”模型:

  1. JDBC API:这是 Java 提供的一套标准接口(在 java.sqljavax.sql 包中),Connection, Statement, ResultSet 等,你的 Java 代码只和这些接口打交道,而不关心具体是哪个数据库。
  2. JDBC 驱动程序:这是由数据库厂商(如 Oracle)实现的一套类,它实现了 JDBC API 的所有接口,驱动程序的作用是“翻译”你的 Java 调用,转换成 Oracle 数据库能够理解的协议和命令。

你的 Java 代码流程是: 你的代码 -> JDBC API (标准接口) -> JDBC 驱动程序 (Oracle实现) -> Oracle 数据库


Oracle JDBC 驱动程序

这是连接 Java 和 Oracle 数据库的桥梁,你需要先获取它。

驱动类型

目前最常用的是 Type 4 (纯 Java 驱动),它直接使用 Java Socket 与数据库通信,无需任何本地库,是跨平台的最佳选择。

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

如何获取驱动程序(JAR 文件)

你有两种主要方式来获取 Oracle JDBC 驱动的 JAR 文件:

使用 Maven (推荐)

这是现代 Java 项目的标准做法,你只需要在 pom.xml 文件中添加依赖即可。

<!-- pom.xml -->
<dependencies>
    <!-- Oracle JDBC 驱动 -->
    <!-- 注意:groupId 和 artifactId 可能因版本而异,这是较新的写法 -->
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <!-- 
          版本号请根据你的 Oracle 数据库版本选择。
          对于 Oracle 19c,可以使用 19.3.0.0。
          对于 Oracle 21c,可以使用 21.5.0.0。
        -->
        <version>19.3.0.0</version>
    </dependency>
</dependencies>

Maven 会自动帮你下载并管理这个 JAR 文件。

手动下载 JAR 文件

  1. 访问 Oracle 官方网站:Oracle JDBC 驱动下载页面
  2. 根据你的 Oracle 数据库版本和 JDK 版本选择合适的驱动。
  3. 下载 ojdbcX.jar 文件(ojdbc8.jarojdbc11.jar)。
  4. 将下载的 JAR 文件添加到你的项目的 classpath 中。

Java 连接 Oracle 数据库代码示例

下面是一个完整的、可运行的 Java 示例,演示如何连接 Oracle 数据库、执行查询并处理结果。

准备工作

  1. 确保你的 Oracle 数据库服务正在运行。
  2. 确保你有一个可以连接的用户名和密码。
  3. 知道你的数据库的 连接字符串

连接字符串格式: jdbc:oracle:thin:@<主机名>:<端口号>:<服务名/SID>

  • thin: 表示使用 Type 4 驱动。
  • <主机名>: 数据库服务器的 IP 地址或域名。
  • <端口号>: Oracle 的监听端口,默认是 1521
  • <服务名/SID>:
    • 服务名: 更现代的标识方式,推荐使用。ORCLCDB
    • SID: 旧的标识方式,ORCL

示例代码

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:ORCLCDB"; // 使用服务名
    // private static final String DB_URL = "jdbc:oracle:thin:@localhost:1521:ORCL"; // 使用 SID
    private static final String USER = "your_username"; // 你的数据库用户名
    private static final String PASS = "your_password"; // 你的数据库密码
    public static void main(String[] args) {
        // try-with-resources 语句,可以自动关闭资源,防止内存泄漏
        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT * FROM employees WHERE ROWNUM <= 5")) {
            // 检查连接是否成功
            if (conn != null) {
                System.out.println("成功连接到 Oracle 数据库!");
            }
            System.out.println("\n--- 查询结果 (前5条记录) ---");
            // 遍历结果集
            while (rs.next()) {
                // 假设 employees 表有 id, name, salary 列
                int id = rs.getInt("id");
                String name = rs.getString("name");
                double salary = rs.getDouble("salary");
                System.out.println("ID: " + id + ", 姓名: " + name + ", 薪资: " + salary);
            }
        } catch (SQLException e) {
            // 捕获并处理 SQL 异常
            System.err.println("数据库连接或查询出错!");
            e.printStackTrace();
        }
    }
}

最佳实践

在实际项目中,直接在代码中硬编码连接信息是非常糟糕的做法,以下是推荐的实践:

使用连接池

每次请求都创建和销毁数据库连接是非常消耗资源的。连接池 可以复用已建立的数据库连接,极大地提高性能。

  • 常用连接池:
    • HikariCP: 目前性能最好的连接池,是 Spring Boot 2.x 的默认选择。
    • Apache DBCP: 一个经典的选择。
    • C3P0: 也是一个老牌的连接池。

使用 HikariCP 的示例 (Maven 依赖):

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>5.0.1</version>
</dependency>

Java 代码:

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

使用配置文件

将数据库连接信息(URL, 用户名, 密码)放在一个外部的配置文件中(如 application.propertiesconfig.properties),而不是写在代码里。

config.properties 文件:

db.url=jdbc:oracle:thin:@localhost:1521:ORCLCDB
db.username=your_username
db.password=your_password
db.pool.size=10

Java 代码读取配置文件:

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class ConfigFileExample {
    public static void main(String[] args) {
        Properties props = new Properties();
        try (InputStream input = ConfigFileExample.class.getClassLoader().getResourceAsStream("config.properties")) {
            if (input == null) {
                System.out.println("Sorry, unable to find config.properties");
                return;
            }
            props.load(input);
        } catch (Exception e) {
            e.printStackTrace();
        }
        String url = props.getProperty("db.url");
        String user = props.getProperty("db.username");
        String pass = props.getProperty("db.password");
        // 使用 try-with-resources
        try (Connection conn = DriverManager.getConnection(url, user, pass)) {
            System.out.println("使用配置文件成功连接到数据库!");
            // ... 执行查询
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

使用框架 (如 Spring / Spring Boot)

在现代化的 Java 项目中,通常不会手动编写 JDBC 代码,框架(尤其是 Spring 和 Spring Boot)极大地简化了数据库操作。

  • Spring Data JPA / MyBatis: 这些框架提供了更高级的抽象,让你可以用面向对象或 XML 的方式操作数据库,而无需写原生 SQL。
  • Spring Boot Auto-Configuration: Spring Boot 能够自动检测 classpath 中的 ojdbc8.jarapplication.properties 中的配置,并自动为你配置好数据源和 JdbcTemplateEntityManager

Spring Boot application.yml 示例:

spring:
  datasource:
    url: jdbc:oracle:thin:@localhost:1521:ORCLCDB
    username: your_username
    password: your_password
    driver-class-name: oracle.jdbc.OracleDriver
    hikari:
      maximum-pool-size: 10

常见问题

ClassNotFoundException: oracle.jdbc.OracleDriver

原因: JVM 在运行时找不到 Oracle JDBC 驱动的类。 解决:

  1. 如果你使用 Maven/Gradle,确保 pom.xmlbuild.gradle 中的依赖已正确添加并已下载。
  2. 如果你使用手动 JAR,确保 ojdbcX.jar 文件已经添加到了你的项目的 classpath 中。

IO Exception: The Network Adapter could not establish the connection

原因: Java 程序无法通过网络连接到 Oracle 数据库,这是最常见的问题。 解决:

  1. 检查数据库服务: 确认 Oracle 数据库实例(如 ORCLCDB)已经启动。
  2. 检查监听器: 确认 Oracle 的监听器正在监听 1521 端口,可以在数据库服务器上执行 lsnrctl status 命令检查。
  3. 检查防火墙: 确保运行 Java 程序的机器和数据库服务器之间的网络是通的,并且防火墙没有阻止 1521 端口。
  4. 检查连接字符串: 确保 后面的主机名、端口号和服务名/SID 都完全正确。

技术点 描述 推荐实践
JDBC Java 访问数据库的官方标准 API。 理解其基本原理(接口与驱动分离)。
驱动程序 连接 Java 和 Oracle 的桥梁,通常是 ojdbcX.jar 使用 Maven 管理依赖,避免手动下载和配置 classpath
连接字符串 定义如何定位数据库的 URL。 格式为 jdbc:oracle:thin@host:port:service_name
代码结构 使用 try-with-resources 确保 Connection, Statement, ResultSet 被正确关闭。 必须使用,防止资源泄漏。
性能优化 避免频繁创建和销毁连接。 使用连接池,如 HikariCP。
安全与配置 不要硬编码数据库凭据。 使用配置文件,并结合 Spring Boot 等框架进行管理。

对于新项目,强烈推荐使用 Spring Boot + Maven + HikariCP 的组合,这能让你以最简单、最健壮的方式实现 Java 与 Oracle 数据库的交互。

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