参考:JDBC 与 DAO 分层
本文件原为阶段二周计划,现作为阶段三(后端进阶)参考素材保留,对应阶段三第 2 周。详细周计划确定后再正式改写。
学习目标
让 Java 程序真正和数据库交互。完成后,应能够:
- 使用 JDBC 完成数据库连接、执行 SQL 和处理结果集
- 使用
PreparedStatement完成参数化查询,避免 SQL 注入 - 使用配置文件管理数据库连接参数
- 封装 JDBC 工具类,使用连接池管理连接
- 使用 DAO 分层完成实体与数据表的映射
- 使用事务处理一组需要同时成功的操作
- 把文件持久化替换为 MySQL 持久化
学习资料与范围
- 主课程:参考视频待定(JDBC、连接池与 DAO 分层)
- 视频范围:待补充
确定课程后,把下面的知识模块映射到具体视频章节。
| 学习模块 | 学习结果 |
|---|---|
| JDBC 简介与固定步骤 | 能够完成一次数据库访问 |
DriverManager 与 Connection | 能够建立和释放数据库连接 |
Statement、PreparedStatement、ResultSet | 能够执行 SQL 并读取结果 |
| SQL 注入与参数化查询 | 能够编写安全的查询语句 |
| JDBC 事务 | 能够提交和回滚一组操作 |
| 连接池与配置文件 | 能够使用连接池提高性能 |
| 工具类与 DAO 封装 | 能够分层组织数据访问代码 |
| 批量操作与异常处理 | 能够高效写入并统一处理异常 |
需要掌握的知识点
JDBC 基础
- JDBC 的作用:用统一接口访问不同数据库
- 数据库驱动的引入方式(通过 Maven 依赖引入)和版本匹配
- JDBC 固定步骤:加载驱动、获取连接、创建语句对象、执行 SQL、处理结果、释放资源
- 连接 URL、用户名、密码的组成和常见参数
Statement与PreparedStatement的区别executeQuery()、executeUpdate()的返回值和适用场景ResultSet的遍历方式、列索引与列名的选择、getInt()/getString()/getDate()的使用
安全与事务
- SQL 注入的产生原理,以及字符串拼接 SQL 的风险
- 使用
?占位符和setXxx()传参的完整写法 - 使用
PreparedStatement完成带条件的查询和模糊查询 setAutoCommit(false)、commit()、rollback()的配合使用- 事务中异常回滚、正常提交的完整结构
- 事务范围应放在
service层的原因
连接池与工具类
- 直接创建连接的开销和连接池的作用
- 常用连接池(如 Druid、HikariCP)的基本配置
- 把连接参数写入
properties配置文件并通过类加载器读取 - 封装
JdbcUtils:获取连接、释放连接、事务相关方法 - 使用
try-with-resources或工具方法保证资源释放 - 面向接口编程:
StudentDao接口加StudentDaoImpl实现
DAO 分层
- 实体类与数据表字段的映射规则
- 使用
ResultSet组装实体对象 - 把结果集映射逻辑集中到一个方法中,避免重复代码
- 插入后获取自增主键
- 批量插入、批量删除的实现方式
- DAO 只负责数据访问,不写业务规则
- 数据库异常转换为业务异常的做法
必做练习
- 第一个 JDBC 程序:连接 MySQL,查询学生表中的全部记录并输出。
- 模拟登录:分别使用字符串拼接和
PreparedStatement实现登录验证,并用注入示例对比结果。 - 参数化查询:使用
PreparedStatement实现按学号查询、按姓名模糊查询。 - 新增与删除:实现新增学生和按学号删除,输出受影响行数。
- 结果集映射:编写
mapRow(ResultSet)方法,把一行记录转换成Student对象。 - 日期处理:读取并写入
datetime字段,处理java.sql.Date与java.time类型的转换。 - 工具类封装:编写
JdbcUtils,从配置文件读取连接参数并返回连接。 - 连接池:引入连接池依赖,替换直接创建连接的方式,并对比执行多次查询的耗时。
- 事务练习:实现课程成绩的批量导入,出现任何一条错误时全部回滚。
- 批量操作:使用
addBatch()和executeBatch()插入 100 条测试数据并统计耗时。 - 异常处理:把
SQLException转换为自定义的DataAccessException,在main中给出可读提示。
综合任务:实现数据访问层
把学生信息管理系统的持久化从文件改为 MySQL,并保持业务逻辑不变。
要求:
- 使用 Maven 引入 MySQL 驱动和连接池依赖
- 数据库连接参数写入配置文件,不在代码中硬编码用户名和密码
- 定义
StudentDao接口,提供insert、deleteById、update、findById、findAll、findByName、countByClass等方法 - 使用实现类完成全部方法,查询统一使用
PreparedStatement - 使用连接池获取连接,所有连接、语句和结果集必须正确释放
- 在
service层实现业务规则,dao层只负责数据访问 - 为需要保证一致性的操作(如批量导入、删除学生及其成绩)添加事务
- 修改
ui层的调用方式,使控制台操作直接读写数据库 - 为 DAO 的关键方法编写单元测试或提供可重复执行的验证脚本
- 更新 README,补充数据库配置、建表脚本和执行顺序说明
产出
- JDBC 基础练习代码
JdbcUtils工具类和数据库配置文件StudentDao接口、实现类及测试记录- 事务和批量操作验证记录
- 改造后的项目源码
- 一份 JDBC 固定步骤和常见异常速查笔记
完成检查
- 能够独立完成 JDBC 的固定步骤
- 能够使用
PreparedStatement避免 SQL 注入 - 能够把结果集正确映射为实体对象
- 能够使用连接池管理数据库连接
- 能够把连接参数写入配置文件读取
- 能够封装 JDBC 工具类并统一释放资源
- 能够按 DAO 模式组织数据访问代码
- 能够使用事务提交或回滚一组数据库操作
- 已完成数据访问层改造,数据库异常不会导致程序直接崩溃