荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: zzt (少年仲永), 信区: Java
标  题: JDBC API 介 绍 (fwd)
发信站: BBS 荔园晨风站 (Sun Apr 11 10:09:26 1999), 转信

                JDBC API 介 绍
                        清 华 大 学 计 算 机 系   吕 思 飞
                        香 港 中 文 大 学 计 算 机 系   姚   剑


     随 着 Java语 言 应 用 面 的 逐 步 拓 宽 ,Sun Microsystems 公 司 开 发 了
一 个
标 准 的 SQL数 据 库 访 问 界 面 — — — JDBC API。 它 可 以 使 Java编 程 人

通 过 一 个 一 致 的 界 面 ,访 问 多 种 关 系 数 据 库 。

     JDBC API定 义 了 一 系 列 Java类 ,用 来 表 示 数 据 库 连 接 、 SQL语 句

结 果 集 、 数 据 库 元 数 据 等 ,能 够 使 Java编 程 人 员 发 送 SQL语 句 和
处 理 返
回 结 果 。

     JDBC API由 一 个 驱 动 程 序 管 理 器 实 现 对 连 接 到 不 同 数 据 库
的 多 个
驱 动 程 序 的 管 理 。 JDBC驱 动 程 序 可 以 全 部 由 Java语 言 编 写 , 也
可 以 由
本 地 化 方 法 来 实 现 与 现 有 数 据 库 访 问 接 口 的 连 接 。

                           一 、 总 体 结 构

     Java应 用 程 序 通 过 JDBC API界 面 访 问 JDBC管 理 器 ,JDBC管 理 器 通
过 JDBC驱 动 程 序 API访 问 不 同 的 JDBC驱 动 程 序 ,从 而 实 现 对 不 同 数

库 的 访 问 。 图 1表 示 JDBC总 体 结 构 。

     图 1 JDBC的 总 体 结 构

     1. JDBC API

     JDBC API定 义 了 一 系 列 抽 象 Java界 面 ,可 以 使 应 用 程 序 员 连 接
到 指
定 的 数 据 库 ,执 行 SQL语 句 和 处 理 返 回 结 果 。 其 功 能 结 构 如 图
2所 示 。

     图 2 JDBC API主 要 功 能 结 构

     JDBC API中 重 要 的 界 面 有 :

     java.sgl.DriverManager:完 成 驱 动 程 序 的 装 载 和 建 立 新 的 数 据
库 连 接


     java.sgl.Connection:表 示 对 某 一 指 定 数 据 库 的 连 接 。

     java.sgl.Statement:管 理 在 一 指 定 数 据 库 连 接 上 的 SQL语 句 的 执
行 。

     java.sgl.ResultSet:访 问 一 指 定 语 句 的 原 始 结 果 。

     java.sgl.Statement:界 面 有 两 个 重 要 的 子 类 型
:ja-va.sgl.PreparedSta
tement (用 于 对 预 编 译 的 SQL语 句 的 执 行 )和
java.sgl.CallableStatement( 用
于 对 一 个 数 据 库 存 储 过 程 的 执 行 )。

     2. JDBC驱 动 程 序 界 面

     数 据 库 驱 动 程 序 中 必 须 实 现 在 JDBC API中 定 义 的 抽 象 类 ,尤
其 是
对 java.sgl.Connection、 java.sgl.Prepared-Statement、 java.sgl.CallableSta
tement和 java.sgl.Re-sultSet的 实 现 。 此 外 ,每 一 个 数 据 库 驱 动 程 序
必 须 提
供 一 个 类 实 现 java.sgl.Driver界 面 ,用 于 通 用 的 java.sgl.DriverM
anager类 ,使
其 在 对 一 个 指 定 的 数 据 库 URL访 问 时 可 以 查 找 相 应 的 驱 动 程 序


     Sun Microsystems公 司 提 供 了 一 个 JDBC对 ODBC的 连 接 桥 ,如 图 1中
