JDBC 完全指南:掌握 Java 数据库交互的核心技术
JDBC 完全指南:掌握 Java 数据库交互的核心技术
一、JDBC 是什么?为什么它如此重要?
JDBC(Java Database Connectivity)是 Java 语言中用于连接和操作关系型数据库的标准 API。它允许开发者通过统一的接口访问不同的数据库(如 MySQL、Oracle、PostgreSQL 等),而无需关心底层数据库的具体实现。 JDBC是学习Mybatis的前提,Mybatis是JDBC的简化,清楚认识到jdbc的流程,才能更好理解Mybatis。Mybatis明天准时更新。
JDBC 的核心价值
- 跨数据库兼容性:同一套代码适配多种数据库(通过更换驱动即可)。
- 简化开发:封装数据库协议细节,开发者专注于业务逻辑。
- 性能可控:支持从原生 SQL 操作到连接池优化等多层调优。
二、JDBC 架构与核心组件
JDBC 的架构分为两层:
- 应用程序层:开发者编写的 Java 代码。
- 驱动层:数据库厂商提供的 JDBC 驱动(如
mysql-connector-java
)。
核心接口与类
组件 | 作用 |
---|---|
DriverManager | 管理数据库驱动,建立与数据库的连接 |
Connection | 表示与数据库的会话,用于管理事务和创建语句对象 |
Statement | 执行静态 SQL 语句(如 SELECT , INSERT ) |
PreparedStatement | 预编译 SQL 语句,防止 SQL 注入,提升性能 |
CallableStatement | 调用数据库存储过程 |
ResultSet | 封装查询结果集,支持遍历和读取数据 |
三、JDBC 工作流程详解
6 步完成数据库操作
1. 注册驱动(可选)
从 JDBC 4.0 开始,支持自动驱动加载,无需手动调用 Class.forName()
。
// 旧方式(JDBC 3.0)
Class.forName("com.mysql.cj.jdbc.Driver"); // JDBC 4.0+ 自动加载驱动(需驱动 JAR 包含 META-INF/services/java.sql.Driver 文件)
2. 建立连接
通过 DriverManager.getConnection()
获取 Connection
对象。
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "123456"; try (Connection conn = DriverManager.getConnection(url, user, password)) { // 使用连接执行操作
}
3. 创建 Statement
根据需求选择 Statement
或 PreparedStatement
。
// 静态 SQL(存在 SQL 注入风险)
Statement stmt = conn.createStatement(); // 预编译 SQL(推荐)
String sql = "INSERT INTO users(name, email) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
4. 执行 SQL
- 查询:
executeQuery()
返回ResultSet
。 - 更新:
executeUpdate()
返回受影响的行数。
// 插入数据
pstmt.setString(1, "Alice");
pstmt.setString(2, "alice@example.com");
int rows = pstmt.executeUpdate();
System.out.println("插入行数: " + rows); // 查询数据
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
5. 处理结果集
遍历 ResultSet
并读取数据。
while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println(id + ", " + name);
}
6. 关闭资源
使用 try-with-resources 自动关闭资源(Java 7+)。
try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery()) { // 操作代码
} catch (SQLException e) { e.printStackTrace();
}
四、PreparedStatement vs Statement:为什么前者更优秀?
对比项 | Statement | PreparedStatement |
---|---|---|
SQL 注入风险 | 高(直接拼接 SQL) | 低(参数化查询) |
性能 | 每次执行需编译 SQL | 预编译一次,重复使用效率高 |
可读性 | 字符串拼接复杂 | 参数占位符(? )清晰易读 |
示例:PreparedStatement 防 SQL 注入
String input = "admin'; DROP TABLE users;--"; // 错误方式(Statement)
String sql = "SELECT * FROM users WHERE name = '" + input + "'";
// 实际 SQL: SELECT * FROM users WHERE name = 'admin'; DROP TABLE users;--' // 正确方式(PreparedStatement)
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE name = ?");
pstmt.setString(1, input); // 参数会被安全处理
五、事务管理:保证数据一致性
通过 Connection
对象控制事务:
try (Connection conn = DriverManager.getConnection(url, user, password)) { conn.setAutoCommit(false); // 关闭自动提交 // 执行多个操作 updateAccount(conn, "A", -100); updateAccount(conn, "B", 100); conn.commit(); // 提交事务
} catch (SQLException e) { conn.rollback(); // 回滚事务
}
关键方法:
setAutoCommit(boolean)
:启用/禁用自动提交。commit()
:提交事务。rollback()
:回滚事务。
六、连接池:提升性能的关键
为什么需要连接池?
- 频繁创建/关闭连接开销大。
- 连接池预先创建并管理连接,复用连接减少延迟。
常用连接池库
- HikariCP:高性能,Spring Boot 默认选择。
- Apache DBCP:稳定但性能一般。
- C3P0:功能丰富,但较老旧。
HikariCP 示例配置
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost/mydb");
config.setUsername("root");
config.setPassword("123456");
config.setMaximumPoolSize(10); try (HikariDataSource dataSource = new HikariDataSource(config); Connection conn = dataSource.getConnection()) { // 使用连接
}
七、异常处理与最佳实践
1. 处理 SQLException
- 捕获并记录异常,避免直接忽略。
- 使用
SQLException.getErrorCode()
获取数据库特定错误码。
2. 最佳实践
- 始终使用 PreparedStatement:防止 SQL 注入。
- 使用 try-with-resources:确保资源释放。
- 合理设置连接池参数:如最大连接数、超时时间。
- 日志记录 SQL 操作:便于调试和审计。
八、进阶:JdbcTemplate 与 ORM 框架
1. Spring JdbcTemplate
简化 JDBC 样板代码:
@Autowired
private JdbcTemplate jdbcTemplate; public List<User> getUsers() { return jdbcTemplate.query("SELECT * FROM users", (rs, rowNum) -> { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); return user; });
}
2. ORM 框架(如 MyBatis、Hibernate)
- MyBatis:通过 XML/注解映射 SQL,灵活性强。
- Hibernate:全自动 ORM,适合复杂对象模型。
九、完整示例:JDBC CRUD 操作
public class JdbcDemo { private static final String URL = "jdbc:mysql://localhost:3306/mydb"; private static final String USER = "root"; private static final String PASSWORD = "123456"; public static void main(String[] args) { // 插入用户 insertUser("Bob", "bob@example.com"); // 查询用户 List<User> users = getUsers(); users.forEach(System.out::println); } public static void insertUser(String name, String email) { String sql = "INSERT INTO users(name, email) VALUES (?, ?)"; try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, name); pstmt.setString(2, email); pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } public static List<User> getUsers() { List<User> users = new ArrayList<>(); String sql = "SELECT * FROM users"; try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { while (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setEmail(rs.getString("email")); users.add(user); } } catch (SQLException e) { e.printStackTrace(); } return users; }
}
**十、总结
核心要点回顾
- JDBC 是 Java 操作数据库的标准,通过驱动实现跨数据库兼容。
PreparedStatement
比Statement
更安全高效。- 事务和连接池是提升性能与稳定性的关键。
掌握 JDBC,您已打通 Java 与数据库的桥梁! 🚀
相关文章:

JDBC 完全指南:掌握 Java 数据库交互的核心技术
JDBC 完全指南:掌握 Java 数据库交互的核心技术 一、JDBC 是什么?为什么它如此重要? JDBC(Java Database Connectivity)是 Java 语言中用于连接和操作关系型数据库的标准 API。它允许开发者通过统一的接口访问不同的数…...

Vue父子组件传递笔记
Vue父子组件传递笔记 props 父组件向子组件进行传值 (1)在父组件APP.vue <template><div> <!-- 给子组件Child.vue传递以msg的信号,传递的信息内容为messages --><Child :msg"messages"></Child>…...

文件上传漏洞与phpcms漏洞安全分析
目录 1. 文件上传漏洞简介 2. 文件上传漏洞的危害 3. 文件上传漏洞的触发条件 1. 文件必须能被服务器解析执行 2. 上传目录必须支持代码执行 3. 需要能访问上传的文件 4. 例外情况:非脚本文件也可能被执行 4. 常见的攻击手法 4.1 直接上传恶意文件 4.2 文件…...

【deepseek】辅助思考生物学问题:ICImapping构建遗传图谱gap较大
基于ICImapping构建遗传图谱的常见问题与解答 问题一:染色体两端标记间遗传距离gap较大 答疑一 标记密度不足(如芯片设计时分布不均)重组概率低基因组结构变异软件算法限制 Deepseek的解释 #### 1. **染色体末端的重组率较低** - **现象*…...

linux磁盘非lvm分区
linux磁盘非lvm分区 类似于windows划分C盘、D盘,并且不需要多个磁盘空间合一 图形化直接分区 通过gparted 这个提供直观的图形化分区,类似windows的磁盘管理工具 下载方式: 乌班图/debian系列: sudo apt install gparted红帽…...

Windows下sql server2012安装流程
准备工作 确认系统要求:确保 Windows 系统为 Windows 7 或更高版本,且为 64 位操作系统,CPU 在 2GHz 以上,内存 4GB 或更高。 下载安装包:从微软官方网站或其他可靠渠道下载 SQL Server 2012 安装包。 关闭相关软件&am…...

css之英文换行样式
在 CSS 中,要实现英文文本自动换行但不从单词中间断开的效果,可以使用 word-wrap 或 overflow-wrap 属性。以下是相关的 CSS 属性和它们的配置: 使用 overflow-wrap 或 word-wrap /* This property is used to handle word breaking */ .wo…...

绝美焦糖暖色调复古风景画面Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色教程 通过 Lr 软件丰富的工具和功能,对风景照片在色彩、影调等方面进行调整。例如利用基本参数调整选项,精准控制照片亮度、对比度、色温、色调等基础要素;运用 HSL 面板可对不同色彩的色相、饱和度以及明亮度进行单独调节;利…...

文件解析:doc、docx、pdf
1.doc解析 ubuntu/debian系统应先安装工具 apt-get install python-dev libxml2-dev libxslt1-dev antiword unrtf poppler-utils pstotext tesseract-ocr \ flac ffmpeg lame libmad0 libsox-fmt-mp3 sox libjpeg-dev swig pip install textract解析: import te…...

计算机网络基础:VLAN(虚拟局域网)
1. VLAN 虚拟局域网:可以用来隔离广播 广播和广播域: arp 出不了路由器,只能攻击内网 路由器可以隔离广播(物理隔离)缺点是成本高、不灵活 2. VLAN 隔离广播 静态VLAN:基于交换机端口号划分 动态VLAN&am…...

C++学习笔记(十一)——循环结构
循环结构的作用 循环结构用于重复执行某一代码块,直到满足特定条件后退出循环。 C 提供了以下三种循环结构: for 循环(确定次数的循环)while 循环(条件控制的循环)do-while 循环(至少执行一次的…...

【C++】二叉树相关算法题
一、根据二叉树创建字符串 题目描述: 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 “()” 表示,转化后需要省略所有…...

物联网IoT系列之MQTT协议基础知识
文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么?什么是MQTT?为什么说MQTT是适用于物联网的协议?MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …...

【大学生体质】智能 AI 旅游推荐平台(Vue+SpringBoot3)-完整部署教程
智能 AI 旅游推荐平台开源文档 项目前端地址 ☀️项目介绍 智能 AI 旅游推荐平台(Intelligent AI Travel Recommendation Platform)是一个利用 AI 模型和数据分析为用户提供个性化旅游路线推荐、景点评分、旅游攻略分享等功能的综合性系统。该系统融合…...

【Node.js入门笔记1---初始Node.js)】
Node.js入门笔记1 初始Node.js1.Node.js简介2.Node.js中js的运行环境3.Node.js 可以做什么4.Node.js 怎么学 初始Node.js 1.Node.js简介 Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,用于在服务器端运行 JavaScript 代码。它让开发者可以用 Java…...

自学Java-JavaSE基础加强(多线程)
自学Java-JavaSE基础加强(多线程) 一、创建线程1、方式一:继承Thread类小结 2、方式二:实现Runnable接口小结 3、方式三:实现Callable接口4、小结 二、线程的常用方法三、线程安全1、认识线程安全2、模拟线程安全问题3…...

数字后端培训实战项目六大典型后端实现案例
Q1:请教一个问题,cts.sdc和func.sdc在innovus用如何切换?在flow哪一步切换输入cts.sdc?哪一步切换到func.sdc,具体如何操作? 这个学员其实就是在问使用分段长clock tree时具体的flow流程是怎么样的?针对时…...

安卓免费多功能工具:一站式解决 PDF 阅读、编辑、转换等需求
软件介绍 今天要给大家介绍一款功能强大的PDF处理软件——PDFgear Android版。它是专为安卓设备打造的,完全免费,无需破解和激活就能使用。 此前,我们分享过它的桌面端,收获了大家的一致好评。今天要着重介绍的手机APP版本&…...

diffuser库使用本地模型生成图像
实验目的 使用diffuser库生成图像的文章是很多的,使用方法也并不复杂,安装库后调用现成的模型和接口即可,但是因为网络原因,模型下载总会遇到问题,对于使用服务器的研究者来说,挂梯子并不可行,…...

递归—基础算法
#基线条件和递归条件 #每个递归函数都有两部分:基线条件和递归条件。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。 #栈:栈是一种数据结构,它是一种线性数据结构,…...

全面复习回顾——C++语法篇2
23、字符串相加 string s3;s3s1s2;cout<<s3; 24、结构体基本操作 struct student {// write your code here......string name;int age;double height0.0; };int main() {// write your code here......student s;cin>>s.name;cin>>s.age;cin>>s.hei…...

探秘基带算法:从原理到5G时代的通信变革【十】基带算法应用与对比
文章目录 三、算法在现代通信系统中的应用3.1 5G 通信中的应用3.1.1 信道编码与调制解调3.1.2 大规模 MIMO 技术3.1.3 案例分析:5G 基站与终端实现 3.2 卫星通信中的应用3.2.1 抗干扰与纠错编码3.2.2 信号处理与调制解调3.2.3 案例分析:卫星通信系统实例…...

Linux | Vim 鼠标不能右键粘贴、跨系统复制粘贴
注:本文为 “ Vim 中鼠标右键粘贴、跨系统复制粘贴问题解决方案” 相关文章合辑。 未整理去重。 Linux 入门:vim 鼠标不能右键粘贴、跨系统复制粘贴 foryouslgme 发布时间 2016 - 09 - 28 10:24:16 Vim 基础 命令模式(command - mode&…...

无人机遥控器扩频技术解析!
一、扩频技术基本原理 扩频技术(Spread Spectrum, SS)通过将信号的频谱扩展至远大于原始带宽进行传输,提升抗干扰性、隐蔽性和多用户能力。其核心原理包括: 直接序列扩频(DSSS) 利用高速伪随机码&#x…...

Spring Boot API 项目中 HAProxy 与 Nginx 的选择与实践
在开发 Spring Boot 构建的 RESTful API 项目时,负载均衡和反向代理是提升性能与可用性的关键环节。HAProxy 和 Nginx 作为两种流行的工具,经常被用于流量分发,但它们各有侧重。究竟哪一个更适合你的 Spring Boot API 项目?本文将…...

OpenBMC:BmcWeb构造connect对象
OpenBMC:BmcWeb server.run-CSDN博客 server在接收了tcp连接请求后,会构造一个ConnectionType对象,然后通过post调度,运行该对象的start函数 1.ConnectionType类型 其实也就是using ConnectionType = Connection<Adaptor, Handler>;类型 由于ConnectionType实例化于…...

ORB-SLAM2源码学习(六):相机跟踪(局部地图跟踪和关键帧创建)
目录 1.局部地图跟踪 1.1 更新局部关键帧UpdateLocalKeyFrames 1.2 更新局部地图点(来自局部关键帧)UpdateLocalPoints() 1.3 投影匹配 2. 对比四种跟踪方式以及使用的投影匹配 3.关键帧创建 3.1 判断是否需要创建新关键帧: NeedNewKeyFrame() 3…...

WordPress使用(3)
前面文章讲述了如何利用docker进行wordpress系统的安装及相关设置,本文将介绍如何进行站点数据和数据库数据的备份。 1. 备份数据库 # 进入mysql容器内部 docker exec -it mysqlwp bash# 使用mysqldump 命令导出数据库 mysqldump -u root -p wordpress > wordp…...

Docker基础篇——什么是Docker与Docker的仓库、镜像、容器三大概念
大家好我是木木,在当今快速发展的云计算与云原生时代,容器化技术蓬勃兴起,Docker 作为实现容器化的主流工具之一,为开发者和运维人员带来了极大的便捷 。下面我们一起了解下什么是Docker与与Docker的仓库、镜像、容器三大概念。 …...

Gitlab配置personal access token
1.点击左上角个人账号 -> Preferences 2. 点击左边栏 Access Tokens 3. 点击Add new token ,输入token名称,勾选权限(注意截至日期 “Expiration date” 可不填) 4. 创建成功后,显示token信息,复制到本地…...