程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2 pureXML 動態編程組合拳:iBatis+BeanUtils+JiBX

DB2 pureXML 動態編程組合拳:iBatis+BeanUtils+JiBX

編輯:DB2教程

簡介

本文旨在闡述一種基於 pureXML 技術的應用程序開發模式,借助 pureXML 的存儲靈活性,iBatis 的數據訪問適應性,BeanUtils 和 JiBX 的動態類生成,以及 XSLT 帶來的界面展示靈活性,通過這些工具的組合達到整個軟件框架的高度靈活,以期盡可能的適應需求帶來的變化。

基於 DB2 pureXML 的應用程序開發模式

本文要介紹的開發模式主要針對需求易變的應用開發,使用各種工具和技術來增強框架的靈活性。隨著 XML 描述能力和靈活性被逐漸認識,許多 XML 相關技術應運而生,越來越多的應用使用了 XML 技術。一個基於 XML 的應用開發常常可以劃分為幾個層面:數據存儲層、數據訪問層、業務邏輯層和界面展示層。

DB2 pureXML 技術的逐漸成熟,為這些基於 XML 的應用開發提供了有力的支持。 pureXML 技術提供了高效的 XML 存儲方案,同時支持標准的 XML Query 語言,使得應用程序能方便、有效地組織 XML 數據,在數據存儲層提供了靈活性。而為了使 pureXML 技術更好的整合到整個應用開發中,需要考查其它層面上的支持技術。

在基於 DB2 pure XML 的應用開發中,在數據訪問層使用 iBatis 將是非常合適的。iBatis 是一個開源的持久層框架,它支持 POJO 類和數據庫表之間的映射,為應用的上層提供了數據訪問的抽象。和其他 ORM 框架相比,iBatis 在基於 DB2 pure XML 的應用開發中有著自己的優勢。首先,iBatis 提供了靈活的映射定義方式,開發人員可以通過使用 SQL/XQUERY 語句描述數據庫數據的組織邏輯,隨著 XML 數據的引入,這種映射定義與實現機制表現出了良好的適用性,而其他的 ORM 框架對 XQUERY 的支持不是很好。其次,由於 iBatis 允許在映射文件中制定 SQL/XQUERY 語句,給開發人員提供了較大的靈活性,可以使用高效的 SQL/XQUERY 語句對數據進行訪問。

在業務邏輯層,使用 JiBX 和 BeanUtils,JiBX 為數據綁定提供了支持,DeanUtils 則為動態類提供了支持。

復雜的業務邏輯,首先需要完成 POJO 與 XML 文檔的數據綁定。JiBX 是一個數據綁定框架,它能夠很好的實現 XML 數據與 Java 對象之間的綁定,從而滿足應用程序中二者之間相互裝換(Marshal/Unmarshal)的需求。對比其它數據綁定框架,JiBX 使用字節碼增強以及 XPP(XML Pull Parsing)技術,擁有出色的性能。在基於 DB2 pure XML 的應用程序開發中,針對較頻繁的 XML 數據與 Java 對象轉換,JiBX 是一種不錯的選擇。

由於在業務邏輯層使用 POJO 對應 XML 數據的表示,而 POJO 需要動態改變以適應變化。BeanUtils 工具支持動態的修改 Java Bean,可以實現動態 POJO,已適應適應一些數據結構的變化需求。使用 BeanUtils 提供的工具類另一個優勢是可以提高開發效率,開發人員可以使用較少的代碼方便地實現對 Bean 的一些操作。

在界面展示層,引入 XSLT 技術。XSLT 是一種基於 XML 文檔轉換語言,可以將 XML 按照定義好的樣式表進行轉換。XSLT 可以實現 XML 數據與其表現形式解耦,對於同一份 XML 數據,可以應用不同的樣式表,從而達到不同的表現形式。針對顯示層需求的變化,只需修改樣式表就可以。這種 XML 數據與其表現形式之間的松耦合為 XML 應用程序的前端開發帶來較高的可擴展性,提高了 XML 應用開發的靈活性。