JD BC-ODBC桥 接 驱 动 程 序 所 示 。 由 于 是 建 立 在 ODBC基 础 之 上 ,所 以
具 有 规 模 较 小 而 效 率 高 的 特 点 。

     3.用 户 典 型 使 用 模 式

     (1)Applet模 式   使 用 Java语 言 编 制 Applet,作 为 WWW文 档 的 一 部 分
在 Internet上 发 布 ,由 浏 览 器 对 其 下 载 ,并 运 行 。 其 中 ,可 能 会 有
部 分
Applet需 要 访 问 数 据 库 ,则 可 通 过 使 用 JDBC API实 现 ,其 应 用 如 图
3所 示


     图 3 Applet 应 用 模 式

     由 于 未 信 任 的 Applet不 能 访 问 本 地 文 件 和 对 任 意 主 机 建 立
网 络 连
接 ,JDBC必 须 遵 守 标 准 Applet的 安 全 模 型 ,所 以 此 种 应 用 模 式 有 诸
多 安
全 方 面 的 限 制 。 对 信 任 的 Applet,其 安 全 模 型 类 似 于 Ja va应 用 程
序 。

     (2)应 用 程 序 模 式   在 应 用 程 序 中 ,Java代 码 是 信 任 的 ,因 而
可 以 读
写 本 地 文 件 和 建 立 网 络 连 接 。 应 用 示 意 如 图 4所 示 。

     图 4 应 用 程 序 应 用 模 式

     此 种 应 用 模 式 非 常 适 合 intranet(内 部 网 )应 用 。 当 然 该 模 式
也 能 够
通 过 Internet访 问 数 据 库 。

                           二 、 JDBC API

     1.JDBC界 面 定 义

     JDBC API包 含 java.sgl的 界 面 和 类 。

     java.sgl.CallableStatement:用 于 执 行 存 储 的 SQL过 程 的 界 面 。

     java.sgl.Connection: 一 个 连 接 表 示 与 某 一 指 定 数 据 库 的 一 个
会 话 。
在 该 连 接 中 可 以 执 行 SQL语 句 和 处 理 返 回 结 果 。

     java.sql.DataTruncation:当 JDBC碰 到 意 外 数 据 截 断 时 ,报 告 一 个
警 告
(读 数 据 时 )或 产 生 一 个 异 常 (写 数 据 时 )。

     java.sql.Date:是 标 准 java.util.date的 一 个 子 集 ,只 表 示 天 数 ,而
不 包 含
时 、 分 、 秒 。

     java.sql.Driver:定 义 一 个 在 每 一 个 数 据 库 驱 动 程 序 中 必 须 实
现 的 驱
动 程 序 界 面 。

     java.sql.DriverManager:提 供 对 全 局 SQL状 态 的 访 问 。

     java.sql.DriverPropertyInto:提 供 高 级 程 序 员 与 驱 动 程 序 之 间 对
连 接
特 性 信 息 进 行 交 互 的 手 段 。

     java.sql.NullData:当 由 getXXX或 getObiect方 法 读 出 一 个 SQL空 值 时 ,
产 生 一 个 NullData警 告 。

     java.sql.Numeric:是 一 个 任 意 精 度 标 量 数 值 类 ,可 用 作 表 示
SQL定 点
Numerlc和 Decimal类 型 的 数 值 。

     java.sql.PreparedStatement:保 存 一 个 预 编 译 的 SQL语 句 的 对 象 ,该

象 可 被 高 效 地 执 行 多 次 。

     java.sql.ResultSet:结 果 集 提 供 对 执 行 一 个 SQL语 句 后 产 生 的 结
果 表
的 访 问 。 表 中 数 据 按 行 依 次 取 出 。 为 便 于 移 植 ,建 议 对 每 一
行 数 据 从
左 至 右 按 列 读 出 。

     java.sql.SQLException:处 理 数 据 库 访 问 时 的 出 错 信 息 。

     java.sql.SQLWarning:处 理 数 据 库 访 问 时 的 警 告 信 息 。

     java.sql.Statement:用 作 执 行 一 条 静 态 的 SQL语 句 并 接 收 产 生 的
