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

a. 安装并配置 Oracle 数据库
确保你有一台可以正常访问的 Oracle 数据库服务器(可以是本地安装的,也可以是远程服务器),你需要一个有效的用户名和密码。
b. 获取数据库连接信息
你需要知道以下信息来建立连接:
- 主机名: 数据库服务器的 IP 地址或域名 (
localhost或168.1.100) - 端口号: Oracle 数据库监听的端口 (默认为
1521) - Service Name/SID: 这是标识具体数据库实例的名称。
- Service Name: Oracle 推荐的现代方式,通常在
tnsnames.ora文件中或通过lsnrctl services命令查看。 - SID: 旧式的标识方式,如果不确定,优先使用 Service Name。
- Service Name: Oracle 推荐的现代方式,通常在
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 项目中。

手动添加 JAR 包(适用于 IDE)
如果你使用 IntelliJ IDEA 或 Eclipse:
- 将下载的
ojdbcX.jar文件复制到你的项目目录下(lib文件夹)。 - 在你的 IDE 中,右键点击项目 -> Project Structure (或 Properties) -> Modules -> Dependencies。
- 点击 号,选择 JARs or directories...,然后选择你刚才复制的
ojdbcX.jar文件。 - Apply/OK 即可。
使用 Maven(推荐)
这是目前最主流和推荐的方式,在你的 pom.xml 文件中添加依赖。
由于 Oracle 驱动不在中央仓库,你需要手动安装到你的本地 Maven 仓库,或者使用一个包含所有 Oracle 驱动的第三方仓库。
步骤 1: 将 JAR 安装到本地 Maven 仓库 打开你的命令行,运行以下命令(请将路径替换为你实际的 JAR 文件路径):

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>: 数据库标识。
常见格式示例:
-
使用 Service Name (推荐)
String dbURL = "jdbc:oracle:thin:@//myhost:1521/myorcl"; // 或者在 getConnection 时传入用户名密码 // String dbURL = "jdbc:oracle:thin:@myhost:1521/myorcl";
-
使用 SID (旧式)
String dbURL = "jdbc:oracle:thin:@myhost:1521:orcl";
-
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 示例:
-
添加 Maven 依赖:
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> </dependency> -
代码示例:
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,记录详细的错误日志,以便于排查问题。
常见问题与解决方案
-
java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver- 原因: JDBC 驱动 JAR 文件没有添加到项目的 classpath 中。
- 解决: 确保你已经正确地将
ojdbcX.jar添加到项目的依赖或库中。
-
java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection- 原因: 无法连接到指定的主机和端口。
- 解决:
- 检查
dbURL中的主机名 (localhost或 IP 地址) 和端口号 (1521) 是否正确。 - 确保数据库服务正在运行。
- 检查防火墙是否阻止了端口的访问。
- 尝试使用
tnsping命令测试网络连通性。
- 检查
-
java.sql.SQLException: ORA-01017: invalid username/password; logon denied- 原因: 用户名或密码错误。
- 解决: 检查
dbUser和dbPassword是否正确。
-
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 数据库!
