【Java与Oracle数据库连接实战指南】——从零掌握JDBC编程技巧
📌 提示语:
学完本篇你将掌握 Java 连接 Oracle 数据库的完整过程,包括驱动配置、CRUD操作、事务管理、连接池优化等核心技能!文末附有完整代码案例和流程图解析,适合初学者与进阶开发者收藏学习!
目录
前言
Oracle 简介与安装准备
JDBC 编程基础原理回顾
配置 Oracle JDBC 驱动
Java 连接 Oracle 实战代码演示
使用 PreparedStatement 实现安全查询
数据库基本操作:增删改查(CRUD)
事务处理与异常控制
批量操作提升效率
调用存储过程与函数
使用连接池优化性能(C3P0 & HikariCP)
常见问题与解决方案汇总
总结与拓展建议
✅ 1. 前言
在企业级开发中,Oracle 作为全球领先的商业关系型数据库系统,广泛应用于大型金融、电信、政府及互联网项目中。Java 作为后端开发语言的重要一员,与 Oracle 的集成使用非常普遍。
本文将从 Java 开发者的角度出发,带你一步步完成 Java 与 Oracle 数据库的连接全过程,并通过实际代码演示如何实现数据增删改查、事务控制、连接池优化等高级功能。
🔍 2. Oracle 简介与安装准备
2.1 什么是 Oracle?
Oracle 是由 Oracle 公司推出的强大、稳定、可扩展的关系型数据库管理系统,支持高并发、大规模数据处理,在银行、保险、政务等对数据一致性要求极高的场景中应用广泛。
2.2 安装 Oracle
你可以选择以下方式之一安装 Oracle:
官方下载地址:https://www.oracle.com/database/technologies/oracle-database-software-downloads.html
推荐版本:Oracle Database Express Edition (XE) 或 Docker 方式部署(适合学习测试)
例如使用 Docker 启动 Oracle XE:
docker run -d -p 1521:1521 --name oracle-xe gvenzl/oracle-xe:18.4.0-slim
默认用户名为 system,密码为 oracle
2.3 创建测试数据库与表
连接 SQL*Plus 创建用户和测试表:
CREATE USER test IDENTIFIED BY test;
GRANT CONNECT, RESOURCE TO test;
CONNECT test/test;
CREATE TABLE users (
id NUMBER PRIMARY KEY,
name VARCHAR2(50),
email VARCHAR2(100)
);
⚙️ 3. JDBC 编程基础原理回顾
虽然前一篇文章我们已经讲解了 JDBC 的基本原理,但为了帮助理解 Oracle 特有的连接方式,我们再来简要回顾一下。
JDBC 工作流程图:
🛠 4. 配置 Oracle JDBC 驱动
4.1 下载 Oracle JDBC 驱动
前往官网下载:https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html
推荐版本:ojdbc8.jar(适用于 JDK 8 及以上)
4.2 添加到项目依赖
方法一:Maven 项目添加依赖
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.13.0.0</version>
</dependency>
方法二:手动添加 Jar 包
将 ojdbc8.jar 放入项目 lib 文件夹,并在 IDE 中添加至 Build Path。
🧪 5. Java 连接 Oracle 实战代码演示
5.1 标准连接步骤
加载驱动
获取连接
创建 Statement 对象
执行 SQL
处理结果集(若查询)
关闭资源
5.2 示例代码:连接 Oracle 数据库
import java.sql.*;
public class OracleJdbcTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@localhost:1521/XEPDB1";
String user = "test";
String password = "test";
try {
// 1. 加载驱动(Oracle 12c+ 不需要显式加载,但保险起见仍保留)
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2. 获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println("✅ 数据库连接成功!");
// 3. 创建Statement
Statement stmt = conn.createStatement();
// 4. 查询用户信息
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
// 5. 遍历结果集
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
// 6. 关闭资源
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.3 输出示例
✅ 数据库连接成功!
ID: 1, Name: Alice
ID: 2, Name: Bob
5.4 连接流程图
graph TD
A[加载驱动 Class.forName()] --> B[获取连接 DriverManager.getConnection()]
B --> C[创建 Statement]
C --> D{执行SQL语句}
D -->|查询| E[处理 ResultSet]
D -->|更新/插入/删除| F[返回影响行数]
E --> G[关闭资源]
F --> G
🔐 6. 使用 PreparedStatement 实现安全查询
PreparedStatement 可以防止 SQL 注入攻击,提高代码安全性。
示例代码:
String sql = "INSERT INTO users(id, name, email) VALUES (?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 3);
pstmt.setString(2, "Charlie");
pstmt.setString(3, "charlie@example.com");
int rows = pstmt.executeUpdate();
System.out.println(rows + " 条记录已插入");
🧩 7. 数据库基本操作:增删改查(CRUD)
7.1 插入数据(Create)
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO users(id, name) VALUES (?, ?)");
pstmt.setInt(1, 4);
pstmt.setString(2, "David");
pstmt.executeUpdate();
7.2 查询数据(Read)
ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE id > 1");
while (rs.next()) {
System.out.println(rs.getString("name"));
}
7.3 更新数据(Update)
PreparedStatement pstmt = conn.prepareStatement("UPDATE users SET name=? WHERE id=?");
pstmt.setString(1, "Tom");
pstmt.setInt(2, 1);
pstmt.executeUpdate();
7.4 删除数据(Delete)
PreparedStatement pstmt = conn.prepareStatement("DELETE FROM users WHERE id = ?");
pstmt.setInt(1, 3);
pstmt.executeUpdate();
CRUD操作流程图:
💡 8. 事务处理与异常控制
事务是一组逻辑上必须同时完成的操作,要么全部成功,要么全部失败。
示例代码:
conn.setAutoCommit(false); // 关闭自动提交
try {
stmt.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
stmt.executeUpdate("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
conn.commit(); // 提交事务
} catch (SQLException e) {
conn.rollback(); // 回滚事务
e.printStackTrace();
}
🚀 9. 批量操作提升效率
批量操作减少网络往返次数,提高性能。
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO users(id, name) VALUES (?, ?)");
for (int i = 5; i <= 10; i++) {
pstmt.setInt(1, i);
pstmt.setString(2, "User" + i);
pstmt.addBatch();
}
pstmt.executeBatch(); // 执行批处理
📦 10. 调用存储过程与函数
存储过程调用:
CallableStatement cstmt = conn.prepareCall("{call get_user_by_id(?)}");
cstmt.setInt(1, 1);
ResultSet rs = cstmt.executeQuery();
⏱ 11. 使用连接池优化性能(C3P0 & HikariCP)
11.1 为什么需要连接池?
频繁打开和关闭数据库连接会消耗大量资源。连接池复用已有连接,显著提高性能。
11.2 使用 HikariCP 示例:
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:oracle:thin:@localhost:1521/XEPDB1");
config.setUsername("test");
config.setPassword("test");
config.setDriverClassName("oracle.jdbc.driver.OracleDriver");
HikariDataSource ds = new HikariDataSource(config);
Connection conn = ds.getConnection();
11.3 连接池工作流程图:
graph TD
A[请求连接] --> B{连接池是否有空闲?}
B -->|是| C[返回现有连接]
B -->|否| D[创建新连接或等待]
C --> E[执行SQL]
D --> E
E --> F[释放连接回池]
❗ 12. 常见问题与解决方案汇总
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
| ClassNotFoundException | 驱动未正确引入 | 检查 Maven 配置或 jar 包是否导入 |
| No suitable driver found | URL 格式错误 | 检查 jdbc:oracle:thin:@ 是否拼写正确 |
| Communications link failure | 数据库未启动 | 启动 Oracle 或检查网络 |
| ORA-01017: invalid username/password | 用户名密码错误 | 修改账号权限或检查输入 |
📝 13. 总结与拓展建议
本文详细讲解了 Java 如何通过 JDBC 连接 Oracle 数据库,并结合实际案例演示了从连接、查询、事务处理到连接池优化的完整开发流程。
📌 后续可继续学习系列文章:
[【Java与MySQL数据库连接实战指南】]
[【Java与PostgreSQL实战指南】]
[【Java与SQL Server连接全攻略】]
📣 点击关注我,第一时间获取更多Java与数据库实战干货!
👨💻 作者简介:
一位热爱技术分享的 CSDN 博主,专注于 Java 全栈开发、微服务架构、数据库优化等领域,持续输出高质量技术文章。欢迎留言交流或私信获取源码及资料!
✅ 本文为原创内容,如需转载,请注明出处!
©️ 2025 CSDN Java 技术专栏 · 版权所有






















暂无评论内容