張艷明,檀 明,鄒 樂
(合肥學(xué)院 網(wǎng)絡(luò)與智能信息處理重點實驗室,合肥 230601)
數(shù)據(jù)是一個應(yīng)用系統(tǒng)的核心,應(yīng)用系統(tǒng)所有功能的運行都依賴于數(shù)據(jù)的支持。企業(yè)級JavaEE應(yīng)用系統(tǒng)大多使用數(shù)據(jù)庫技術(shù)來存儲應(yīng)用系統(tǒng)的數(shù)據(jù),數(shù)據(jù)訪問層則是應(yīng)用系統(tǒng)中運行數(shù)據(jù)和數(shù)據(jù)庫中存儲數(shù)據(jù)之間的交互,主要包括數(shù)據(jù)的查詢、添加、修改和刪除等操作。
本文在分析JavaEE應(yīng)用系統(tǒng)現(xiàn)有數(shù)據(jù)訪問層解決方案的基礎(chǔ)上,提出一種輕量級、可重用的數(shù)據(jù)訪問層組件實現(xiàn)方案,并應(yīng)用于合肥學(xué)院高校實驗室管理平臺項目。該方案可用于構(gòu)建企業(yè)級應(yīng)用系統(tǒng)中的數(shù)據(jù)訪問層,具有實際意義和價值。
根據(jù)軟件分層設(shè)計思想的指導(dǎo),JavaEE應(yīng)用通常被劃分為四個層次:表示層、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問層和數(shù)據(jù)庫層。其中,數(shù)據(jù)訪問層[1]是在對象/關(guān)系數(shù)據(jù)庫之間提供一個成功的企業(yè)級別的映射解決方案。它代表系統(tǒng)中一個相對獨立、界限明確的邏輯層次,創(chuàng)建一個集成數(shù)據(jù)庫存取邏輯的門戶,屏蔽對底層數(shù)據(jù)庫訪問的依賴性以及不同數(shù)據(jù)庫之間的差異性[2],向開發(fā)人員提供透明的數(shù)據(jù)持久化機制。數(shù)據(jù)訪問層由業(yè)務(wù)邏輯層通過接口調(diào)用,使系統(tǒng)以更松散的形式耦合,較好地達到易于維護和擴展的目標(biāo)[3]。
目前數(shù)據(jù)訪問層的實現(xiàn)有多種解決方案,如JDBC、EJB、ORM 等[4]。JDBC是最原始的數(shù)據(jù)訪問方法,在程序中直接編寫SQL語句進行數(shù)據(jù)庫存取,存在開發(fā)效率低下的問題。EJB實體Bean采用CMP管理策略,封裝數(shù)據(jù)訪問細(xì)節(jié),開發(fā)人員不必編寫SQL語句,但EJB實體Bean必須運行在EJB容器之中,運行環(huán)境受限,開發(fā)難度也較大。ORM(Object-Relation Mapping,對象關(guān)系映射)是目前廣泛采用的一種數(shù)據(jù)訪問層實現(xiàn)方案,Hibernate作為其中的代表者,對JDBC做了輕量級的封裝,提高了程序員開發(fā)效率,但Hibernate的設(shè)計過于靈活,運用不慎反而會導(dǎo)致程序運行效率低下。
XML具有自描述的特征,XML數(shù)據(jù)已經(jīng)成為互聯(lián)網(wǎng)上流行的數(shù)據(jù)表示格式以及應(yīng)用系統(tǒng)中數(shù)據(jù)交換的開放標(biāo)準(zhǔn)[5-6]?;赬ML-關(guān)系映射數(shù)據(jù)訪問層利用Java與XML技術(shù)相結(jié)合的優(yōu)勢,采用XML作為數(shù)據(jù)訪問層的數(shù)據(jù)交互格式,提供一種XML格式數(shù)據(jù)與關(guān)系數(shù)據(jù)之間的映射轉(zhuǎn)換方法,實現(xiàn)高效的數(shù)據(jù)庫操作。
基于XML-關(guān)系映射數(shù)據(jù)訪問層主要包括數(shù)據(jù)庫模型組件、數(shù)據(jù)訪問控制組件和SQL動態(tài)構(gòu)建組件。數(shù)據(jù)庫模型組件負(fù)責(zé)針對關(guān)系數(shù)據(jù)庫中的表、視圖等數(shù)據(jù)結(jié)構(gòu)進行建模,構(gòu)建一組數(shù)據(jù)庫模型類用以描述表名稱、字段屬性以及表之間關(guān)聯(lián)關(guān)系等。數(shù)據(jù)庫訪問控制組件和SQL動態(tài)構(gòu)建組件負(fù)責(zé)在系統(tǒng)運行階段,根據(jù)數(shù)據(jù)庫模型組件封裝的元數(shù)據(jù)信息,結(jié)合輸入的XML格式數(shù)據(jù),動態(tài)構(gòu)造出數(shù)據(jù)庫存取訪問的SQL語句,自動完成數(shù)據(jù)庫增刪改查操作。該數(shù)據(jù)訪問層支持XML到數(shù)據(jù)庫以及數(shù)據(jù)庫查詢結(jié)果到XML之間的雙向映射轉(zhuǎn)換,位于數(shù)據(jù)庫層和業(yè)務(wù)層之間,總體架構(gòu)如圖1所示。
通過PowerDesigner工具提供的API接口,對設(shè)計階段生成的數(shù)據(jù)庫物理模型進行編程,生成用以描述數(shù)據(jù)庫結(jié)構(gòu)信息的一個XML文件。啟動運行時,由系統(tǒng)引擎對該XML文件進行解析,構(gòu)建數(shù)據(jù)庫模型組件。
以合肥學(xué)院高校實驗室管理平臺中的實驗室表和實驗室人員表(主從關(guān)系)為例,其數(shù)據(jù)庫物理模型(部分)如下所示:
其生成的數(shù)據(jù)庫描述XML文件部分內(nèi)容如下:
以上XML內(nèi)容描述了數(shù)據(jù)庫“實驗室表”sys_sys和“實驗室人員表”sys_sysry的基本結(jié)構(gòu),包括字段信息和表關(guān)聯(lián)信息等。其中,“實驗室表”中的字段“所屬實驗室”fk_sys_sssys_i為外鍵字段,參照“實驗室表”sys_sys的主鍵,cascade=“0”表示針對主表sys_sys進行更新操作時不級聯(lián)更新從表sys_sysry。XML文件中的其他描述信息,primary代表是否為主鍵,foreignkey代表是否為外鍵,mandatory代表是否允許為空,datatype代表數(shù)據(jù)類型。
針對數(shù)據(jù)庫描述XML文件,系統(tǒng)運行時自動解析生成的數(shù)據(jù)庫模型組件包括DataBaseTable、Data-BaseColumn等。DataBaseTable類封裝一張表的基本信息,DataBaseColunmn類封裝一個表字段的基本信息。
數(shù)據(jù)訪問控制組件負(fù)責(zé)XML格式數(shù)據(jù)與關(guān)系數(shù)據(jù)之間的映射轉(zhuǎn)換,支持在一個XML文檔中包含多個表的數(shù)據(jù)。表之間可以是主從關(guān)系,主從關(guān)系可以嵌套。針對增刪改等更新操作,將業(yè)務(wù)層傳遞過來的XML格式數(shù)據(jù)持久化進關(guān)系數(shù)據(jù)庫,針對查詢操作,對數(shù)據(jù)庫查詢返回的結(jié)果集轉(zhuǎn)換為XML格式數(shù)據(jù)。
數(shù)據(jù)訪問控制組件的主要方法如表1。
表1 數(shù)據(jù)訪問控制組件主要方法描述
以添加實驗室及實驗室所屬人員的操作為例,下面是描述信息添加的XML部分?jǐn)?shù)據(jù)內(nèi)容。
definition屬性action定義具體操作,“0”代表插入操作。以上XML內(nèi)容表示向數(shù)據(jù)庫“實驗室表”sys_sys添加一條實驗室基本信息,同時向“實驗室人員表”sys_sysry添加兩條實驗室所屬人員信息。文檔元素名與數(shù)據(jù)表名一致,元素屬性名與表字段名稱一致。
數(shù)據(jù)訪問控制組件的xmlDataToDB方法采用DOM4J技術(shù),遍歷XML文檔樹節(jié)點數(shù)據(jù),利用遞歸算法完成對主從表的數(shù)據(jù)添加。部分代碼片段如下:
其中,executeInsertSQL方法負(fù)責(zé)動態(tài)生成具體的插入SQL語句,完成對數(shù)據(jù)庫的實際更新。該方法由SQL動態(tài)構(gòu)建組件提供。
數(shù)據(jù)訪問控制組件的運行依賴于SQL動態(tài)構(gòu)建組件。SQL動態(tài)構(gòu)建組件調(diào)用底層JDBC函數(shù),完成具體的數(shù)據(jù)庫操作,主要包括executeInsertSQL、executeUpdateSQL、executeDeleteSQL、execute-QuerySQL等方法。該組件的實現(xiàn)重點是能夠支持大部分可用JDBC訪問的數(shù)據(jù)庫,支持字符串形式的XML元素屬性值與關(guān)系數(shù)據(jù)庫表不同類型字段之間的映射,支持大尺寸數(shù)據(jù)字段,支持事務(wù)控制。
以執(zhí)行添加SQL語句的executeInsertSQL方法為例,動態(tài)SQL語句生成組件利用一個List保存XML文檔樹當(dāng)前元素的所有屬性對象,代表要插入數(shù)據(jù)表的一組字段對象,利用另一個List保存各字段在數(shù)據(jù)表中的實際類型值。表字段的實際類型可通過數(shù)據(jù)庫模型組件獲得,數(shù)據(jù)庫模型組件封裝了數(shù)據(jù)庫描述XML文件的所有相關(guān)信息,包括具體字段類型。之后,組件從兩個List中逐一取出數(shù)據(jù),根據(jù)具體字段類型,調(diào)用JDBC底層函數(shù)完成相應(yīng)賦值。在這一過程中,SQL動態(tài)構(gòu)建組件會調(diào)用數(shù)據(jù)庫方言工廠類方法獲取具體數(shù)據(jù)庫方言,針對不同數(shù)據(jù)庫構(gòu)造特定的SQL實現(xiàn)。
本文在分析JavaEE應(yīng)用系統(tǒng)現(xiàn)有數(shù)據(jù)訪問層技術(shù)的基礎(chǔ)上,提出一種基于XML-關(guān)系數(shù)據(jù)映射和轉(zhuǎn)換的數(shù)據(jù)訪問層組件實現(xiàn)方案,實現(xiàn)數(shù)據(jù)訪問和業(yè)務(wù)邏輯相分離,使系統(tǒng)層次清晰,具有較好的靈活性和可擴展性。在此基礎(chǔ)上,通過合肥學(xué)院高校實驗室管理平臺項目闡述了關(guān)鍵技術(shù)和實現(xiàn)方法。該系統(tǒng)在實際運行中性能穩(wěn)定,效果良好。
[1] 〔美〕理查德·森.POJOS in action(中文版):用輕量級框架開發(fā)企業(yè)應(yīng)用[M].李琳驍,王海龍,譯.北京:電子工業(yè)出版社,2007:95-148.
[2] 王合闖,盧涵宇.數(shù)據(jù)訪問模型和數(shù)據(jù)訪問層構(gòu)造器的設(shè)計與實現(xiàn)[J].微電子學(xué)與計算機,2011,28(5):1-3.
[3] 堯怡隴,葉松.基于接口多層架構(gòu)的 WTTVS實時監(jiān)控管理系統(tǒng)設(shè)計[J].計算機應(yīng)用與軟件,2014,31(6):29-31.
[4] 徐世友,袁兆山.Java EE數(shù)據(jù)持久層解決方案的設(shè)計與實現(xiàn)[J].合肥工業(yè)大學(xué)學(xué)報:自然科學(xué)版,2009,32(1):47-50.
[5] 洪欣.XML模式到關(guān)系模式的遞歸結(jié)構(gòu)映射算法[J].蘭州理工大學(xué)學(xué)報,2012,38(1):94-97.
[6] 成炳花,劉金廣.在B/S網(wǎng)絡(luò)系統(tǒng)中應(yīng)用 XML技術(shù)的研究[J].武漢理工大學(xué)學(xué)報,2010,32(22):209-212.