JDBC 详解:从基础到高级完全指南

在 Java 开发中,与数据库的交互是一项核心任务。JDBC(Java Database Connectivity)为 Java 提供了访问和操作数据库的标准接口。本篇文章将带您从基础到高级,全面解析 JDBC 的原理、使用方法及优化技巧。


目录

什么是 JDBC?

JDBC 的主要功能

JDBC 的架构

JDBC 的核心组件

JDBC 的基本使用步骤

1. 加载数据库驱动

2. 建立数据库连接

3. 创建 SQL 语句

5. 关闭资源

JDBC 中的常见操作

1. 插入数据

 2. 更新数据

 3. 删除数据

 4. 事务管理

JDBC 的最佳实践

1. 使用连接池

2. 防止 SQL 注入

3. 资源管理

高级主题:元数据与批量操作

1. 获取数据库元数据

 2. 批量操作

常见问题与解决方案

1. ClassNotFoundException

2. 连接泄漏

3. 编码问题

总结


什么是 JDBC?

JDBC 是 Java 提供的一套 API,旨在帮助开发者通过 Java 程序与数据库进行交互。通过 JDBC,可以轻松实现数据库连接、执行 SQL 查询、更新数据等操作。

JDBC 的主要功能

  • 连接数据库。
  • 执行 SQL 查询和更新语句。
  • 处理查询结果集。

JDBC 的架构

JDBC 的架构分为两部分:

  1. JDBC API:提供开发者使用的接口。
  2. JDBC Driver:驱动程序,负责将 JDBC 调用翻译成数据库能理解的语言。

以下是 JDBC 架构的图解:

[Java Application] --API--> [JDBC Driver Manager] --Driver--> [Database]

 


JDBC 的核心组件

JDBC 由以下几个核心组件构成:

  1. DriverManager
    • 管理数据库驱动程序。
    • 提供 getConnection() 方法,用于建立数据库连接。
  2. Connection
    • 表示与数据库的连接,用于执行 SQL 和管理事务。
  3. Statement
    • 用于发送 SQL 语句到数据库。
    • 包括:
      • Statement:适合简单 SQL。
      • PreparedStatement:支持预编译,防止 SQL 注入。
      • CallableStatement:用于调用存储过程。
  4. ResultSet
    • 表示 SQL 查询的结果集,支持迭代和数据提取。

JDBC 的基本使用步骤

以下是使用 JDBC 的标准流程:

1. 加载数据库驱动

通过 Class.forName 方法加载 JDBC 驱动程序:

Class.forName("com.mysql.cj.jdbc.Driver");

 

2. 建立数据库连接

使用 DriverManager 获取数据库连接:

Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_name", "username", "password"
);

 

3. 创建 SQL 语句

使用 StatementPreparedStatement 创建 SQL 语句:

String sql = "SELECT * FROM users";
Statement statement = connection.createStatement();

4. 执行 SQL 语句并处理结果

ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {System.out.println("User: " + resultSet.getString("username"));
}

 

5. 关闭资源

务必在完成后关闭数据库连接和其他资源:

 

resultSet.close();
statement.close();
connection.close();

 完整代码演示:

import java.sql.*;public class JdbcExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/test";String user = "root";String password = "1234";try {Class.forName("com.mysql.cj.jdbc.Driver");Connection connection = DriverManager.getConnection(url, user, password);String sql = "SELECT * FROM employees";Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()) {System.out.println("ID: " + resultSet.getInt("id"));System.out.println("Name: " + resultSet.getString("name"));}resultSet.close();statement.close();connection.close();} catch (Exception e) {e.printStackTrace();}}
}

JDBC 中的常见操作

1. 插入数据

String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, "Alice");
ps.setString(2, "password123");
ps.executeUpdate();

 2. 更新数据

String sql = "UPDATE users SET password = ? WHERE username = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, "newpassword");
ps.setString(2, "Alice");
ps.executeUpdate();

 3. 删除数据

String sql = "DELETE FROM users WHERE username = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, "Alice");
ps.executeUpdate();

 4. 事务管理

connection.setAutoCommit(false);
try {Statement statement = connection.createStatement();statement.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE id = 1");statement.executeUpdate("UPDATE accounts SET balance = balance + 100 WHERE id = 2");connection.commit();
} catch (Exception e) {connection.rollback();
}

 


JDBC 的最佳实践

1. 使用连接池

为了提高性能,建议使用连接池工具,如 HikariCP 或 Apache DBCP。

2. 防止 SQL 注入

永远使用 PreparedStatement 而不是 Statement

String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, "Alice");
ResultSet rs = ps.executeQuery();

 

3. 资源管理

使用 try-with-resources 确保资源自动关闭:

