JavaWeb从0到1-DAY10-JDBC

JavaWeb从0到1-DAY10-JDBC JDBC 学习笔记一、这一章在讲什么JDBCJava Database Connectivity是 Java 提供的统一数据库访问接口。不管底层是 MySQL、Oracle 还是 PostgreSQLJava 程序都通过同一套 JDBC API 来操作数据库。核心价值是可移植性——换数据库只换驱动 jar 和连接字符串业务代码不用改。⚠️定位说明JDBC 是 Java 操作数据库的底层标准属于通用规范。真正的企业开发不会直接手写 JDBC而是用 MyBatis、JPAHibernate这类封装好的框架——它们底层调的依然是 JDBC。学 JDBC 的目的是理解原理知道框架在背后做了什么。二、核心概念JDBC 是什么一套 Java 标准库中的接口java.sql包定义了 Java 程序和数据库之间的通话规范各数据库厂商提供各自的驱动实现如 MySQL 的mysql-connector-java.jar数据库连接Connection连接就是 Java 程序和数据库之间建立的一条通话线路没有连接SQL 发不出去结果也收不回来类比打电话——拨号getConnection→ 通话执行 SQL→ 挂断close通信协议JDBC 本身是 API 层不定义通信协议底层协议由各数据库自行定义MySQL 用私有 TCP 协议端口 3306PostgreSQL 用私有 TCP 协议端口 5432JDBC 驱动负责把 API 调用翻译成数据库能懂的协议PreparedStatement vs StatementStatementPreparedStatementSQL 拼接字符串拼接易出错?占位符清晰安全SQL 注入❌ 有风险✅ 免疫预编译每次都要编译一次编译多次复用结论几乎不用永远首选SQL 注入攻击者在前端输入框中写入 SQL 片段如 OR 11如果用 Statement 直接拼接恶意 SQL 会被数据库当作命令执行PreparedStatement 的占位符机制 字符转义你输入的就是纯字符不会被当成命令JDBC 编程六步① 注册驱动 → ② 获取连接 → ③ 创建Statement → ④ 执行SQL → ⑤ 处理结果集 → ⑥ 释放资源顺序不能换必须先有连接才有 Statement先执行 SQL 才有 ResultSet关闭顺序ResultSet → Statement → Connection后创建先关闭否则上层对象会依赖失效的底层连接事务管理JDBC 默认每条 SQL 自动提交手动事务模式conn.setAutoCommit(false);// 关自动提交// ... 执行多条 SQL ...conn.commit();// 全部成功 → 提交// 出错时conn.rollback();// 回滚核心思想多条 SQL 捆成一个原子操作要么全成功要么全撤销典型场景转账A 扣钱 B 加钱不能只执行一半连接池连接很贵TCP 握手 认证 内存分配连接池预先创建 N 个连接放着用完归还不销毁类比共享单车桩——骑完还回去下一个人接着用连接池 ≠ 缓存连接池存的是连接管道缓存存的是查询结果主流实现Druid阿里、HikariCP、DBCP三、重难点难点1关闭顺序为什么不能乱结论ResultSet → Statement → Connection原因ResultSet 依赖 StatementStatement 依赖 Connection。先关 Connection上层对象就废了类比拆楼要从上往下拆不能先把地基炸了难点2PreparedStatement 防 SQL 注入的原理结论占位符机制让用户输入永远是数据而非命令原因预编译时 SQL 结构已固定?位置只能填入数据值不会被解析为 SQL 关键字类比填表格——表格框架已经印好了你只能在空格里写字不可能改写表格结构难点3连接池为什么必要结论高并发下每个请求新建连接会迅速耗尽资源原因数据库连接是重资源创建/销毁成本高类比每来一个顾客就现铺一条马路 vs. 提前修好高速公路用完不拆四、代码理解最小完整示例原生 JDBC// ① 注册驱动MySQL 8.xClass.forName(com.mysql.cj.jdbc.Driver);// ② 获取连接Stringurljdbc:mysql://localhost:3306/mydb?useSSLfalseserverTimezoneAsia/Shanghai;ConnectionconnDriverManager.getConnection(url,root,password);// ③ 创建 PreparedStatementStringsqlSELECT * FROM user WHERE name ?;PreparedStatementpsconn.prepareStatement(sql);ps.setString(1,张三);// 填入占位符// ④ 执行 SQLResultSetrsps.executeQuery();// ⑤ 处理结果集while(rs.next()){System.out.println(rs.getString(name));}// ⑥ 释放资源后创建先关闭rs.close();ps.close();conn.close();try-with-resources 最佳写法推荐try(ConnectionconnDriverManager.getConnection(url,user,pwd);PreparedStatementpsconn.prepareStatement(sql);ResultSetrsps.executeQuery()){while(rs.next()){/* 处理 */}}// 自动逆序关闭rs → ps → conn 实际开发中以上代码你不会手写——MyBatis 或 JPA 已经帮你封装好了。这里学习原生写法是为了理解底层原理。五、易错点MySQL 8.x 驱动类名写错正确是com.mysql.cj.jdbc.Driver不是com.mysql.jdbc.Driver关闭顺序搞反先关 Connection 会导致 ResultSet 和 Statement 报错忘记关资源不用 try-with-resources 时必须在 finally 块逐一手动关闭URL 参数遗漏MySQL 8.x 建议加上useSSLfalseserverTimezoneAsia/Shanghai用 Statement 拼 SQL哪怕只是内部工具也养成用 PreparedStatement 的习惯六、记忆口诀 / 通俗比喻JDBC 是什么“外卖平台”——你只跟平台下单平台帮你对接不同餐馆JDBC 的定位“驾照科目一”——实际开车MyBatis有各种辅助但科目一是原理基础必须学六步编程“打电话”——拨号 → 接通 → 说话 → 对方回话 → 听 → 挂断PreparedStatement“填表格”——表格框架固定只填空格没法改表格结构SQL 注入“夹带纸条”——攻击者把纸条塞进信封希望收信人当成正式文件执行事务“婚礼宣誓”——我愿意必须同时说不能说一半改主意连接池“共享单车”——用完还桩上下一个人接着骑连接 vs 缓存“高速公路 vs 备忘录”——路是通道备忘录是记录七、应用JDBC 在实际开发中的角色┌─────────────────────────┐ │ MyBatis / JPA / ... │ ← 你真正写代码的这一层 ├─────────────────────────┤ │ JDBC │ ← 底层标准接口本章学的 ├─────────────────────────┤ │ JDBC 驱动jar │ ← 各数据库厂商提供 ├─────────────────────────┤ │ 数据库 │ ← MySQL / Oracle / ... └─────────────────────────┘原生 JDBC学习阶段理解原理用生产环境基本不手写MyBatis国内最主流半自动——SQL 你自己写MyBatis 帮你处理参数映射、结果封装、连接管理等脏活累活JPA / Hibernate全自动 ORM——连 SQL 都帮你生成适合简单 CRUD连接池无论用哪个框架底层都依赖连接池Spring Boot 默认 HikariCP记住驱动类名和 URL 格式这是每个 Java 项目的application.yml里都会出现的固定配置八、最终总结JDBC 是 Java 操作数据库的底层基石。核心就三件事获取连接 → 发 SQL → 处理结果。记住六步编程框架永远用 PreparedStatement上线必配连接池多表操作开事务。但实际开发中你不会手写这些——MyBatis、JPA 等框架已经帮你封装好了它们底层调用的正是 JDBC。学好 JDBC 的意义不在于手写代码而在于当框架出问题时你知道底层发生了什么看得懂报错调得了性能。