当前位置: 首页 > backend >正文

JDBC 使用流程详解

1. 加载数据库驱动

目的:注册数据库驱动类,使 JDBC 能识别特定数据库(如 MySQL、Oracle)。
代码示例

// JDBC 4.0+ 后无需显式加载驱动(SPI 自动发现),但部分旧项目仍需手动加载
Class.forName("com.mysql.cj.jdbc.Driver");

2. 建立数据库连接

目的:通过 DriverManager 获取数据库连接对象 Connection
代码示例

String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, user, password);

参数说明

  • URL 格式jdbc:数据库类型://主机:端口/数据库名?参数键值对

  • 常见参数

    • useSSL=false:禁用 SSL(测试环境)。

    • serverTimezone=UTC:设置时区(避免时区错误)。


3. 创建 Statement 对象

目的:通过 Connection 创建 Statement 或 PreparedStatement,用于执行 SQL。

(1) Statement(普通语句)
Statement statement = connection.createStatement();

(2) PreparedStatement(预编译语句,推荐) 

String sql = "SELECT * FROM user WHERE id = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 1001); // 参数索引从 1 开始

优势

  • 防 SQL 注入:通过占位符(?)预编译 SQL。

  • 性能优化:重复执行相同 SQL 时复用编译结果。


4. 执行 SQL 并处理结果

目的:执行 SQL 并处理返回的 ResultSet(查询)或影响行数(更新)。

(1) 查询操作(SELECT)
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("ID: " + id + ", Name: " + name);
}
(2) 更新操作(INSERT/UPDATE/DELETE)
String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "张三");
pstmt.setInt(2, 25);
int affectedRows = pstmt.executeUpdate();
System.out.println("影响行数: " + affectedRows);

5. 关闭资源

目的:释放数据库连接、Statement、ResultSet 等资源,避免内存泄漏。
代码示例

// 在 finally 块或 try-with-resources 中关闭资源
try {if (resultSet != null) resultSet.close();if (preparedStatement != null) preparedStatement.close();if (connection != null) connection.close();
} catch (SQLException e) {e.printStackTrace();
}

优化方案:使用 try-with-resources(Java 7+)自动关闭资源:

try (Connection conn = DriverManager.getConnection(url, user, password);PreparedStatement pstmt = conn.prepareStatement(sql);ResultSet rs = pstmt.executeQuery();
) {while (rs.next()) {// 处理结果}
} catch (SQLException e) {e.printStackTrace();
}

6. 异常处理

目的:捕获 SQLException,处理数据库操作中的错误。
代码示例

try {// JDBC 操作
} catch (SQLException e) {System.err.println("数据库错误: " + e.getMessage());e.printStackTrace();
} finally {// 关闭资源
}

完整代码示例

import java.sql.*;public class JdbcDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";String user = "root";String password = "123456";String sql = "SELECT * FROM user WHERE age > ?";try (Connection conn = DriverManager.getConnection(url, user, password);PreparedStatement pstmt = conn.prepareStatement(sql);) {pstmt.setInt(1, 18);ResultSet rs = pstmt.executeQuery();while (rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");int age = rs.getInt("age");System.out.printf("ID: %d, Name: %s, Age: %d\n", id, name, age);}} catch (SQLException e) {e.printStackTrace();}}
}

JDBC 进阶优化

  1. 使用连接池(如 HikariCP、Druid):避免频繁创建/关闭连接,提升性能。

  2. 批量操作:通过 addBatch() 和 executeBatch() 提升批量插入/更新效率。

  3. 事务管理:通过 connection.setAutoCommit(false) 手动控制事务提交与回滚。


http://www.xdnf.cn/news/2629.html

相关文章:

  • rag增强检索-基于关键词检索的混合检索模式
  • vue响应式原理——vue2和vue3的响应式实现区别
  • 非结构化数据解析
  • wsl(8) -- 图形界面
  • 封装el-autocomplete,接口调用
  • Ubuntu安装brew
  • OSI 模型(开放系统互联模型)
  • FEKO许可安装
  • CCF推荐学术会议-C(网络与信息安全):SAC 2025
  • Python学习之路(六)-图像识别
  • 数字化转型的未来趋势:从工具到生态,聚焦生态合作、绿色转型与全球化布局
  • Vue3 Element Plus el-tabs数据刷新方法
  • 更快的图像局部修改与可控生成:Flex.2-preview
  • 航顺 芯片 开发记录 (一) 2025年4月27日19:23:32
  • 【博客系统】博客系统第二弹:实现博客列表接口
  • T检验、F检验及样本容量计算学习总结
  • 通过示例学习:连续 XOR
  • SpringBoot驾校报名小程序实现
  • 详细PostMan的安装和基本使用方法
  • 【SF】在 Android 显示系统中,图层合成方式 Device 和 Client 的区别
  • 文章记单词 | 第50篇(六级)
  • Zookeeper HA集群搭建
  • 昂瑞微蓝牙OM6621系列对比选型指南
  • 《代码整洁之道》第8章 边界 - 笔记
  • NCCL 通信与调试
  • Grok发布了Grok Studio 和 Workspaces两个强大的功能。该如何使用?如何使用Grok3 API?
  • 深度学习与SLAM特征提取融合:技术突破与应用前景
  • 深入解读:2025 数字化转型管理 参考架构
  • 视频HLS分片与关键帧优化深度解析
  • 2025 网络安全技术深水区探索:从 “攻防对抗” 到 “数字韧性” 的范式跃迁