news 2026/7/14 2:21:42

深入解析JDBC:Java数据库操作的基础

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入解析JDBC:Java数据库操作的基础

1.JDBC概述

JDBC(Java Database Connectivity)是Java提供的一种数据库连接技术,用于在Java应用程序中与数据库进行交互。它通过一组API提供了访问和操作数据库的标准方式。JDBC支持大多数关系型数据库,包括MySQL、Oracle、SQL Server等。

JDBC的主要作用是:

  • 连接数据库。

  • 执行SQL语句(包括查询、更新、删除等)。

  • 获取查询结果。

  • 提交或回滚事务。

JDBC是Java程序与数据库之间的桥梁,任何基于Java的应用程序如果需要和数据库进行数据交互,都会使用JDBC技术。


2.JDBC的核心组件

JDBC的核心组成包括:

  • DriverManager:管理数据库驱动程序。

  • Connection:表示与数据库的连接。

  • Statement:用于执行SQL语句。

  • ResultSet:存储查询结果的集合。

  • PreparedStatement:比Statement更加安全,支持预编译SQL语句。

  • CallableStatement:用于执行数据库存储过程。

  • Transaction:事务控制,支持提交和回滚。

JDBC架构图
+--------------------------+ | Application | | (Java Code) | +--------------------------+ | v +--------------------------+ | DriverManager | | (Manages Drivers) | +--------------------------+ | v +--------------------------+ | Connection | | (Database Connection) | +--------------------------+ | v +--------------------------+ | Statement/Prepared | | Statement/Callable | +--------------------------+ | v +--------------------------+ | ResultSet | | (Query Result) | +--------------------------+

3.JDBC连接流程

JDBC连接数据库的基本步骤如下:

  1. 加载数据库驱动:通过Class.forName()方法加载数据库驱动。

  2. 建立连接:通过DriverManager.getConnection()方法建立数据库连接。

  3. 执行SQL语句:使用StatementPreparedStatement执行SQL语句。

  4. 处理结果集:使用ResultSet获取查询结果。

  5. 关闭连接:操作完成后,关闭ResultSetStatementConnection


4.JDBC代码示例

