JDBC六步本质是模拟数据库通信生命周期:注册驱动(加载厂商翻译官)、获取Connection(建TCP通道)、创建Statement/PreparedStatement(防注入主力)、执行SQL(分query/update)、处理ResultSet(用列名+判next)、释放资源(按rs→ps→conn顺序close或用try-with-resources)。

Java JDBC 深度复习不是靠死记步骤,而是把“连接—操作—释放”这条主线吃透,再通过典型场景反复打磨。重点不在写多少行代码,而在理解每一步为什么存在、哪里容易出错、怎么避免硬编码和资源泄漏。
紧扣六步本质,不背口诀只理逻辑
所谓“JDBC六步”,本质是模拟一次完整的数据库通信生命周期:
- 注册驱动:告诉JVM“你要用哪家厂商的翻译官”——MySQL 8.0+ 可省略,但要知道 Class.forName("com.mysql.cj.jdbc.Driver") 是加载驱动类,触发其静态块完成自动注册
- 获取Connection:建立 JVM 进程与数据库进程之间的 TCP 通道,耗资源,必须用 try-with-resources 或 finally 显式 close
-
创建Statement/PreparedStatement:前者适合固定SQL(如
SELECT * FROM user),后者才是主力——预编译防注入、支持?占位符、批量执行更高效 -
执行SQL:注意区分
executeQuery()(返回 ResultSet,仅用于 SELECT)、executeUpdate()(返回影响行数,用于 INSERT/UPDATE/DELETE) -
处理ResultSet:别直接用
rs.getString(1),优先用列名rs.getString("username");遍历后务必检查rs.next()是否为 true,否则空指针 - 释放资源:顺序必须是 ResultSet → PreparedStatement → Connection,且每个都要判 null 再 close,或统一用 try-with-resources 自动管理
用 PreparedStatement 替代 Statement 练三遍
这是深度复习中最关键的一环。每次练习都强制自己不用 Statement,只用 PreparedStatement,并覆盖三种典型场景:
-
单条带参操作:比如根据 id 查询用户,SQL 写成
"SELECT * FROM users WHERE id = ?",然后ps.setInt(1, userId) -
多条件组合查询:例如模糊查姓名 + 状态过滤,SQL:
"SELECT * FROM orders WHERE name LIKE ? AND status = ?",传参时注意ps.setString(1, "%" + keyword + "%") - 批量插入:开启事务,循环 setXXX + addBatch(),最后 executeBatch() —— 对比不加批处理的逐条执行,体会性能差异
封装工具类,把重复动作变成肌肉记忆
练到第三轮时,动手写一个 JDBCUtils 工具类,只做三件事:
立即学习“Java免费学习笔记(深入)”;
- 提供静态方法
getConnection(),内部读取配置文件(如 jdbc.properties)获取 url/user/pass,不再硬编码 - 提供
close(AutoCloseable...)方法,统一关闭 ResultSet、Statement、Connection,一行代码收尾 - 补充一个
beginTransaction(Connection)和commitAndClose(Connection),为后续事务练习打基础
写完立刻用它重写之前所有 CRUD 示例——你会发现原来要写 20 行的查询,现在核心逻辑只剩 5 行。
故意制造错误,反向强化关键点
深度复习要主动“踩坑”:
- 注释掉 close(),运行多次后观察数据库连接数飙升(可用
show processlist验证) - 用 Statement 拼接 SQL 做登录验证,输
' OR '1'='1看是否绕过密码 —— 再换 PreparedStatement 对比结果 - 在 PreparedStatement 中用错索引,比如
ps.setString(2, "name")但 SQL 只有一个 ?,观察 SQLException 提示
每个报错都对应一个设计原理:连接池为什么重要、预编译如何拆解 SQL 与参数、JDBC 异常体系为何分 SQLException / SQLTimeoutException 等。


