上述各層的考查,為基於 DB2 pureXML 的應用程序開發提供了一個實用的模式。本文接下來將簡要介紹開發中所需的工具技術,以期讓讀者更好的了解這種開發模式。

背景知識

pureXML

XML 具有自我描述性(易理解性)、靈活性、平台無關性和標准化等優點,這一優秀的技術廣泛應用到各個領域。DB2 9 為 XML 提供了很好的數據存儲和管理機制,IBM 將這一技術稱之為“pureXML”。DB2 V9 對 XML 進行高效地原生態的存儲,並支持 SQL 和 XQuery 兩種查詢方式。不僅如此,所有關系型的操作方式和數據庫工具都可用於 XML 之上,例如索引機制、導入導出、關聯查詢、高速批量加載、系統優化等等。在 pureXML 特性的支持下,DB2 V9 成為一個既支持關系數據,又原生態支持 XML 的名副其實的雙引擎數據庫。有了對 XML 數據的強大支持,DB2 pureXML 在企業中的應用價值也在日益得到廣泛關注。

iBatis

IBatis 是一個“半自動化”的 ORM 框架。這裡的“半自動化”,是相對 Hibernate 等提供了全面的數據庫封裝機制的“全自動化”ORM 實現而言,程序員往往只需定義好了 POJO 到數據庫表的映射關系,SQL 可以自動生成和執行,即通過 Hibernate 或者 OJB 提供的方法完成持久層操作。而 iBatis 的著力點,則在於 POJO 與 SQL 之間的映射關系。也就是說,iBatis 並不會為程序員在運行期自動生成 SQL/XQuery 執行,具體的 SQL/XQuery 需要程序員編寫,然後通過映射配置文件,將 SQL/XQuery 所需的參數,以及返回的結果字段映射到指定 POJO。這種半自動化為開發者提供了一定的自由發揮的空間。

下面就對 iBatis 工作機制作一個簡單介紹,讀者可以進一步查閱本文提供的參考資料。

IBatis 設計模式的核心部分就是 SQL Map,它需要提供一個 XML 文件來取得數據庫的連接及實現簡單 Java bean 與 SQL 的映射聲明。SQL Map 並不僅僅是一個 XML 文件,它其實一個設計模式。在執行映射聲明時,SQL Map 將創建一個 JDBC 的 PreparedStatement 實例,用在 XML 中描述的對象作為 PreparedStatement 實例的參數,執行 PreparedStatement 並從 Result 中創建結果對象,這個執行流程用圖 1 表示:

圖 1。 iBatis 執行流程圖
DB2 pureXML 動態編程組合拳:iBatis+BeanUtils+JiBX

查看原圖(大圖)

JiBX

JiBX 是一款非常優秀的 XML 數據綁定框架,JiBX 的轉換效率是目前很多開源項目都無法比擬的。它通過靈活的綁定映射文件來實現數據對象與 XML 文件之間的轉換,這個文擋就是聯系 XML 數據與 Java 對象之間的橋梁。

一個簡單的綁定的例子如圖 2 所示:

圖 2。 一個簡單的綁定定義
DB2 pureXML 動態編程組合拳:iBatis+BeanUtils+JiBX

查看原圖(大圖)

在這個例子中,JiBX 在綁定文件中定義了 XML 的子元素和 Java 類成員的映射關系,從而將 XML 元素與相應的 Java 對象特性聯系起來。JiBX 提供的綁定定義非常靈活,感興趣的讀者可以從參考資料中詳細了解。

使用 JiBX 綁定 XML 文檔與 Java 對象分為兩步 :

第一步是編譯綁定,也就是將您完成的綁定定義實際地編譯成類文件。JiBX 提供了一個用於此目的的綁定編譯器。可以直接運行編譯器,將一個或多個綁定定義文件路徑作為參數運行 org.jibx.binding.Compile 程序。比如:如果 JiBX 的安裝路徑在 C:\ 下,您就可以在綁定定義文件 binding.XML 所在的路徑下運行下面的命令:

Java –jar C:\jibx\jibx-bind.jar binding.XML

第二步運行綁定,實現 XML 文件與 Java 實例之間的互相轉換,使用 JiBX 運行時來對文檔進行數據編組(marshal)和數據編出(unmarshal)。數據編組是由 Java 對象生成 XML 文擋的過程,而數據編出是根據 XML 文擋建立 Java 對象的過程。

BeanUtils

BeanUtils 是 apache Jakarta Commons 項目的一個功能強大的組件。主要是對 Java 反射和自省 API 的包裝,其目的是利用反射機制對 JavaBean 的屬性進行處理。BeanUtils 的優勢就是能夠實現一個動態的 Bean,也就是不用事先定義一個標准的 JavaBean 類,而是根據業務需要隨時動態地添加屬性,並且可以作為一個 JavaBean 一樣使用,即可以用 BeanUtils 操作其他 JavaBean 的方法一樣進行操作。

BeanUtils 一共分 4 個包:

org.apache.commons.beanutils

org.apache.commons.beanutils.converters

org.apache.commons.beanutils.locale

org.apache.commons.beanutils.locale.converters

其中前兩個是 BeanUtils 的默認實現,它沒有針對本地化的任何處理,這個可以提高執行效率。但是若你的程序對於本地化有要求的話,那還是使用後面兩個包比較安全。

下面介紹 BeanUtils 幾種比較典型的方法:

(1)LazyDynaBean:它實現一個動態的 Bean,直接往裡面加入屬性,並作為一個 JavaBean 一樣使用。例如:

/* 這裡使用 LazyDynaMap,它是 LazyBean 的一個輕量級實現 */ 
LazyDynaMap dynaBean = new LazyDynaMap(); 
dynaBean.set("name", "Jone"); // set simple type 
dynaBean.set("address", "stress", "HaiDian"); // set map type 
dynaBean.set("phone", 0, "82502987"); // set index type 
Map myMap = dynaBean.getMap(); // retrIEve the Map 

(2)屬性拷貝:該方法可以直接進行 Bean 之間的克隆(clone),如:

BeanUtils.copyPropertIEs(c1, c2);

但是這種 copy 都是淺拷貝,復制後的兩個 Bean 可能擁有同一個對象的引用,這個在使用時要小心。

XSLT

XSLT 是一種將 XML 文檔轉化為其他形式的文檔的語言,是 W3C 的推薦標准。提到 XSLT 不得不提及 XSL(eXtensible Stylesheet Language),即可擴展樣式表語言,同樣也是 W3C 的推薦標准。XSL 是 XML 的樣式表,這一點類似於作為 Html 的樣式表 CSS,但是它又比 CSS 復雜得多,它實際上包含三種語言:轉換 XML 的語言 XSLT、定義 XML 部分或模式的語言 XPath、定義 XML 顯示方式的語言 --XSL 格式化對象。

XSLT 是 XSL 標准中最重要的部分,它用於將一個 XML 文檔轉換成另一個 XML 文檔或另一種類型的文檔。將 XML 轉換成 Html 是 XSLT 的主要功能之一。XSLT 可以向輸出文件中增加全新的元素,或去掉一些元素。它可以重新安排這些元素並對元素進行分類,測試並確定顯示哪些元素等等。

描述這種轉換過程的一個常用說法是:XSL 用 XSLT 將一個 XML 來源樹轉換成另一個 XML 結果樹(或將一個 XML 源文檔轉換成另一個 XML 結果文檔),圖 3 示表示了該流程:

圖 3。 XSLT 輸入和輸出的樹狀結構
DB2 pureXML 動態編程組合拳:iBatis+BeanUtils+JiBX 