结 果


     java.sql.Time:用 于 表 示 标 准 java.util.date类 的 一 个 信 息 子 集
,仅 表 示
时 、 分 、 秒 。

     java.sql.Timestamp:扩 展 标 准 java.util.date类 ,使 其 能 够 表 示 SQL的

间 戳 ,增 加 了 一 个 以 纳 秒 为 单 位 的 时 间 域 。

     java.sql.Types:定 义 区 分 SQL类 型 的 常 量 。 类 常 量 值 与 XOPEN中 的
值 相 同 。

     此 外 ,JDBC API 还 定 义 了 JDBC元 数 据 界 面 java.sql.DatabaseMetaData
和 java.sql.ResultSetMetaData。

     界 面 间 的 关 系 由 图 5表 示 ,其 中 箭 头 表 示 函 数 ,而 线 表 示 其
它 方 法 。

     2.数 据 库 连 接

     (1)建 立 一 个 连 接   用 户 在 访 问 数 据 库 时 ,需 要 在 JD-BC管 理
层 由
java.sql.DriverManager.getConnection方 法 产 生 一 个 java.sql.Connection对 象
。 该 方 法 使 用 一 个 数 据 库 URL串 作 为 参 数 。

     (2)选 择 合 适 的 驱 动 程 序   在 数 据 库 URL中 ,可 以 指 定 驱 动 程
序 的
名 称 ,也 可 以 不 指 定 。 如 果 不 指 定 驱 动 程 序 ,则 从 Java特 性 "sq
l.drivers"所
指 出 的 驱 动 程 序 表 中 依 次 搜 寻 ,使 用 最 先 找 到 的 可 成 功 连 接
的 驱 动 程
序 。

     (3)数 据 库 URL 在 连 接 时 ,由 数 据 库 URL参 数 指 定 要 连 接 的 数
据 库 ,
此 时 可 称 为 JDBC URL,其 格 式 为 :

     jdbc:<子 协 议 >:<子 名 称 >

     如 果 是 对 网 络 数 据 库 访 问 ,那 么 建 议 用 户 使 用 标 准 URL作 为
子 名 称
的 一 部 分 。 比 如 对 数 据 资 源 名 为 fred访 问 的 URL可 能 是 :

     jdbc:odbc:fred 或 jdbc:dbnet://wombat:356/fred

     子 协 议 odbc表 示 对 ODBC数 据 资 源 的 访 问 ,其 格 式 为 :

     jdbc:odbc:<数 据 资 源 名 >[;<属 性 名 >=<属 性 值 >]*

     · 连 接 参 数 :由 java.util.Properties对 象 指 出 。 建 议 大 多 数 参
数 不 要
在 此 处 给 出 ,而 在 协 议 中 指 出 。

     · 支 持 多 连 接 :一 个 应 用 程 序 可 以 使 用 一 个 或 多 个 驱 动 程
序 建 立
与 多 个 数 据 库 连 接 。

     · 驱 动 程 序 的 注 册 :有 两 种 方 法 ,一 是 在 JDBC
java.sql.DriverMana ger
类 初 始 化 时 查 找 "sql.drivers"特 性 ,对 每 一 个 驱 动 程 序 自 动 注 册
;二 是 由 标
准 Class.forName方 法 显 式 加 载 一 个 驱 动 程 序 ,参 数 为 驱 动 程 序 名


     3.参 数 传 递 和 结 果 接 收

     (1)查 询 结 果   执 行 一 条 查 询 语 句 后 ,返 回 结 果 是 可 由