try (Connection conn = DriverManager.getConnection(url, user, password);PreparedStatement ps = conn.prepareStatement(sql)) {// SQL 操作
}

 


高级主题:元数据与批量操作

1. 获取数据库元数据

DatabaseMetaData metaData = connection.getMetaData();
System.out.println("Driver Name: " + metaData.getDriverName());

 2. 批量操作

String sql = "INSERT INTO employees (name, age) VALUES (?, ?)";
PreparedStatement ps = connection.prepareStatement(sql);
for (int i = 0; i < 1000; i++) {ps.setString(1, "Employee" + i);ps.setInt(2, 25 + i % 10);ps.addBatch();
}
ps.executeBatch();

 


常见问题与解决方案

1. ClassNotFoundException

确保已正确添加数据库驱动 jar 包到项目中。

2. 连接泄漏

使用连接池工具,并在每次操作后正确关闭连接。

3. 编码问题

在 URL 中指定字符集:

jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8

 


总结

JDBC 是 Java 访问数据库的基础技术,通过本文的学习,您应该掌握了从 JDBC 的基础使用到高级技巧。对于实际开发,建议结合连接池和 ORM 框架(如 Hibernate 或 MyBatis)进一步提高效率。

希望本文对您有所帮助!如果有任何问题,欢迎在评论区交流! 🎉


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477646.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

社交电商专业赋能高校教育与产业协同发展:定制开发AI智能名片及2+1链动商城小程序的创新驱动

摘要&#xff1a;本文围绕社交电商有望成为高校常态专业这一趋势展开深入探讨&#xff0c;剖析国家政策认可下其学科发展前景&#xff0c;着重阐述在专业建设进程中面临的师资短缺及实践教学难题。通过引入定制开发AI智能名片与21链动商城小程序&#xff0c;探究如何借助这些新…

Linux各种并发服务器优缺点

本文旨在介绍针对“无并发C/S模型”改进的方法总结以及各种改进方法的优缺点&#xff0c;具体函数的实现并不介绍。 1. 无并发C/S模型 创建服务器流程分析&#xff1a; socket()创建服务器的监听套接字bind()将服务器给服务器的监听套接字绑定IP地址和Port端口号listen()设置…

基于AXI PCIE IP的FPGA PCIE卡示意图

创作不易&#xff0c;转载请注明出处&#xff1a;https://blog.csdn.net/csdn_gddf102384398/article/details/143926217 上图中&#xff0c;在FPGA PCIE卡示意图内&#xff0c;有2个AXI Master设备&#xff0c;即&#xff1a;PCIE到AXI4-Full-Master桥、AXI CDMA IP&#xff1…

【漏洞复现】|智互联SRM智联云采系统quickReceiptDetail SQL注入漏洞

漏洞描述 智互联(深圳)科技有限公司SRM智联云采系统针对企业供应链管理难题&#xff0c;及智能化转型升级需求&#xff0c;智联云采依托人工智能、物联网、大数据、云等技术&#xff0c;通过软硬件系统化方案&#xff0c;帮助企业实现供应商关系管理和采购线上化、移动化、智能…

el-table-column自动生成序号在序号前插入图标

实现效果&#xff1a; 代码如下&#xff1a; 在el-table里加入这个就可以了&#xff0c;需要拿到值可以用scope.$index ​​​​​​​<el-table-column type"index" label"序号" show-overflow-tooltip"true" min-width"40">…

如何利用 Puppeteer 的 Evaluate 函数操作网页数据

介绍 在现代的爬虫技术中&#xff0c;Puppeteer 因其强大的功能和灵活性而备受青睐。Puppeteer 是一个用于控制 Chromium 或 Chrome 浏览器的 Node.js 库&#xff0c;提供了丰富的 API 接口&#xff0c;能够帮助开发者高效地处理动态网页数据。本文将重点讲解 Puppeteer 的 ev…

“小浣熊家族AI办公助手”产品体验 — “人人都是数据分析师”

一、引言&#xff1a; 大家平时应该在工作中常常使用到Excel来做数据统计&#xff0c;比如临近过年时&#xff0c;公司一般会开各种复盘、年终、检讨、明年规划大会&#xff0c;势必需要准备一大堆的量化数据报表&#xff0c;用于会议上的数据汇报、分析工作&#xff0c;试想一…

Unity-添加世界坐标系辅助线

如果你想在场景中更直观地显示世界坐标系&#xff0c;可以通过编写一个简单的脚本来实现。下面是一个基本的示例脚本&#xff0c;它会在场景中绘制出世界坐标系的三个轴&#xff1a; using UnityEngine;public class WorldAxesIndicator : MonoBehaviour {public float length…

Makefile基础应用