應用場景及解決方案

本文的前半部分對 pureXML、iBatis、JiBX、BeanUtils、XSLT 等技術作了較詳細的介紹,那麼在實際應用開發中如何借助 pureXML 的存儲靈活性,iBatis 的數據訪問適應性,BeanUtils 和 JiBX 的動態類生成,以及 XSLT 帶來的界面展示靈活性,以達到整個軟件框架的高度靈活,這是本文的重點所在。

下面就以一個具體的應用場景為例,在簡單介紹該場景的業務流程之後,將給出詳細的程序設計思路。

應用場景

本文的應用場景是一個資源交換平台,該平台主要為用戶提供資源的上傳和下載功能,用戶也可以對已有的資源信息進行編輯,如添加一些描述信息、資源鏈接或者上傳相關資源等。因為用戶上傳的資源種類繁雜,描述信息相當豐富,因此采用 XML 作為描述資源信息無疑是最好的選擇。

該應用場景的業務流程框架圖如圖 4:

圖 4。 業務流程框架圖
DB2 pureXML 動態編程組合拳:iBatis+BeanUtils+JiBX

如果用戶新上傳一種資源,這就需要對該資源添加新的描述信息,為了給用戶足夠的自由空間,平台以動態模型定制的方式讓用戶先定義信息錄入的模板或者選擇別人定義過的模板,然後依據模板再錄入信息。這樣做的好處是既把自由空間留給了用戶,又能夠使系統把握這些豐富的 XML 數據。

如果用戶要編輯已有的資源描述信息,平台首先個性化展示已有的描述信息並接收用戶添加的新信息,考慮到有些模塊接口需要以 Java 對象的形式作為參數來處理這些描述信息,平台要能夠提供編輯後的信息的 Java 對象,或者直接將其存入數據庫。

解決方案

這個數據交換平台的最大的特點是處理的數據靈活多變,並且隨著業務量的不斷增長,數據也逐漸變得復雜,這使結構固化的 E-R 模型難以適應數據的復雜性、靈活性、層次性、以及個體差異,而由於 XML 具有自描述特性,可以很好地應對信息的復雜性、可理解性、靈活性以及可擴展性帶來的挑戰,因此采用 XML 作為信息的載體無可厚非。

DB2 V9.5 的 pureXML 提供了高效管理 XML 數據的功能,並為應用程序提供簡單、方便的訪問方法,程序員只要按照 W3C 制定的 XML/SQL 標准就可以輕松地操作 XML 數據,因此,選擇 pureXML 作為後台數據庫無疑給整個平台的運行打下堅實的基礎;Batis 允許自由配置 XMLQUERY,這些 XMLQUERY 在某些情況下可以被復用,同時它能夠將結果映射為 Java 對象,使用該框架可以有效簡化應用開發;在需要個性化展示 XML 的地方考慮使用 XSLT 轉換,因為每一個描述信息的 XML 都有相應的模板即 schema,所以 XSLT 可以根據 schema 的結構轉化 XML 並個性化顯示;當用戶需要為已有描述信息添加新的描述時,可以利用 BeanUtils 將從界面上得到的若干新描述信息添加到由 JiBX 生成的動態 JavaBean 中,得到的 JavaBean 可以供其它的模塊使用,或者利用 JiBX 的 marshall 功能將其映射成 XML 並存入數據庫。

圖 5。 系統架構圖
DB2 pureXML 動態編程組合拳:iBatis+BeanUtils+JiBX

查看原圖(大圖)

方便起見,本文抽取“編輯描述信息”這一業務流程為案例,結合具體的程序設計使讀者更清晰地認識該解決方案的靈活性。

首先,用戶讀取描述信息並進行編輯。這一步需要在 iBatis 的 sql Map 配置文件中配置相應的 sql 語句並執行,然後將得到的描述信息的 XML 用 XSLT 進行個性化展示。