java.sq
l.ResultSet对 象 访 问 的 行 的 集 合 。 在 该 对 象 中 提 供 了 一 系 列
"get " 方 法 ,
访 问 当 前 的 每 一 列 ,Result-Set.next方 法 可 实 现 在 结 果 集 的 行 之
间 移 动 ,
可 以 使 用 列 索 引 或 列 名 指 定 相 应 的 列 。

     · 查 询 结 果 的 数 据 转 换 。 ResultSet.getXXX方 法 可 以 把 SQL类 型

化 为 需 要 的 Java类 型 。 若 指 定 一 个 非 法 的 类 型 转 换 时 ,则 产 生
一 个
SQLException的 异 常 。

     · 空 值 判 断 。 先 读 出 某 一 列 数 据 ,然 后 使 用
Result-Set.wasNull方 法 ,
判 断 返 回 结 果 是 否 是 SQL"NULL"。

     · 长 数 据 的 读 出 。 JDBC支 持 由 getByte和 getString 方 法 读 出 任
意 长
的 LONGVARBINARY或 LONGVAR-CHAR类 型 数 据 ,也 支 持 由 方 法
GetBinaryStre am、 GetAsciiStream 和 GetUnicodeStream返 回 数 据 流 来 读
出 数 据 。

     · 支 持 用 getResultSet、 GetUpdateCount 和 Get-MoreResults方 法 分 别
返 回 一 条 结 果 、 返 回 被 修 改 的 行 数 和 返 回 多 条 结 果 。

     (2)传 递 IN参 数 java.sql.PreparedStatement界 面 提 供 了 一 系 列 setXX
X
方 法 向 SQL语 句 传 递 参 数 ,实 现 动 态 的 SQL语 句 。

     在 传 递 参 数 时 必 须 满 足 数 据 类 型 一 致 的 要 求 。 因 此 必 须
预 先 调 用
类 型 转 换 方 法 完 成 数 据 转 换 ,同 时 也 提 供 了 传 递 SQL空 值 和 长
数 据 给
IN参 数 的 方 法 。

     (3)接 收 OUT参 数   在 调 用 一 个 存 储 过 程 时 ,可 用 setXXX方 法 传

IN参 数 ,使 用 OUT参 数 接 收 返 回 结 果 。 在 使 用 时 必 须 先 调 用 Callab
leStatement.register-OutParameter方 法 为 每 一 个 OUT参 数 进 行 类 型 注 册
,
然 后 执 行 该 过 程 调 用 语 句 ,最 后 使 用 getXXX方 法 取 出 OUT参 数 的
结 果


     返 回 结 果 的 数 据 类 型 是 与 用 户 注 册 的 SQL类 型 相 对 应 的
Java类 型
。 空 值 的 处 理 步 骤 是 ,先 读 出 参 数 值 ,再 用 CallableStatement.was-
Null方
法 判 断 是 否 为 空 值 。

     不 支 持 以 流 形 式 读 出 OUT参 数 的 机 制 。

     接 收 时 返 回 结 果 的 顺 序 优 先 于 OUT参 数 。 (下 转 第 123版 )

     JDBC API 介 绍

     (上 接 第 119版 )

     (4)数 据 截 断   在 某 种 条 件 下 ,有 可 能 在 读 或 写 数 据 时 出 现
数 据 截
断 ,如 当 由 Connection.setMaxField-Size设 置 了 一 个 域 的 最 大 长 度 时
,超 过
设 置 长 度 后 的 数 据 就 被 截 断 。

     在 读 数 据 时 ,如 出 现 数 据 截 断 ,则 产 生 一 条 Data-Truncation 的 S
QLWarning警 告 。 在 写 数 据 时 ,如 发 生 数 据 截 断 ,则 产 生 一 个 DataTru
ncation的 SQLException异 常 。

     4. SQL数 据 类 型 到 Java类 型 的 转 换

     由 于 SQL数 据 类 型 与 Java数 据 类 型 之 间 差 异 较 大 ,可 相 互 转
