李 春 梅
(安徽新華學(xué)院 信息工程學(xué)院,安徽 合肥 230088)
?
AORM持久層框架的設(shè)計與實現(xiàn)
李 春 梅
(安徽新華學(xué)院 信息工程學(xué)院,安徽 合肥 230088)
摘要:針對傳統(tǒng)ORM(object-relational mapping)框架使用成本高、執(zhí)行效率難以控制等缺點,結(jié)合軟件開發(fā)過程中的實際要求,提出了AORM(adaptive object-relational mapping)持久層框架的設(shè)計方案。該方案以C#的反射機制為基礎(chǔ),綜合考慮軟件實際開發(fā)過程中的具體要求,結(jié)合多種數(shù)據(jù)庫類型的語法特點,建立了以XML關(guān)系映射文件與自適應(yīng)關(guān)系映射相結(jié)合的AORM持久層框架。與傳統(tǒng)ORM框架相比,其最大的特點是將SQL語句獨立于應(yīng)用程序,非常有利于數(shù)據(jù)庫結(jié)構(gòu)的調(diào)整和優(yōu)化。
關(guān)鍵詞:AORM;ORM;對象關(guān)系映射;多種數(shù)據(jù)庫類型;數(shù)據(jù)持久化
ORM系統(tǒng)作為中間件,將關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)以及數(shù)據(jù)關(guān)系轉(zhuǎn)換成對象以及對象之間的關(guān)系[1],用于解決關(guān)系數(shù)據(jù)庫與對象之間存在的互不匹配的現(xiàn)象[2]。就目前市面上常見的ORM框架來說,基本上都是提前建立數(shù)據(jù)表與實體類對象及其屬性之間的映射關(guān)系[3],一方發(fā)生變化則另一方必須進行相應(yīng)的變化,而且實體類庫的變化則會導(dǎo)致整個系統(tǒng)的代碼均需要做出修改[4],一變則全變,限制了系統(tǒng)的靈活性。AORM的中心思想是使數(shù)據(jù)庫"適應(yīng)"實體類庫,而不是使實體類庫依賴數(shù)據(jù)庫結(jié)構(gòu)。從而使得開發(fā)人員可以嚴格的按照對象模型以及狀態(tài)機去編寫軟件,而無需考慮數(shù)據(jù)的存儲格式以及存儲方式, AORM則承擔起對象模型(實體類)與持久化數(shù)據(jù)之間的轉(zhuǎn)換,大大提高了系統(tǒng)的靈活性以及適用性。以下具體給出了AORM持久層框架的詳細設(shè)計與實現(xiàn)過程。
1映射生成器的設(shè)計與實現(xiàn)
映射生成器負責管理數(shù)據(jù)結(jié)果集與實體類之間的映射關(guān)系[5],并且將映射關(guān)系以XML文件為載體存儲在物理磁盤中,以便隨時調(diào)用。映射關(guān)系可事先定義好,也可以在實體類首次被實例化時自動的創(chuàng)建其映射關(guān)系,并生成相應(yīng)的XML文件進行存儲[6],即實現(xiàn)自動化映射,降低了開發(fā)人員的學(xué)習難度。映射生成器操作類如圖1所示。LoadMapping方法根據(jù)給定的映射文件存放路徑以及實體類類型獲取實體類的映射關(guān)系,BuildMapping方法則通過C#的反射機制,獲取該實體類的可讀寫屬性信息(包括繼承的屬性信息)[7],并與給定的數(shù)據(jù)列相互對照,提取二者匹配信息并生成映射關(guān)系文件(僅生成映射文件中的Properties小節(jié)的內(nèi)容)。
映射關(guān)系映射文件結(jié)構(gòu)如下所示:
〈entity-mapping〉
〈class fulltypename="*" version="*" tablename=""〉
〈properties〉
〈property name="*" field-name="*" primarykey="true" readonly="true"/〉
〈property name="*" field-name="*"/〉
〈/properties〉
〈operations〉
〈operation name="" sqltype="0" sql="" returned="" 〉
〈params〉〈param name="" type="" propertyname="" isnullable=""/〉〈/params〉
〈results〉〈result Index="0" propertyname="*" /〉〈/results 〉
〈/operation〉
〈/operations〉
〈/class〉
〈/entity-mapping〉
圖1AORM映射關(guān)系生成器
其中class小節(jié)中的fulltypename標識實體類的全名稱,tablename標識實對應(yīng)的表/視圖,version標識映射文件的版本,其余小節(jié)定義如下:
1) Properties小節(jié):定義實體類的值類型屬性以及繼承自BaseEntity類的引用類型屬性與數(shù)據(jù)列之間的對照關(guān)系。其中name對應(yīng)實體類的屬性,fieldname對應(yīng)數(shù)據(jù)列的名稱,primarykey標識當前的數(shù)據(jù)列是否為主鍵列,readonly標識是否為只讀屬性。實體類屬性與數(shù)據(jù)列之間的數(shù)據(jù)類型轉(zhuǎn)換是自動進行的(要求二者之間能夠進行轉(zhuǎn)換)。
2) Operations小節(jié):定義實體類的擴展方法(除CURD之外的數(shù)據(jù)操作方法)。CRUD(creat/add, read, update, delete)操作為實體類的默認操作[8],Operations中定義的是更復(fù)雜的操作:如多表更新、查詢以及使用存儲過程的操作等,支持單數(shù)據(jù)集以及多數(shù)據(jù)集的數(shù)據(jù)填充。其中name標識操作的名稱,具備唯一性。Param小節(jié)中的name對應(yīng)sql中的參數(shù)名稱或占位標識符,propertyname則表示若未給定參數(shù)時對應(yīng)實體類的屬性名。Result小節(jié)僅在返回多結(jié)果集時使用,index為返回的記錄集順序,propertyname為對應(yīng)的實體類屬性名。
2對象存取器的設(shè)計與實現(xiàn)
對象存取器負責實體類與數(shù)據(jù)庫的交互任務(wù),包括數(shù)據(jù)的存儲以及讀取(見圖2)[9]。故此,AORM中的實體類也是有著一定的限制和要求:
1) 實體類必須繼承自基類BaseEntity,可對應(yīng)于數(shù)據(jù)庫中的數(shù)據(jù)表、視圖以及通過SQL語句或存儲過程等方式所取得的數(shù)據(jù)集;
2) 實體類的屬性的類型可以是實體類類型。
3) 實體類的屬性的類型可以是集合類型(Array,List或Dictionary類型等),但是其基類型必須繼承自BaseEntity的實體類類型。
對象的數(shù)據(jù)存取主要通過基類BaseEntity實現(xiàn),并且所有的操作都有著共同的操作步驟:
1) 獲取操作適配器名稱。一般有3種途徑:參數(shù)進行指定、類實例通過屬性DataProviderName進行設(shè)置以及在實體類定義中通過類的特性進行設(shè)定。
2) 獲取關(guān)系映射信息。根據(jù)已經(jīng)取得的適配器名稱取得適配器配置信息(DataProviderConfiguration),然后根據(jù)傳入的泛型或當前實體類類型以及映射文件存放基礎(chǔ)路徑(TemplatePath)調(diào)用映射管理器中的LoadMapping方法獲取映射關(guān)系信息。若映射文件不存在,并且預(yù)先設(shè)定了tablename,則會自動從數(shù)據(jù)庫中獲取數(shù)據(jù)列信息,調(diào)用BuildMapping方法生成關(guān)系映射文件。
圖2AORM對象存取器
3) 取得結(jié)果:將已經(jīng)取得的適配器配置信息作為參數(shù)調(diào)用數(shù)據(jù)庫適配器工廠類(DatabaseProviderFactory,見圖3)的GetDatabaseProvider方法獲取具體的適配器(實現(xiàn)了IDatabaseProvider接口并操作具體種類數(shù)據(jù)庫的適配器,如圖3中的MSSQLDatabaseProvider、MySQLDatabaseProvider、OracleDatabaseProvider等),然后根據(jù)映射文件中的操作定義調(diào)用CreateCommand方法生成具體的Command,之后再根據(jù)具體的操作要求調(diào)用不同的方法取得相應(yīng)的返回結(jié)果。
4) 實體類數(shù)據(jù)填充:根據(jù)已取得的數(shù)據(jù)結(jié)果以及實體類屬性關(guān)系映射信息,利用C#的反射機制進行數(shù)據(jù)填充,然后將填充后的對象返回。
數(shù)據(jù)操作分為基本操作以及擴展操作2大類[10]。其中基本操作包括Add,Save(含一個重載函數(shù)),Delete(含一個重載函數(shù))共5個操作,擴展操作包括GetData,GetList以及Execute共3個操作,所有操作中的object類型參數(shù)均為匿名類型,格式為鍵值對,用于指定參數(shù)名稱以及相應(yīng)的值。
3數(shù)據(jù)庫適配器的設(shè)計與實現(xiàn)
數(shù)據(jù)庫適配器的主要目的是實現(xiàn)實體類以及實體類的數(shù)據(jù)操作,與具體的數(shù)據(jù)庫及數(shù)據(jù)庫類型分離,使得實體類以及與實體類的相關(guān)操作具備數(shù)據(jù)庫無關(guān)性以及數(shù)據(jù)庫類型無關(guān)性[11],并且將所有與數(shù)據(jù)庫直接交互的操作均放到映射文件中進行定義,避免在代碼中出現(xiàn)SQL語句,提高用戶系統(tǒng)的可維護性以及適用性等。事務(wù)的支持也是數(shù)據(jù)庫適配器所必須具備的[12]。
如圖3所示,數(shù)據(jù)庫適配器通過一個適配器操作接口IDatabaseProvider以及一個適配器配置信息DataProviderConfiguration實現(xiàn)了多數(shù)據(jù)庫的支持,同時也提供了一個數(shù)據(jù)庫事務(wù)支持對象DatabaseTransaction用于數(shù)據(jù)庫事務(wù)操作。不同的數(shù)據(jù)庫適配器均實現(xiàn)了IDatabaseProvider接口,用戶可以根據(jù)給定的操作條件執(zhí)行數(shù)據(jù)庫操作,使得用戶可以無視具體的數(shù)據(jù)庫種類,將具體的細節(jié)完全交與適配器進行完成。同時,適配器也提供了直接執(zhí)行SQL語句的操作,使得適配器可以脫離AORM單獨進行使用。
數(shù)據(jù)庫適配器的接口函數(shù)CreateCommand用于生成符合數(shù)據(jù)庫自身規(guī)則的SQL命令對象,有效地解決了多類型數(shù)據(jù)庫的支持要求。
圖3數(shù)據(jù)庫適配器
4結(jié)束語
針對現(xiàn)行ORM軟件的諸多缺點,從如何提高軟件的開發(fā)效率、降低軟件的復(fù)雜程度等方面作為出發(fā)點,以C#為開發(fā)環(huán)境,設(shè)計了一個基于XML配置的、可自動建立數(shù)據(jù)庫與實體類映射關(guān)系的、支持多種數(shù)據(jù)庫類型的AORM持久型框架。目前,AORM持久層框架已成功應(yīng)用于美國某大型法律法規(guī)網(wǎng)站系統(tǒng),一個站點同時提供了20多個州的法律法規(guī)站點服務(wù)(每個州均有一個后臺數(shù)據(jù)庫,結(jié)構(gòu)不盡相同),就系統(tǒng)開發(fā)人員反饋以及目前網(wǎng)站的運行情況來說,達到了預(yù)期的要求和目標。
參考文獻:
[1] 張小鵯. 面向?qū)ο蠓治龇椒ǖ木C述[J]. 甘肅科技, 2010 (2): 44-47.
[2] 王永誠, 蘇逸倫. 深入淺出談ORM [J]. 中華技術(shù), 2010 (88): 108-115.
[3] Mata-Toledo R, Monger M. Utilizing the ADO. NET entity framework in database courses[J]. Journal of Computing Sciences in Colleges, 2011, 26(3): 93-97.
[4] 盧小垂. 基于. Net 平臺的 ORM 輕量級開發(fā)框架的設(shè)計與實現(xiàn)[J]. 電信快報: 網(wǎng)絡(luò)與通信, 2012 (10): 10-16.
[5] 李杰. 基于 ORM 的輕量級數(shù)據(jù)持久化技術(shù)研究及應(yīng)用[J]. 計算機科學(xué), 2010, 37(9): 190-193.
[6] Zhang Z Y, Chang S G, Ding T F. Research on the Dynamic Integrating with Heterogeneous Database System Based XML and Hibernate[J]. Applied Mechanics and Materials, 2013(263): 1717-1720.
[7] Pop D P. Designing An Object Relation Mapping System In Php[J]. Journal of Information Systems & Operations Management, 2011, 5(1): 207-212.
[8] 梁伍七. Hibernate 中關(guān)聯(lián)關(guān)系映射策略研究與實現(xiàn)[J]. 安徽廣播電視大學(xué)學(xué)報, 2012 (3): 117-120.
[9] 譚瑩宇. 基于 Hibernate JPA 和 JQuery 框架的數(shù)據(jù)查詢研究與實現(xiàn)[J].計算機與現(xiàn)代化, 2012 (1): 196-198.
[10] Troelsen A. Type Reflection, Late Binding, and Attribute-Based Programming[M].Pro C# 5.0 and the. NET 4.5 Framework. Apress, 2012: 555-598.
[11] 張美玲. 增量預(yù)取技術(shù)在持久化框架中的研究與應(yīng)用[D]. 青島:中國海洋大學(xué), 2010.
[12] Cain III H W, Dillenberger D N, Hack M H T, et al. Database system transaction management: U.S. Patent Application 13/435,281[P]. 2012-3-30.
Design and Implementation of AORM Persistence Layer Framework
LI Chun-mei
(School of Information Engineering, Anhui Xinhua University, Hefei 230088, China)
Abstract:Aiming at the disadvantages of traditional ORM(object-relational mapping) framework such as high cost and difficult to control, combined with the actual process of software development requirements, a AORM (adaptive object-relational mapping) persistence framework was proposed. This framework is based on the reflection mechanism in C#, considering the specific requirements at actual software development process, combined with the grammatical features of multiple database types, established the persistence framework, which integrates the XML-relation mapping files and auto-relational mapping method. Compared with the traditional ORM framework, the application-independent SQL statements is the biggest feature, and very beneficial to adjust and optimize the database structure.
Key words:AORM, ORM, object-relational mapping, multiple database types, data persistence
中圖分類號:TP319
文獻標識碼:A
文章編號:1007-4260(2015)01-0071-05
DOI:10.13757/j.cnki.cn34-1150/n.2015.01.020
作者簡介:李春梅, 女, 安徽滁州人, 碩士,安徽新華學(xué)院信息工程學(xué)院講師,主要研究方向為計算機軟件技術(shù)。
收稿日期:2014-07-09