1 使用场景 在Linux环境下&#xff0c;我们通常需要通过命令行来编译代码。例如&#xff0c;在使用gcc编译C语言代码时&#xff0c;需要使用以下命令。 gcc -o main main.c 使用这种方式编译代码非常吃力&#xff0c;每次调试代码都需要重新在命令行下重新编译&#xff0c;重复…

【tensorflow的安装步骤】

创建一个虚拟环境 conda create -n tensorflow python3.6激活虚拟环境 conda activate tensorflow使用镜像源下载 pip install tensorflow1.15.0 -i https://pypi.tuna.tsinghua.edu.cn/simple/特别特别重要的点&#xff01;&#xff01;&#xff01; 别用WiFi或者校园网下…

【Python · PyTorch】循环神经网络 RNN(基础概念)

【Python PyTorch】循环神经网络 RNN&#xff08;基础概念&#xff09; 0. 生物学相似性1. 概念2. 延时神经网络&#xff08;TDNN&#xff09;3. 简单循环神经网络&#xff08;Simple RNN&#xff09;3.1 BiRNN 双向循环神经网络3.2 特点记忆性参数共享图灵完备 3.3 网络结构3…

使用EFK收集k8s日志

首先我们使用EFK收集Kubernetes集群中的日志&#xff0c;本次实验讲解的是在Kubernetes集群中启动一个Elasticsearch集群&#xff0c;如果企业内已经有了Elasticsearch集群&#xff0c;可以直接将日志输出至已有的Elasticsearch集群。 文章目录 部署elasticsearch创建Kibana创建…

Qt入门1——认识Qt的几个常用头文件和常用函数

1.头文件 ① #include <QPushButton>——“按钮”头文件&#xff1b; ② #include <QLabel>——“标签”头文件&#xff1b; ③ #include <QFont>——“字体”头文件&#xff1b; ④#include <QDebug>——输出相关信息&#xff1b; 2. 常用函数/类的基…

【Linux驱动开发】irq中断配置API及中断应用 阻塞休眠和非阻塞的驱动操作

【Linux驱动开发】irq中断配置API及中断应用 阻塞休眠和非阻塞的驱动操作 文章目录 中断操作注册和释放中断中断服务函数使能和禁止上半部和下半部软中断tasklet工作队列 设备节点中的中断中断号API函数获取中断号获取中断信息 中断应用读取设备树节点获取中断号获取中断触发方…

Linux设置以及软件的安装(hadoop集群安装02)

一、Linux的常见设置 1、设置静态IP vi /etc/sysconfig/network-scripts/ifcfg-ens33 如何查看自己的虚拟机的网关&#xff1a; 完整的配置&#xff08;不要拷贝我的&#xff09;&#xff1a; TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no&…

excel版数独游戏(已完成)

前段时间一个朋友帮那小孩解数独游戏&#xff0c;让我帮解&#xff0c;我看他用电子表格做&#xff0c;只能显示&#xff0c;不能显示重复&#xff0c;也没有协助解题功能&#xff0c;于是我说帮你做个电子表格版的“解题助手”吧&#xff0c;不能直接解题&#xff0c;但该有的…

网络安全,文明上网(5)注重隐私加密

前言 为了维护个人数据和通信的安全&#xff0c;防止非法获取或泄露&#xff0c;可以采用多种隐私保护技术。 技术要点 1. 个人数据去标识化和匿名化方法&#xff1a; K匿名性(K-Anonymity)&#xff1a;由Sweeney提出&#xff0c;通过对个人数据进行匿名化处理&#xff…

【Unity】 GamePlay开发:通用的检查点/成就/条件触发系统

特别适用于各种解谜关卡, 成就系统&#xff0c;任务系统&#xff0c;的 通用事件处理 CheckPointHandler.cs随便挂在场景中的某个物体上 (单例模式&#xff0c;场景中只要有一个&#xff09; 1) How To Use CheckPoint Events是一个列表&#xff0c;每个元素是一个组合事件&…

P1 练习卷(C++4道题)

1.纷繁世界 内存限制&#xff1a;256MB 时间限制&#xff1a;1s 问题描述 这是一个纷繁复杂的世界。 某一天清晨你起床很迟&#xff0c;没有吃上早饭。于是你骑着自行车去超市&#xff0c;但是你又发现商店的工作人员已经重新贴上了价格标签&#xff0c;零食价格都涨了50%。你…

私有化部署视频平台EasyCVR宇视设备视频平台如何构建视频联网平台及升级视频转码业务?

在当今数字化、网络化的时代背景下&#xff0c;视频监控技术已广泛应用于各行各业&#xff0c;成为保障安全、提升效率的重要工具。然而&#xff0c;面对复杂多变的监控需求和跨区域、网络化的管理挑战&#xff0c;传统的视频监控解决方案往往显得力不从心。 EasyCVR视频融合云…