熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java,Beans 和 關系數據庫 的 鏡像

2013-11-23 19:05:32  來源: Java核心技術 

  摘 要
   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 包( 或 類 庫 即javasql) 出 現 包 括 有 一 系 列 的 類 這 些 類 提 供 了 處 理 某 個 關 系 數 據 庫 的 中 間 件 本 質 上 講 它 們 使 得 你 可 以 關 聯 某 個 數 據 庫 並 向 其 發 出 查 詢 你 可 以 對 這 些 查 詢 結 果 進 行 處 理 檢 索 你 數 據 庫 的meta 信 息(metainformation) 並 且 處 理 在 此 間 可 能 發 生 的 各 種 異 常 情 況
  
   讓 我 們 來 看 一 個 簡 單 的JDBC 例 子 看 一 看 應 用 了Java JDBC 之 後 查 詢 會 得 到 怎 樣 的 簡 化 是 一 個 極 其 簡 單 的 數 據 庫 在 清 單 中 的 編 碼 是 一 段 最 簡 單 的 對 關 系 數 據 庫 進 行SQL 查 詢 所 需 的Java 語 句
  
   String ur=jdbc:odbc:sample;
   String query=SELECT * FROM PERSON;
   boolean more;
   try
   {
   ClassforName(sunjdbcodbcjdbcOdbcDriver);
   Connection con = DriverManagergetConnection(ursandorguest);
   Statement stmt = concreateStatement();
   ResultSet rs = stmtexecuteQuery(query);
   While (more = rsnext())
   {
     int number = rsgetInt(PERSON#);
     String firstName = rsgetString(FIRST_NAME);
     String lastName = rsgetString(LAST_NAME);
     SystemoutprintIn(number + + firstName + + lastName);
   }
   rsclose();
   stmtclose();
   conclose();
   }
   catch(SQLException ex)
   {
   exprintStackTrace();
   }
  
  清 單: 一 個 應 用 了JDBC 的SQL 查 詢
  
     這 段 編 碼 的 含 義 是 先 裝 入SUN 的JDBC/ODBC 驅 動 程 序 然 後 與 被jdbc:odbc:sample 指 定 的 數 據 庫 建 立 起 一 個 關 聯 最 後 對 該 數 據 庫 進 行 一 個 簡 單 的SELECT 查 詢 如 果 沒 有 遇 到 查 詢 異 常(SQLException) 程 序 將 循 環 地 從 結 果 集(ResultSet) 中 每 次 抽 出 一 條 數 據 庫 記 錄 並 將 其 顯 示 在 屏 幕 上
  
     好 了 現 在 我 們 來 看 一 看 這 段 程 序 還 有 哪 些 不 足? 在 清 單 的 這 類 程 序 中 存 在 著 兩 個 根 本 性 的 錯 誤
  
     . 這 種 編 碼 用 到 了 數 量 眾 多 的 數 據 庫meta 信 息 而 這 些 信 息 都 只 能 手 工 編 碼 到 程 序 中 當 你 想 要 取 一 個 數 值 時 你 必 須 提 前 知 道 你 將 取 到 的 數 值 是 一 個 整 數 浮 點 數 還 是 一 個 雙 精 度 數 這 將 會 使 得 編 寫 一 個 可 以 處 理 任 何 一 個 數 據 庫 的 類 變 得 十 分 困 難 並 且 每 一 個 數 據 庫 的 細 小 調 整 都 會 逼 你 去 仔 細 地 檢 查 和 修 改 程 序
  
     . 數 據 庫 中 的 信 息 總 是 作 為 一 個 單 個 的RecordSet( 記 錄 集) 實 例 來 傳 遞 而 這 種 實 例 並 不 是 一 個 真 正 的 對 象RecordSet 類 ( 與 其 它 的 數 據 庫 類 封 裝 沒 什 麼 差 別) 更 象 一 個 指 針 或 游 標 借 助 方 法 它 能 夠 提 供 存 取 數 據 信 息 的 途 徑RecordSet 中 的 實 例 實 際 上 並 不 包 括 信 息 它 們 僅 僅 表 示 獲 得 信 息 的 方 式 這 正 說 明 了 當 你 要 調 用 另 外 的RecordSet 方 法 去 獲 取 某 些 真 實 的 數 據 信 息 的 時 候 你 必 須 通 過RecordSet 去 做 更 多 的 工 作( 利 用RecordSetNEXT() 去 移 動 指 針) 實 際 上JDBC 類 的 確 僅 僅 傳 遞 這 類 聯 系 松 散 的 字 段 即 使 你 完 全 了 解 數 據 庫 的 所 有 內 部 細 節 這 也 沒 有 任 何 價 值 因 為 在Java 提 供 了 存 儲 和 處 理 信 息 的 方 法
  
     所 以 理 想 的 狀 態 是 有 一 種 好 的 方 法 能 夠 逐 一 地 從 數 據 庫 中 抽 取 記 錄 或 字 段( 通 過RecordSet) 並 且 將 取 到 的 信 息 入 到 新 生 成 的 對 象 之 中
  
     這 一 解 決 方 式 的 關 鍵 在 於 關 系 數 據 庫(RDB) 和 面 向 對 象 的 數 據 模 型(ODB) 之 間 的 相 似 性RDB 中 的 表 和ODB 中 的 類 的 作 用 很 相 似 而 記 錄 和 對 象 也 有 著 某 些 相 同 的 屬 性 你 可 以 將 記 錄 看 作 是 用 來 初 始 化 某 個 對 象 的 數 據 元 素 的 數 據 組 如 果 你 已 將 記 錄 從 數 據 庫 中 抽 取 出 來 就 必 須 調 用 類 構 造 函 數 來 生 成 上 面 所 說 的 對 象 若 能 夠 將 每 一 條 記 錄 自 動 地 傳 到 適 當 的 構 造 函 數 中 就 可 以 輕 而 易 舉 地 由 記 錄 來 構 造 對 象
  
     在 開 發 一 個 小 的 應 用 程 序 時 有 可 能 將 每 一 個 記 錄 傳 遞 給 某 個 構 造 函 數 以 此 來 生 成 新 的 對 象 你 可 以 經 常 利 用 對 象 參 照 來 操 縱 從 數 據 庫 中 抽 取 的 任 何 數 據 因 為 你 通 過RecordSet 所 得 到 的 每 一 個 對 象 最 終 都 是javalangObject 的 擴 充 你 可 以 定 義 一 個BibClass 使 其 具 有 各 類 的 共 同 屬 性BigClass 類 操 作 將 利 用Java instanceof 算 子 來 實 時 決 定 運 行 中 所 遇 到 的 數 據 庫 信 息 並 且 通 過 一 個 大 的switch 選 擇 跳 到 相 應 的 程 序 段 中
  
     你 也 可 以 定 義 一 個 相 似 的 帶 有 多 個 構 造 函 數 的BigClass 每 個 構 造 函 數 有 差 別 不 太 大 的
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26251.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.