首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 XML 程式設計(一):深度理解 XML 數據模型與應用開發範式轉變

     編輯:DB2 教學

前言:XML 將重塑應用開發未來十年

W3C 標準指出 XML 設計目標包括:「支援各式應用程式」、「編寫處理 XML 文件的程式將很容易」。但可讀性、序列化、傳輸等目標獲關注遠多於應用開發目標。本系列三部曲探討 XML 對應用開發的影響:

  1. 本文(第 1 部分):何時在應用開發中使用 XML 能使開發更簡單、成本更低、更可移植、品質更高。XML 程式設計將在十年內從根本改變應用開發方式,影響力堪比過去十年物件導向方法。
  2. 第 2 部分:資料庫角色。聚焦 DB2 9 (Viper) 與 Viper 2 功能:新 XML 儲存查詢環境如何操作應用層 XML 數據模型、採用 XML 開發架構後資料庫模式如何更簡單自然、如何以應用中查詢數據的相同方式查詢資料庫 XML、如何結合關聯與 XML 數據雙贏。
  3. 第 3 部分:客戶端技術——AJAX、XSLT、SVG、Comet、feed、mashup。如何在資料庫生成 feed 與 Web 服務、應用層查詢組合、瀏覽器顯示。

第 4 篇將整合所有技術展示真實範例。

XML 數據模型基礎:從 DOM 到原生 XML 思維

傳統上 XML 定義業務文件元數據,DOM 用於應用中操作元數據。DOM 為階層式 XML 數據結構提供物件介面,可用 DOM API 操作。換言之,DOM 可作為物件包裝器操作任何可用 XML 表示的數據結構。

XML 數據模型中,許多應用數據物件被定義為 XML。因 XML 本質是階層式,極易以自然、人可讀格式捕捉不同數據物件間關係。

註:若數據已是 XML 格式,後續過程自然簡單。若為關聯格式,仍可用此法,但需建立關聯與 XML 雙向映射,可用 SQL/XML 發布與分解函數實現。多數關聯資料庫支援此類函數。對僅用 XML 作為數據模型的開發者,關聯映射到階層數據似屬多餘,但開發者在將關聯映射到數據物件時總在這麼做。XML 數據模型優勢足以促使許多開發者考慮在應用開發中使用 XML,即使業務模型不要求 XML 數據。

定義 XML 數據模型後,可用 DOM 解析器在應用中實例化。為隔離應用代碼與 DOM API,可為 DOM 和 XPath 實現創建包裝器,亦能提升應用代碼可移植性。本文提供 Java 包裝器範例(見下載區),可直接使用或作為模板。業務邏輯使用包裝器 API 直接操作 XML 模型,修改後的 XML 輕鬆序列化,在不同物件或多層環境 (SOA) 層間傳遞。

XML 數據模型 vs 數據物件模型:包裝器層的消失

大多數應用由業務物件組成,操作數據物件階層。數據物件通常是業務數據的簡單包裝器,主要用途以受控方式向業務物件公開封裝數據。物件包裝器另一優勢:以自然物件階層表達關聯表中儲存的數據,捕捉數據間關係。編程工作主要部分即為業務數據創建這些物件包裝器。

因 XML 本質維護數據結構間關係,無需創建單獨物件階層捕捉關係。XML 已有標準物件模型 DOM,實現處理 XML 構造、修改、序列化。結合 XPath 與 DOM API,極易在業務應用中載入、修改、保存 XML 數據。

真實範例:客戶與訂單資訊的兩種建模對決

數據物件模型:龐大的包裝器代碼

需創建 Customer、Items、Item 三個包裝器類(清單 1-3),包含 getter/setter、資料庫查詢邏輯、FindItemByPrice 等高級搜尋方法。應用代碼(清單 4)操作這些物件。發現:數據物件代碼遠多於業務邏輯代碼。包裝器隱藏底層業務數據關係,API 必須文檔完善開發者才能正確使用。簡單導航容易,但每個搜尋條件都需實現高級搜尋/導航功能(如 FindItemByPrice)。

XML 數據模型:極簡建模

包裝器主要用途是封裝業務數據,可用 XML 數據模型替換:

<Customer customerid="" firstname="" lastname="">
  <Items>
    <Item ID="" description="" purchaseDate="" price="" />
  </Items>
</Customer>