换 的 类
型 之 间 还 是 存 在 一 些 不 一 致 的 地 方 ,因 此 JDBC提 供 了 详 细 的 从
SQL类
型 到 Java类 型 的 标 准 转 换 表 和 从 Java类 型 到 SQL类 型 的 标 准 转 换
表 。

                     三 、 进 一 步 了 解 JDBC API

     1.异 步 、 线 程 和 交 易

     (1)异 步 请 求   某 些 数 据 库 API (比 如 ODBC) 提 供 了 SQL语 句 异 步
执 行 的 机 制 ,这 样 可 使 一 个 数 据 库 的 操 作 在 后 台 运 行 的 同 时
,前 台 一 边
等 待 一 边 处 理 其 它 操 作 。

     由 于 Java提 供 多 线 程 机 制 ,因 此 并 不 真 正 需 要 实 现 异 步
SQL语 句 的
执 行 。 当 需 要 异 步 执 行 时 ,可 通 过 创 建 一 个 新 线 程 来 实 现 数
据 库 操 作


     (2)多 线 程   对 java.sql的 所 有 对 象 的 操 作 是 多 线 程 安 全 的
,并 且 当
多 个 线 程 同 时 访 问 一 个 对 象 时 ,也 保 证 操 作 的 正 确 性 。 尽 管
不 同 的 驱
动 程 序 其 并 发 执 行 程 度 可 能 不 同 ,但 开 发 人 员 可 以 假 定 为 完
全 并 发 执
行 的 。 因 为 驱 动 程 序 若 需 要 某 种 形 式 的 同 步 操 作 ,则 一 定 会
提 供 相 应
的 实 现 机 制 。

     另 一 个 多 线 程 的 特 殊 应 用 是 可 以 取 消 一 个 执 行 时 间 过 长
的 语 句 操
作 。 具 体 做 法 是 启 动 另 一 个 线 程 调 用 State-ment.cancel()方 法

     (3)交 易   每 一 个 新 的 JDBC连 接 都 初 始 化 为 "自 动 提 交 "模 式
,即 意
味 着 每 一 条 语 句 作 为 一 个 分 开 的 交 易 来 执 行 。

     当 需 要 把 多 条 语 句 作 为 一 个 完 整 的 交 易 来 执 行 时 ,可 以 调

Connection.setAutoCommit(false)方 法 ,取 消 自 动 提 交 。 执 行 完 一 个 交

后 ,调 用 Connection.Commit显 式 完 成 提 交 ,或 调 用 Connection.rollback卷

整 个 交 易 操 作 。

     当 一 个 交 易 被 提 交 或 卷 回 后 ,关 闭 所 有 在 此 连 接 上 的
Prepare
dStatements、 CallableStatements和 ResultSets,只 有 简 单 的 Statements是 打
开 状 态 。

     2.指 针

     JDBC支 持 简 单 指 针 ,这 里 说 的 指 针 是 指 SQL数 据 库 中 的 概 念
。 应
用 程 序 可 以 用 ResultSet.GetCursorName()方 法 ,取 得 与 当 前 Resultset相

联 的 指 针 ,利 用 该 指 针 可 以 对 当 前 行 进 行 修 改 和 删 除 。

     指 针 的 有 效 期 是 到 ResultSet或 其 父 语 句 结 束 。

     3.对 SQL的 扩 充

     JDBC全 部 支 持 SQL-2基 本 (Entry)级 规 范 ,部 分 支 持 SQL-2过 渡
(Transi tional)级 规 范 。 对 SQL-2基 本 级 扩 充 有 二 点 :一 是 支 持 DROP
TABLE命 令 ;二 是 选 定 的 过 渡 级 语 义 必 须 通 过 Escape语 法 来 支 持
,以 便 一
个 驱 动 程 序 可 以 方 便 地 扫 描 和 翻 译 成 特 定 DBMS语 法 。

     (1) SQL Escape语 法   在 存 储 过 程 、 标 量 函 数 、 日 期 、 时 间
