请使用支持现代 CSS 与 JavaScript 的浏览器播放课件
DBPA · 8.3

JDBC 与 MVC 数据库应用开发

把数据库访问接入可维护的应用结构

VER. 2608.2 Built with impress.js

学习目标

JDBC 接口、结果集处理和 MVC 分层可以组织成可检查的应用流程

  1. 01选择 StatementPreparedStatementCallableStatement
  2. 02写出 ResultSet 的最小遍历与类型读取结构
  3. 03按五步流程访问数据库并指出资源释放顺序
  4. 04区分参数绑定、结果读取和 SQL/Java 类型映射
  5. 05解释 MVC 的三层职责边界并追踪一条业务请求
  6. 06说明 DAO、ORM、连接池和异构迁移任务的边界
2/18
LEARNING OBJECTIVES

JDBC 用标准接口隔离应用与数据库平台

应用程序通过 JDBC API 访问数据,不直接接触数据库文件或厂商内部函数

应用经 JDBC API、驱动管理器和厂商驱动访问数据源
Takeaway

不等于完全可移植。URL、驱动、SQL 方言、类型映射、权限和模式仍可能需要适配

3/18
JDBC ARCHITECTURE

数据源是连接信息的抽象

应用只需提供目标数据源所需的连接参数

位置

服务器地址、端口和数据库名

身份

用户名、密码和权限

类型

目标 DBMS 和匹配驱动

TEXT
DriverManager.getConnection(URL, user, password) → Connection
DataSource.getConnection()                       → Connection
Takeaway

DataSource 可以由应用服务器或连接池统一配置;应用代码不应把凭据散落在业务方法中

4/18
DATA SOURCE

常用 API 把连接、执行和结果处理分开

不同对象承担不同生命周期责任

API主要职责常见调用
DriverManagerDataSource取得连接getConnection(...)
Connection管理连接和事务边界prepareStatement()prepareCall()close()
Statement执行静态 SQL,不负责参数绑定固定语句
PreparedStatement执行参数化 SQL?setXXX()
CallableStatement调用存储过程输入输出参数
ResultSet读取查询结果next()getXXX()
Takeaway

getConnection() 属于 DriverManagerDataSourceConnection 负责在连接建立后创建语句、管理事务和释放连接

5/18
JDBC APIS

执行方法决定应用接收什么结果

先判断 SQL 的结果形态,再选择对应的 execute 方法

方法适用场景应用拿到的结果
executeQuery()SELECT 等查询一个 ResultSet
executeUpdate()INSERTUPDATEDELETE,以及部分 DDL受影响的行数或产品定义的更新结果
execute()可能产生多种结果的语句或过程调用再取 ResultSet、更新行数或过程输出
JAVA
CallableStatement cs = conn.prepareCall("{CALL compGPA(?,?)}");
cs.setString(1, sno);
cs.registerOutParameter(2, Types.REAL);
cs.execute();
float gpa = cs.getFloat(2);
Takeaway

CallableStatement 通过 JDBC 调用存储过程;具体占位符、类型和结果处理按目标 DBMS 与驱动核对

6/18
EXECUTION METHODS

JDBC 访问数据库包含五个主步骤

每一步都有输入、输出和失败时的处理边界

JDBC 五步访问流程以及异常路径回到资源释放
  1. 01加载:发现或注册目标 DBMS 的驱动
  2. 02连接:构造 URL 或使用 DataSource,获取 Connection
  3. 03执行:创建语句对象,绑定参数并执行查询、更新或过程调用
  4. 04处理:读取 ResultSet、更新行数或过程输出,并执行业务逻辑
  5. 05释放:按 ResultSet → Statement → Connection 逆序关闭或归还
Takeaway

JDBC 4 以后驱动可能由服务机制自动发现;任一步异常都要进入资源释放路径,try-with-resources 可覆盖成功和异常路径

7/18
JDBC WORKFLOW

参数绑定和类型映射是两个方向

输入值进入 SQL,查询结果再回到 Java 变量

方向负责什么边界
参数绑定把 Java 值按类型传给 ?不拼接 SQL 结构
类型映射在 SQL 类型与 Java 类型间转换选择匹配的 setXXXgetXXX
结果读取移动游标并读取当前行next(),再 getXXX()
Takeaway

参数化可降低 SQL 注入风险,但不替代权限、业务校验和事务控制

8/18
PARAMETERS AND TYPES

一个最小查询闭环:绑定、遍历、映射

该代码展示参数绑定、遍历和类型读取的边界;完整 Web 项目还需要控制器、模型和视图