1。配置 sql:

清單 1。 sql Map 在 iBatis 中的配置

<select id="selectInfo" parameterClass="Description" resultClass="Description"> 
 select INFO from DISCRIPTION where ID=#id# 
</select>

其中將參數和查詢結果類型映射為事先定義的 Java Bean :Description,該 Java Bean 實現的是數據庫表 DISCRIPTION 的字段到 Java 對象屬性的簡單映射,具體內容清單 2:

清單 2。 POJO 類

/*mapping from table DISCRIPTION*/ 
public class Description { 
 private int id; 
 private String info; 
 public int getId() { 
 return id; 
 } 
 public void setId(int id) { 
 this.id = id; 
 } 
 public String getInfo() { 
 return info; 
 } 
 public void setInfo(String info) { 
 this.info = info; 
 } 
} 

2。執行查詢語句:

清單 3。 查詢指定的描述信息

import com.ibatis.common.resources.Resources; 
import com.ibatis.sqlmap.client.SqlMapClIEnt; 
import com.ibatis.sqlmap.client.SqlMapClIEntBuilder; 
import com.ibm.db.Database; 
public String selectInfoByID(Serializable id){ 
 try{ 
 reader=Resources.getResourceAsReader(resource); 
 SqlMapClient sqlMap=SqlMapClientBuilder.buildSqlMapClIEnt(reader); 
 Description param=new Description(); 
 Description result=new Description(); 
 param.setId((Integer)id).intValue()); 
 result=(Description)sqlMap.queryForObject("selectInfo", param); 
 if(result!=null){ 
 return result.getInfo(); 
 } 
 else 
 return null; 
 } 
 catch(Exception e){ 
 e.printStackTrace(); 
 } 
 return null; 
} 

3。用 XSLT 作展示:

由於讀取出來的 XML 文檔是符合事先自定義的模板的, 因此,只要按照事先定義的模板結構進行展示就可以了,當然,開發者可以根據自身的模型特點,編寫不同的 XSLT 轉換樣式,使得展現的更加個性化,下面給出的是最通用的 XSLT 形式:

清單 4。 XSLT 個性化展示

<?XML version="1.0" encoding="gb2312"?> 
<xsl:stylesheet version="1.0" 
 XMLns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
 <xsl:output method="Html" encoding="gb2312" /> 
 <xsl:template match="/"> 
 <xsl:apply-templates select="/xsd:template/xsd:section"> 
 </xsl:apply-templates> 
 </xsl:template> 
 <xsl:template match="xsd:section"> 
 <table width="98%" border="0" cellpadding="0" cellspacing="1" class="xsltTable"> 
 <tr> 
 <td width="100%" align="left"> 
 <b> 
 <xsl:value-of select="@caption" /> 
 </b> 
 <xsl:apply-templates select="./xsd:component"> 
 </xsl:apply-templates> 
 </td> 
 </tr> 
 </table> 
 <br></br> 
 </xsl:template> 
 <xsl:template match="xsd:component"> 
 <table width="100%" border="0" cellpadding="0"> 
 <tr> 
 <td width="15%" align="left"> 
 <b> 
 <xsl:value-of select="@caption" /> 
 </b> 
 </td> 
 <td width="85%" align="left"> 
 <b> 
 <xsl:apply-templates select="./xsd:de"> 
 </xsl:apply-templates> 
 </b> 
 </td> 
 </tr> 
 </table> 
 </xsl:template> 
 <xsl:template match="xsd:de"> 
 <xsl:for-each select="."> 
 <strong> <xsl:value-of select="@caption" /></strong> 
 <font color="#00AAAA"> <xsl:value-of select="text()" /> </font> 
 </xsl:for-each> 
 <xsl:apply-templates select="xsd:de"> 
 </xsl:apply-templates> 
 </xsl:template> 
</xsl:stylesheet> 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved