摘 要
JDK
包 括 了 新 的 數 據 庫 存 取(JDBC) 及 組 件(JavaBeans) 的 應 用 程 序 接 口(APIs)
這 兩 個API 結 合 在 一 起
可 用 來 開 發 通 用 數 據 庫 代 碼
通 過 用 唯 一 的 一 個 類 去 存 取 任 何 一 種JDBC 數 據 庫( 封 裝 於 不 同 組 件 中 的 各 個 應 用 程 序 有 著 其 具 體 的 編 碼)
用 戶 就 不 必 因 為 數 據 庫 結 構 一 點 點 的 細 小 變 化 去 修 改 數 據 庫 編 碼
一 個 關 系 數 據 庫 基 本 上 包 括 一 系 列 相 互 關 連 的 表
在 每 一 個 表 中 存 有 一 類 與 應 用 系 統 相 關 的 數 據
例 如 一 個 地 址 簿 數 據 庫 中
可 能 有 關 於 人 員
住 址
電 話 號 碼 等 方 面 的 表
在 數 據 庫 中
每 一 個 這 樣 的 實 體 將 被 作 為 一 系 列 的 字 符 串
整 數 及 其 它 原 始 數 據 類 型 存 貯 起 來
數 據 庫 中
表 的 定 義 將 描 述 每 一 種 與 實 體 相 關 的 信 息 如 何 在 一 個 表 的 字 段 中 存 儲
例 如
你 可 以 在 一 個 名 為
人
的 表 中
有 兩 個 字 段 別 表 示 所 存 字 符 串 為
姓
和
名
每 一 張 表 應 當 有 一 個 或 幾 個 字 段 值 作 為 標 識
確 保 每 條 記 錄 的 唯 一 性
這 些 標 識 或
鍵
可 以 用 來 連 接 存 在 於 不 同 表 中 的 信 息
例 如 你 可 以 在
人 員
表 中
為 每 個 人 指 定 唯 一 的
人 員 號 碼
的 鍵 值
並 在
地 址
表 中 的 相 應 字 段 中 使 用 同 一 個 鍵 值
這 樣
你 可 以 通 過 對 兩 個 表 中 的
人 員 號 碼
字 段 值 的 匹 配
使 每 一 個 人 和 他 的 地 址 關 聯 起 來
關 系 數 據 庫 系 統 出 現 於 七 十 年 代
時 至 今 日
它 仍 然 是 存 儲 巨 量 數 據 的 主 要 方 式
因 而
Java 軟 件 工 具 有 必 要 具 備 處 理 關 系 數 據 庫 的 能 力
關 系 數 據 庫 要 想 被 某 個Java 應 用 程 序 利 用
首 先 需 要 解 決 兩 個 問 題
第 一
需 要 某 些 基 礎 的 中 間 件 來 建 立 與 數 據 庫 的 連 接
向 數 據 庫 發 出SQL 查 詢 等 等
第 二
操 縱 數 據 庫 的 處 理 結 果 要 與 操 縱 任 何 一 種Java 信 息 一 樣 方 便 — — 作 為 一 個 對 象
前 一 個 問 題 已 被SUN 及 幾 個 數 據 庫 產 商 解 決
後 一 個 問 題 則 有 待 我 們 進 一 步 去 探 究
在 為 普 通 的 程 序 開 發 業 務 定 義 大 量 的APIs 這 項 工 作 上
SUN 一 直 保 持 著 與 許 多 軟 件 公 司 的 合 作 關 系
在JDK
APIs 中
JDBC 的API 是 最 早 建 立 起 來 的
而 且
它 已 得 到 了 為 數 眾 多 的 應 用
這 些 應 用 中
有 的 是
% 的 純Java
有 的 則 是Java 和 其 它 程 序 的 混 合 體
如
用 現 有 的ODBC 數 據 源 進 行 連 接( 參 看 圖
)
JavaSoft 已 將 一 個 關 於 現 有 的JDBC 驅 動 程 序 的 介 紹 放 在 它 的Web 站 點 上()
圖
一 個 典 型 的JDBC 或JDBC/ODBC 配 置
注 意
此 圖 已 被 簡 化
另 外 的 組 件 已 包 括 其 中( 如ODBD 驅 動 程 序)
非 常 明 顯
這 些 應 用 的 優 缺 點 取 決 於 你 的 環 境 和 設 置
在 此 我 不 准 備 對 它 們 的 各 種 情 況 進 行 逐 一 論 述
在 下 面 的 內 容 中
我 們 假 定
在 你 的 機 器 中 已 擁 有 某 種Java 開 發 環 境
並 且 你 已 正 確 地 安 裝 並 測 試 過 某 個JDBC 驅 動 程 序
或 者 運 用 過 某 種JDBC 驅 動 程 序 及SUN 的JDBC/ODBC 橋
JDBC API
JDBC API 作 為 一 個 單 獨 的Java 包( 或 類 庫
即java
sql) 出 現
包 括 有 一 系 列 的 類
這 些 類 提 供 了 處 理 某 個 關 系 數 據 庫 的 中 間 件
本 質 上 講
它 們 使 得 你 可 以 關 聯 某 個 數 據 庫
並 向 其 發 出 查 詢
你 可 以 對 這 些 查 詢 結 果 進 行 處 理
檢 索 你 數 據 庫 的meta
信 息(meta
information)
並 且 處 理 在 此 間 可 能 發 生 的 各 種 異 常 情 況
讓 我 們 來 看 一 個 簡 單 的JDBC 例 子
看 一 看 應 用 了Java JDBC 之 後
查 詢 會 得 到 怎 樣 的 簡 化
表
是 一 個 極 其 簡 單 的 數 據 庫
在 清 單
中 的 編 碼 是 一 段 最 簡 單 的 對 關 系 數 據 庫 進 行SQL 查 詢 所 需 的Java 語 句
String ur
=
jdbc:odbc:sample
;
String query=
SELECT * FROM PERSON
;
boolean more;
try
{
Class
forName(
sun
jdbc
odbc
jdbcOdbcDriver
);
Connection con = DriverManager
getConnection(ur
sandor
guest
);
Statement stmt = con
createStatement();
ResultSet rs = stmt
executeQuery(query);
While (more = rs
next())
{
int number = rs
getInt(
PERSON#
);
String firstName = rs
getString(
FIRST_NAME
);
String lastName = rs
getString(
LAST_NAME
);
System
out
printIn(number +
+ firstName +
+ lastName);
}
rs
close();
stmt
close();
con
close();
}
catch(SQLException ex)
{
ex
printStackTrace();
}
清 單
: 一 個 應 用 了JDBC 的SQL 查 詢
這 段 編 碼 的 含 義 是
先 裝 入SUN 的JDBC/ODBC 驅 動 程 序
然 後 與 被jdbc:odbc:sample 指 定 的 數 據 庫 建 立 起 一 個 關 聯
最 後 對 該 數 據 庫 進 行 一 個 簡 單 的SELECT 查 詢
如 果 沒 有 遇 到 查 詢 異 常(SQLException)
程 序 將 循 環 地 從 結 果 集(ResultSet) 中 每 次 抽 出 一 條 數 據 庫 記 錄
並 將 其 顯 示 在 屏 幕 上
好 了
現 在 我 們 來 看 一 看 這 段 程 序 還 有 哪 些 不 足? 在 清 單
的 這 類 程 序 中
存 在 著 兩 個 根 本 性 的 錯 誤
. 這 種 編 碼 用 到 了 數 量 眾 多 的 數 據 庫meta
信 息
而 這 些 信 息 都 只 能 手 工 編 碼 到 程 序 中
當 你 想 要 取 一 個 數 值 時
你 必 須 提 前 知 道 你 將 取 到 的 數 值 是 一 個 整 數
浮 點 數
還 是 一 個 雙 精 度 數
這 將 會 使 得 編 寫 一 個 可 以 處 理 任 何 一 個 數 據 庫 的 類 變 得 十 分 困 難
並 且 每 一 個 數 據 庫 的 細 小 調 整 都 會 逼 你 去 仔 細 地 檢 查 和 修 改 程 序
. 數 據 庫 中 的 信 息 總 是 作 為 一 個 單 個 的RecordSet( 記 錄 集) 實 例 來 傳 遞
而 這 種 實 例 並 不 是 一 個 真 正 的 對 象
RecordSet 類 ( 與 其 它 的 數 據 庫 類 封 裝 沒 什 麼 差 別) 更 象 一 個 指 針 或 游 標
借 助 方 法
它 能 夠 提 供 存 取 數 據 信 息 的 途 徑
RecordSet 中 的 實 例 實 際 上 並 不 包 括 信 息
它 們 僅 僅 表 示 獲 得 信 息 的 方 式
這 正 說 明 了 當 你 要 調 用 另 外 的RecordSet 方 法 去 獲 取 某 些 真 實 的 數 據 信 息 的 時 候
你 必 須 通 過RecordSet 去 做 更 多 的 工 作( 利 用RecordSet
NEXT() 去 移 動 指 針)
實 際 上
JDBC 類 的 確 僅 僅 傳 遞 這 類 聯 系 松 散 的 字 段
即 使 你 完 全 了 解 數 據 庫 的 所 有 內 部 細 節
這 也 沒 有 任 何 價 值
因 為 在Java 提 供 了 存 儲 和 處 理 信 息 的 方 法
所 以
理 想 的 狀 態 是
有 一 種 好 的 方 法
能 夠 逐 一 地 從 數 據 庫 中 抽 取 記 錄 或 字 段( 通 過RecordSet)
並 且 將 取 到 的 信 息
填
入 到 新 生 成 的 對 象 之 中
這 一 解 決 方 式 的 關 鍵 在 於 關 系 數 據 庫(RDB) 和 面 向 對 象 的 數 據 模 型(ODB) 之 間 的 相 似 性
RDB 中 的 表 和ODB 中 的 類 的 作 用 很 相 似
而 記 錄 和 對 象 也 有 著 某 些 相 同 的 屬 性
你 可 以 將 記 錄 看 作 是 用 來 初 始 化 某 個 對 象 的 數 據 元 素 的 數 據 組
如 果 你 已 將 記 錄 從 數 據 庫 中 抽 取 出 來
就 必 須 調 用 類 構 造 函 數 來 生 成 上 面 所 說 的 對 象
若 能 夠 將 每 一 條 記 錄 自 動 地 傳 到 適 當 的 構 造 函 數 中
就 可 以 輕 而 易 舉 地 由 記 錄 來 構 造 對 象
在 開 發 一 個 小 的 應 用 程 序 時
有 可 能 將 每 一 個 記 錄 傳 遞 給 某 個 構 造 函 數
以 此 來 生 成 新 的 對 象
你 可 以 經 常 利 用 對 象 參 照 來 操 縱 從 數 據 庫 中 抽 取 的 任 何 數 據
因 為 你 通 過RecordSet 所 得 到 的 每 一 個 對 象 最 終 都 是java
lang
Object 的 擴 充
你 可 以 定 義 一 個BibClass
使 其 具 有 各 類 的 共 同 屬 性
BigClass 類 操 作 將 利 用Java instanceof 算 子 來 實 時 決 定 運 行 中 所 遇 到 的 數 據 庫 信 息
並 且 通 過 一 個 大 的switch 選 擇
跳 到 相 應 的 程 序 段 中
你 也 可 以 定 義 一 個 相 似 的 帶 有 多 個 構 造 函 數 的BigClass
每 個 構 造 函 數 有 差 別 不 太 大 的
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26251.html