通過Hibernate 來映射 DB2 pureXML 數(shù)據(jù)的應用
本文主要介紹的是正確使用 Hibernate 來簡化基于DB2 pureXML 的相關應用程序的實際開發(fā)我們主要是通過N個例子來映射 DB2 pureXML 的數(shù)據(jù),減少開發(fā)難度。以下就是文章的主要內容的詳細描述,望大家在瀏覽之后會對其有更深的了解。
前提
讀者需要對 Hibernate 框架和 DB2 pureXML 相關技術,如 SQL/XML,XQuery 等有一定的了解。本文所述基于 DB2 V9.5 和 Hibernate 3.3.1GA 。由于 DB2 V9.7 的 Sample 數(shù)據(jù)庫中示例 XML 表中不再包含命名空間,如果讀者使用 DB2 V9.7,讀者需要在示例代碼中去掉對命名空間的聲明。
Hibernate 簡介
如今的企業(yè)級應用程序的開發(fā)基本都是以面向對象的方式進行的,Java 社區(qū)豐富的資源為開發(fā)過程提供了產品質量和開發(fā)效率的雙重保障。然而,在數(shù)據(jù)庫層面,由于各種原因,比如使用習慣,性能考慮等因素,卻依舊沿襲了“實體 - 關系”的數(shù)據(jù)模型設計,將立體化的對象切割成為各個平面的表結構,然后再在這些表之間建立起來關聯(lián)。另一方面來講,數(shù)據(jù)庫本身的發(fā)展也遇到了瓶頸,暫無很好的辦法以直接的方式管理對象(本文指 Java 類的實例),提供基于對象的 CRUD( 增刪改查 ) 等操作,以及事務控制等。
基于以上考慮,開源的 Hibernate 作為一個關系型數(shù)據(jù)庫的對象映射框架,已經(jīng)成為了企業(yè)級應用程序開發(fā)人員的首選。開發(fā)人員常常利用 Hibernate 作為粘合劑,把 Java 對象和關系型數(shù)據(jù)庫粘合起來,免去手工映射的繁瑣工作。
DB2 pureXML 的用武之地
Java 和 XML 可謂是天生的盟友。兩者都可以用來描述復雜的對象,而且兩者之間的轉換也易如反掌。有許許多多的開源項目可以支持 Java 對象到 XML 的序列化 (serialization) 和 XML 文檔到 Java 對象的反序列化 (de-serialization) 。 Java 利用 SAX 和 DOM 方式解析 XML 文檔,并進行相應的操作,也是得心應手。
如果給 Java 設計人員兩個選擇,其一是拆分 Java 對象為若干個復雜的表,這些表間又有千絲萬縷的聯(lián)系,其二是直接將 Java 對象序列化成 XML,然后存入數(shù)據(jù)庫,同時保證插入查詢等數(shù)據(jù)庫操作的性能;我想很少有人可以拒絕第二個選擇。
DB2 pureXML 在這樣的背景下可以發(fā)揮其獨特的價值。無需將 XML 文檔拆分成關系表,可直接插入到數(shù)據(jù)庫中;查詢時,既可以把整個文檔從數(shù)據(jù)庫中取出來,也可以只摘取 XML 文檔的某若干個節(jié)點元素,還可以將某一個或多個元素作為查詢條件。數(shù)據(jù)更新時,既可以將整個 XML 文檔更新,也可以只更新文檔的若干元素。這些操作都是基于業(yè)界標準的 XQuery 和 SQL/XML 。關于 DB2 pureXML 的數(shù)據(jù)操作接口和方式,讀者可以參考相應文章,這里不再贅述。
這些特性無疑給了程序設計人員很大的想象空間和設計靈活性。
Hibernate 和 DB2 pureXML 如何共存
Hibernate 作為一個 ORM(Object-Relational Mapping) 工具,首先考慮的是對象(Object)和關系表(Relational)之間的映射關系。而 DB2 pureXML 所采用的 SQL/XML 和 XQuery 接口并沒有在 Hibernate 中得到直接的支持。咋看起來,似乎為了使用 DB2 pureXML,只能
放棄 Hibernate 框架,改用 JDBC 來實現(xiàn)數(shù)據(jù)訪問接口。
筆者經(jīng)過一些探索,發(fā)現(xiàn)事實并非如此。在 Hibernate 3.3.1GA 版本中,已經(jīng)可以對 DB2 pureXML 的絕大多數(shù)操作提供支持。只不過這些支持方式尚不為人熟悉罷了。本文的剩余部分將分門別類的就如何在 Hibernate 框架之上開發(fā) DB2 pureXML 的應用程序詳細介紹。
在閱讀以下內容的同時,讀者可以參考示例代碼進行嘗試。在開始之前,建議用戶創(chuàng)建包含 XML 示例表的 sample 數(shù)據(jù)庫。在 db2cmd 下運行 db2sampl – xml 即可。 XML 示例表將創(chuàng)建在當前用戶 schema 下。
各種查詢和對象映射方式
總體來講,在 Java 語言中對 XML 文檔的對象映射通常采用以下幾種方式 :
映射成為 DOM 對象 ;
摘取 XML 文檔中的部分元素 , 映射成為普通 Java 類 ;
對復雜多層次的 XML 文檔 , 映射成為若干個互相引用的 Java 類 ;
將 XML 文檔映射成為動態(tài)類的實例。
而在 Hibernate 里面,可以有如下更豐富的選擇。當然,這些選擇也只是對以上方式的擴展而已。
整體獲取 XML 文檔
Hibernate 支持將 XML 文檔直接映射為 java.lang.String 類型。因此,如果希望獲取整個 XML 文檔,可以采用這種方式將 XML 文檔返回為 Java 的 String 對象,然后在 Java 程序中使用 JDOM 等工具對該對象做進一步處理。這種處理方式和對 CLOB 數(shù)據(jù)類型的處理方式類似。
另外,Hibernate 允許用戶自定義數(shù)據(jù)類型,由該數(shù)據(jù)類型和數(shù)據(jù)庫中 XML 列直接交互。讀者可以參考https://www.hibernate.org/466.html,該篇文章介紹了如何編寫自定義用戶類型來將 DB2 中的 XML 列映射成為 DOM 對象。
原生 SQL 查詢
Hibernate 常用的查詢語言是 HQL,但是也支持數(shù)據(jù)庫原生 SQL 。用戶可以直接編寫原生 SQL 來支持具有數(shù)據(jù)庫獨有特性的 SQL 。如清單 1 所示,用戶編寫 SQL/XML,讀取 /customerinfo/name 節(jié)點和 /customerinfo 下的 Cid 屬性。
以上的相關內容就是對使用 Hibernate 映射 DB2 pureXML 數(shù)據(jù)的介紹,望你能有所收獲。
【編輯推薦】
- 使用DB2臨時表時有哪些問題是需要注意的?
- 對DB2 9.7武器的功能的描述
- IBM DB2連接集中器的基本操作原理
- DB2 V9.5 新特性有哪些好處?
- DB2 batch update注意事項的描述