JAVA
String sql =
    "SELECT Sno, CAtype FROM ClassAssess WHERE Tno = ?";

try (PreparedStatement ps = conn.prepareStatement(sql)) {
    ps.setString(1, tno);
    try (ResultSet rs = ps.executeQuery()) {
        while (rs.next()) {
            String rowSno = rs.getString("Sno");
            boolean type = rs.getBoolean("CAtype");
        }
    }
}
Takeaway

setXXX 是应用到 SQL 的输入绑定;next() == true 才有有效行;getXXX 是结果到 Java 的读取映射

9/18
PREPARED QUERY

ResultSet:用游标把集合交给应用逻辑

默认结果集游标从第一行之前开始,并按行向前移动;next() 返回布尔值

Takeaway

只有移动到有效行后才能读取列;ResultSet 游标由 JDBC 结果对象管理,过程化 SQL 游标由数据库程序定义和使用

10/18
RESULT SET

资源释放要在成功和失败路径都成立

频繁建连或忘记关闭都会拖累性能;try-with-resources 可覆盖异常路径

资源关闭顺序目的
ResultSet第一层释放结果集资源
语句对象第二层释放执行资源
Connection最后一层关闭或归还连接
连接池中的 Connectionclose() 后交回池避免反复建立物理连接
Takeaway

不能。资源通常按获取顺序的反向释放;池耗尽、连接泄漏和归还失败都需要监控

11/18
RESOURCE SAFETY

MVC 把请求拆成三层职责

Controller 接收请求,Model 执行业务,View 呈现结果

用户请求经 Controller、Model 和 DAO/JDBC 访问数据库,再经 View 返回
  1. 01Controller:接收请求、解析参数并选择业务入口
  2. 02Model:执行业务规则,通过 DAO(内部可使用 JDBC)或 ORM 访问数据库
  3. 03View:把模型结果呈现给用户,不直接承担连接和业务判断
Takeaway

同一 Model 可以服务网页、接口或其他呈现方式

12/18
MVC SEPARATION

教师回复路径体现 MVC 职责边界

教师回复一条课程评价时,Controller、Model、DAO 和 View 各自承担不同职责

  1. 01输入:Tno + TCno + Sno + Feedback
  2. 02控制:Controller 解析并检查参数,再调用 Model
  3. 03业务:Model 执行 replyFeedback,交给 DAO/JDBC 更新 ClassAssess
  4. 04呈现:View 展示更新后的评价和教师反馈
13/18
FEEDBACK FLOW

DAO/ORM 减少业务代码中的数据库细节

DAO 和 ORM 降低重复和耦合,但不替代数据库判断

DAO

把 SQL/JDBC 访问封装成查询或更新方法

ORM

映射关系、列与业务对象,减少手写常规 CRUD SQL

Takeaway

事务、权限、查询性能和数据语义仍需要开发者负责

14/18
DAO AND ORM

连接池复用物理连接,但需要治理边界

在频繁或并发访问时可能减少连接建立开销;应用结束使用后把连接归还给池

应用请求从连接池借用连接,完成数据库操作后归还
方式请求行为性能影响
每次新建建立、使用、关闭连接开销反复发生
连接池借用、使用、归还复用物理连接
池治理上限、超时、健康检查、回收泄漏或耗尽需要监控
15/18
CONNECTION POOL

用 JDBC 接口和 MVC 分层组织应用

可靠的数据库应用同时需要接口规范和结构解耦

JDBC

使用驱动/数据源、参数绑定、类型映射和资源释放

调用链

CallableStatementResultSet.next/getXXX

分层与实验

用 MVC、DAO/ORM 和连接池组织分层,并区分实验与迁移任务

Takeaway

实验 8.4 练 JDBC 连接与数据操纵;习题 8.4 讨论异构迁移;实验 8.5 承担综合应用

16/18
RECAP

本节知识地图

17/18
KNOWLEDGE MAP

本节问题

  1. 01固定 SQL、带输入 SQL、8.2 compGPA 各选哪种 JDBC API??setXXXnext()getXXX 分别负责什么方向?
  2. 02JDBC 代码中未释放 ResultSet、语句或连接会有什么风险?资源应按什么顺序释放?
  3. 03execute() 后如何判断并取得 ResultSet、更新行数或过程输出?
  4. 04教师回复如何携带 Tno、TCno、Sno、Feedback 经过 Controller、Model、DAO/JDBC 和 View?
  5. 05实验 8.4 的 JDBC、习题 8.4 的异构迁移与实验 8.5 的综合应用分别有什么边界?
18/18
CHECK YOUR UNDERSTANDING