1) 基本的JDBC查询操作
import java.sql.*; public class JDBCExample { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // 1. 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 建立数据库连接 conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/mydb", "root", "password"); // 3. 创建Statement对象 stmt = conn.createStatement(); // 4. 执行查询操作 String sql = "SELECT id, name, email FROM users"; rs = stmt.executeQuery(sql); // 5. 处理查询结果 while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); String email = rs.getString("email"); System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email); } } catch (SQLException | ClassNotFoundException e) { e.printStackTrace(); } finally { try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }

解释:

  • DriverManager.getConnection()用于建立数据库连接。

  • Statement.executeQuery()用于执行查询操作,并返回ResultSet

  • ResultSet用于处理查询结果。

2) 插入数据
public void insertUser(String name, String email) { Connection conn = null; PreparedStatement pstmt = null; try { // 1. 加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 建立连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password"); // 3. 创建PreparedStatement String sql = "INSERT INTO users (name, email) VALUES (?, ?)"; pstmt = conn.prepareStatement(sql); // 4. 设置参数 pstmt.setString(1, name); pstmt.setString(2, email); // 5. 执行插入操作 int rowsAffected = pstmt.executeUpdate(); System.out.println(rowsAffected + " row(s) inserted."); } catch (SQLException | ClassNotFoundException e) { e.printStackTrace(); } finally { try { if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }

解释:

  • PreparedStatement用于执行插入、更新等操作,支持参数化查询,避免SQL注入攻击。

3) 事务管理
public void transferMoney(int fromAccount, int toAccount, double amount) { Connection conn = null; PreparedStatement pstmt1 = null, pstmt2 = null; try { // 1. 加载驱动并建立连接 Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password"); // 2. 开始事务 conn.setAutoCommit(false); // 3. 执行转账操作 String sql1 = "UPDATE accounts SET balance = balance - ? WHERE account_id = ?"; pstmt1 = conn.prepareStatement(sql1); pstmt1.setDouble(1, amount); pstmt1.setInt(2, fromAccount); pstmt1.executeUpdate(); String sql2 = "UPDATE accounts SET balance = balance + ? WHERE account_id = ?"; pstmt2 = conn.prepareStatement(sql2); pstmt2.setDouble(1, amount); pstmt2.setInt(2, toAccount); pstmt2.executeUpdate(); // 4. 提交事务 conn.commit(); System.out.println("Transfer successful."); } catch (SQLException | ClassNotFoundException e) { try { // 回滚事务 if (conn != null) conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); } finally { try { if (pstmt1 != null) pstmt1.close(); if (pstmt2 != null) pstmt2.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }

解释:

  • conn.setAutoCommit(false)禁用自动提交,手动控制事务。

  • conn.commit()提交事务,conn.rollback()回滚事务。


5.JDBC常见问题

  1. 如何处理数据库连接池?
    JDBC连接池用于管理数据库连接,提高数据库连接的重用性和性能。常用的连接池库有 C3P0、HikariCP 和 DBCP。

  2. JDBC如何避免SQL注入?
    使用PreparedStatement而不是Statement,因为PreparedStatement通过预编译SQL语句来避免SQL注入。


6.总结

JDBC是Java开发中与数据库交互的基础,虽然相比于一些高级框架(如Hibernate),JDBC显得更加底层,但它提供了更高的灵活性和控制权。掌握JDBC的基本操作,包括数据库连接、SQL执行、事务管理等,是每个Java开发者的必备技能。

通过本篇文章的示例代码和概念讲解,希望能够帮助你更好地理解JDBC的核心原理与应用。


这篇文章讲解了JDBC的基本使用和一些常见的数据库操作,若你希望看到更深入的JDBC使用或数据库优化技巧,随时可以提问。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 13:58:00

DAY24 奇异值SVD分解

一、SVD的实际价值 1. 计算效率提升 特征从n维降至k维&#xff08;k<n&#xff09; 减少模型参数数量 加快训练和预测速度 2. 模型泛化能力 去除噪声和冗余信息 可能提高模型在测试集上的表现 减少过拟合风险 二、实际书写思路及其代码 针对心脏并数据集我们进行了…

作者头像 李华
网站建设 2026/7/13 9:40:37

GUID为什么不会重复?

GUID为什么不会重复? GUID/UUID &#xff08;全局唯一标识符&#xff09;之所以被认为“几乎不会重复”&#xff0c;是因为其庞大的组合空间和精心设计的生成算法&#xff0c;使得在现实世界中重复的概率低到可以忽略不计。 以下是 GUID 不会重复的核心原因&#xff1a; 1. 庞…

作者头像 李华
网站建设 2026/7/13 15:43:45

E-Hentai批量下载工具:高效管理数字收藏资源的最佳方案

在数字资源日益丰富的今天&#xff0c;如何高效管理和保存有价值的在线内容成为了许多用户的共同痛点。面对心仪的图库资源&#xff0c;传统的手动保存方式不仅效率低下&#xff0c;还容易导致文件混乱。针对这一需求&#xff0c;E-Hentai-Downloader提供了一个简单而强大的解决…

作者头像 李华
网站建设 2026/7/14 5:46:39

布隆过滤器

一、布隆过滤器 1. 什么是布隆过滤器&#xff1f; 布隆过滤器是一种空间效率极高的概率型数据结构&#xff0c;核心作用是快速判断「一个元素是否存在于集合中」。它的特点可以总结为&#xff1a; 说「元素不在」→ 100%准确&#xff08;绝对没在集合里&#xff09;&#xff1b…

作者头像 李华
网站建设 2026/7/12 8:21:16

【JESD22-B109C】倒装芯片拉伸测试

B109C 测试方法&#xff1a;Flip Chip Tensile Pull 倒装芯片拉伸测试1 范围本测试方法适用于芯片与基板焊点形成后、未涂覆底部填充胶或其他会提高表观结合强度的材料前的倒装芯片。其用途包括&#xff1a;评估特定倒装芯片的芯片接合工艺一致性与质量&#xff1b;评估特定倒装…

作者头像 李华
网站建设 2026/7/11 22:40:36

2025年应届生闭坑指南:如何挑选低费用、高认可度的AI技能证书?

随着人工智能技术席卷各行各业&#xff0c;手握相关技能证书已成为应届毕业生提升就业竞争力的重要筹码。然而&#xff0c;面对市场上琳琅满目、价格不一的认证项目&#xff0c;许多同学不禁感到迷茫&#xff1a;如何避开“高价低能”的坑&#xff0c;选择一款既具高含金量又不…

作者头像 李华