、 输 出
连 接 等 方 面 ,JDBC支 持 与 ODBC相 同 的 DBMS无 关 的 Escape转 义 语 法 ,格
式 为 :

     {关 键 字 … … 参 数 … … }

     (2)存 储 过 程 JDBC中 激 活 一 个 存 储 过 程 语 法 格 式 是 :

     { call 过 程 名 [参 数 1,参 数 2,… ] }

     或 者 是 带 返 回 结 果 参 数 的 过 程 :

     { ? = call 过 程 名 [参 数 1,参 数 2,… ] }

     (3)时 间 和 时 期 文 字 量 JDBC支 持 这 些 文 字 量 的 ISO标 准 格 式 ,用
Escape转 义 的 语 句 表 示 时 间 和 日 期 ,如 { d 'yyyy-mm-dd'}或 { t 'nn:mm:s
s'} 分 别 表 示 日 期 或 时 间 。

     (4)标 量 函 数 JDBC支 持 标 量 值 的 数 值 、 串 、 时 间 、 日 期 、 系
统 和
转 换 函 数 ,如 ,{ fn concat ("Hot", "Java") }。

     (5)输 出 连 接   语 法 格 式 为 :{ oj outer-join }

     其 中 outer-join形 式 为 :

     table LEFT OUTER JOIN { table( outer-join} ON search-condition

     4.动 态 数 据 库 访 问

     尽 管 我 们 希 望 JDBC程 序 员 在 编 程 时 能 够 了 解 数 据 库 的 模 式
, 以 便
使 用 强 类 型 的 JDBC界 面 对 数 据 库 进 行 访 问 。 但 一 个 应 用 程 序
,有 时 需
要 动 态 得 到 数 据 库 模 式 ,并 以 此 信 息 完 成 相 应 的 动 态 数 据 库
访 问 。

     (1)元 数 据 信 息 JDBC能 够 对 元 数 据 进 行 访 问 ,比 如 行 结 果 描
述 、 语
句 参 数 、 数 据 库 特 性 等 。

     Java.Sql.ResultSetMetaData类 型 提 供 了 大 量 方 法 去 获 得 一 个 指 定
Java.sql.ResultSet对 象 列 的 类 型 和 特 性 。

     Java.Sql.DatabaseMetaData界 面 提 供 一 系 列 方 法 去 获 得 与 某 一 数

库 相 关 联 的 各 种 元 数 据 ,包 含 数 据 库 的 过 程 、 表 、 模 式 等 和
表 中 的 列
、 列 的 访 问 权 、 表 的 访 问 权 等 信 息 。

     (2)动 态 类 型 数 据 访 问 JDBC使 用 ResultSet.getOb-ject、 PreparedStat
ement.setObject和 CallableStatement.getObject方 法 支 持 更 一 般 的 数 据 访

。 动 态 访 问 时 从 SQL类 型 到 Java对 象 类 型 的 转 换 表 和 从 Java对 象
类 型
到 SQL类 型 的 转 换 表 在 此 就 不 加 以 列 举 了 。 但 上 述 三 个 方 法 中
类 型 转
换 的 依 据 是 这 两 张 表 。

                            四 、 结 束 语

     Java语 言 提 供 了 访 问 数 据 库 的 API,这 非 常 有 助 于 其 拓 宽 应
用 范 围
。 由 于 目 前 仅 实 现 了 一 个 基 础 的 API,所 以 希 望 开 发 人 员 以 此
为 基 础 ,建
立 更 高 级 的 类 和 应 用 工 具 ,同 时 ,也 希 望 诸 多 开 发 商 提 供 多 种
数 据 库 驱
动 程 序 ,以 满 足 编 程 人 员 访 问 不 同 数 据 库 资 源 的 需 要 。


--

--



日出东方,唯我不败;
    天上地下,唯我独尊。

※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.0.72]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店