假設資料庫數據已存為 XML:客戶數據存為 XML、商品數據存為 XML。對給定客戶,只需獲取客戶 XML 並插入查詢的商品列表。

情況一:資料庫存 XML

1. Statement dbstmt= conn.createStatement();
2. ResultSet dbResult = dbstmt.executeQuery("select custXML from customer_table where customerid=custid");
3. XMLParse customerXML = new XMLParse(dbResult.getString(1));
4. customerXML.appendNode("/Customer", customerXML.createNode("<Items/>"))
5. dbResult = dbstmt.executeQuery("select itemXML from purchase_table where customerid=custid");
6. While (dbResult.next()) {
7.   Node itemnode = customerXML.createNode(dbResult.getString(1));
8.   customerXML.appendNode(itemnode, "/Customer/Items", false);
}
9. customerXML.find("/Customer/Items/item[@price>15.0 and @price<25.5]", true);
10. for(int i=0; i

第 2 行查詢返回客戶 custXML,第 3 行傳給 DOM 包裝器建構器實例化物件階層。第 4 行創建 Items 元素追加到 Customer。第 5-8 行獲取商品列表逐個追加。第 9 行用 XPath 搜尋價格區間商品,第 10-11 行輸出描述。

情況二:資料庫存關聯格式

用 SQL/XML 發布函數在查詢中轉換(清單 7)。其餘應用代碼相同。

XML 模型優勢:消除包裝器層,聚焦業務邏輯

數據物件包裝器佔應用代碼大頭,嚴重分散開發者對業務邏輯的注意力,導致:額外成本、更多 Bug、更長開發週期、難移植代碼、模式變更需修改/重生成物件階層、維護更難、無內建數據驗證、需更多文檔解釋包裝器、高級搜尋導航需複雜邏輯、各業務物件自行處理序列化、若用映射工具則鎖定工具難替換。

XML 程式設計方法可取消整個包裝器物件階層,讓開發者專注業務邏輯不被數據結構分心。帶來優勢:

  • 減少代碼 → 提高品質、降低成本、增加靈活性
  • 促進 RAD 開發
  • XPath 解析器內建高級搜尋導航
  • XML 模型內建約束檢查與模式驗證
  • 模型內建持久化:隨時存檔、字串、流
  • 無需額外工具
  • 向業務邏輯公開關係與數據階層(關聯環境中隱藏數據模型是必要的,XML 環境中卻是缺點)
  • 業務邏輯代碼易懂:XPath 描述數據性質與業務結構關係

採用 XML 模型的挑戰與解決方案

  • 關聯數據映射 XML 繁瑣:雖多數廠商提供工具,但映射過程繁重。DB2、SQL Server 等引入純 XML 功能後,將 XML 分解映射到關聯表不再必需。用 XQuery 與 XML 索引,可按原樣搜尋獲取儲存的 XML,方式同獲取大字串物件。
  • 需學習 SQL/XML、XQuery 查詢:建議先掌握簡單 XPath 搜尋,再進階複雜 XQuery。
  • 精通 DOM API 有難度:可使用本文附帶 helper 類減少直接調用 DOM API。此類封裝 DOM API 公開更自然 API,提供實例化、序列化、搜尋、修改、XSL 轉換、命名空間、模式驗證功能。
  • 業務邏輯直接嵌入 DOM API 低效:XML 模式修改需大量改代碼、多 API 調用降低可讀性、導航修改的數據物件不明顯。包裝器類避免嵌入 DOM API:用 XPath 導航 DOM,模式修改只需改包裝器 API 調用中的 XPath 字串。XPath 指出操作節點在階層中位置,代碼可讀性極高。

結語:回歸業務邏輯本質

業務應用核心是創建、操作、儲存、呈現業務數據。數據物件包裝器旨在讓業務邏輯更易處理數據,但創建維護成本高,使開發者過度關注數據處理邏輯,分散對業務邏輯注意力。XML 數據模型可取消整個包裝器階層,聚焦業務邏輯。DOM 包裝器類隔離應用代碼與 DOM API。XPath 導航明確指出操作業務數據中的關係,代碼更易理解。理想情況數據應在資料庫存純 XML;即使存關聯表,應用中先轉 XML 再處理在許多情況下有意義。若包裝在物件階層的數據結構可用 XML 格式化,且物件階層主要用途操作這些結構並向業務邏輯公開,可考慮用 DOM 替代包裝器階層。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved