李 春 梅
(安徽新華學(xué)院 信息工程學(xué)院,安徽 合肥 230088)
?
AORM持久層框架的設(shè)計(jì)與實(shí)現(xiàn)
李 春 梅
(安徽新華學(xué)院 信息工程學(xué)院,安徽 合肥 230088)
摘要:針對(duì)傳統(tǒng)ORM(object-relational mapping)框架使用成本高、執(zhí)行效率難以控制等缺點(diǎn),結(jié)合軟件開(kāi)發(fā)過(guò)程中的實(shí)際要求,提出了AORM(adaptive object-relational mapping)持久層框架的設(shè)計(jì)方案。該方案以C#的反射機(jī)制為基礎(chǔ),綜合考慮軟件實(shí)際開(kāi)發(fā)過(guò)程中的具體要求,結(jié)合多種數(shù)據(jù)庫(kù)類型的語(yǔ)法特點(diǎn),建立了以XML關(guān)系映射文件與自適應(yīng)關(guān)系映射相結(jié)合的AORM持久層框架。與傳統(tǒng)ORM框架相比,其最大的特點(diǎn)是將SQL語(yǔ)句獨(dú)立于應(yīng)用程序,非常有利于數(shù)據(jù)庫(kù)結(jié)構(gòu)的調(diào)整和優(yōu)化。
關(guān)鍵詞:AORM;ORM;對(duì)象關(guān)系映射;多種數(shù)據(jù)庫(kù)類型;數(shù)據(jù)持久化
ORM系統(tǒng)作為中間件,將關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)以及數(shù)據(jù)關(guān)系轉(zhuǎn)換成對(duì)象以及對(duì)象之間的關(guān)系[1],用于解決關(guān)系數(shù)據(jù)庫(kù)與對(duì)象之間存在的互不匹配的現(xiàn)象[2]。就目前市面上常見(jiàn)的ORM框架來(lái)說(shuō),基本上都是提前建立數(shù)據(jù)表與實(shí)體類對(duì)象及其屬性之間的映射關(guān)系[3],一方發(fā)生變化則另一方必須進(jìn)行相應(yīng)的變化,而且實(shí)體類庫(kù)的變化則會(huì)導(dǎo)致整個(gè)系統(tǒng)的代碼均需要做出修改[4],一變則全變,限制了系統(tǒng)的靈活性。AORM的中心思想是使數(shù)據(jù)庫(kù)"適應(yīng)"實(shí)體類庫(kù),而不是使實(shí)體類庫(kù)依賴數(shù)據(jù)庫(kù)結(jié)構(gòu)。從而使得開(kāi)發(fā)人員可以嚴(yán)格的按照對(duì)象模型以及狀態(tài)機(jī)去編寫(xiě)軟件,而無(wú)需考慮數(shù)據(jù)的存儲(chǔ)格式以及存儲(chǔ)方式, AORM則承擔(dān)起對(duì)象模型(實(shí)體類)與持久化數(shù)據(jù)之間的轉(zhuǎn)換,大大提高了系統(tǒng)的靈活性以及適用性。以下具體給出了AORM持久層框架的詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)過(guò)程。
1映射生成器的設(shè)計(jì)與實(shí)現(xiàn)
映射生成器負(fù)責(zé)管理數(shù)據(jù)結(jié)果集與實(shí)體類之間的映射關(guān)系[5],并且將映射關(guān)系以XML文件為載體存儲(chǔ)在物理磁盤(pán)中,以便隨時(shí)調(diào)用。映射關(guān)系可事先定義好,也可以在實(shí)體類首次被實(shí)例化時(shí)自動(dòng)的創(chuàng)建其映射關(guān)系,并生成相應(yīng)的XML文件進(jìn)行存儲(chǔ)[6],即實(shí)現(xiàn)自動(dòng)化映射,降低了開(kāi)發(fā)人員的學(xué)習(xí)難度。映射生成器操作類如圖1所示。LoadMapping方法根據(jù)給定的映射文件存放路徑以及實(shí)體類類型獲取實(shí)體類的映射關(guān)系,BuildMapping方法則通過(guò)C#的反射機(jī)制,獲取該實(shí)體類的可讀寫(xiě)屬性信息(包括繼承的屬性信息)[7],并與給定的數(shù)據(jù)列相互對(duì)照,提取二者匹配信息并生成映射關(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標(biāo)識(shí)實(shí)體類的全名稱,tablename標(biāo)識(shí)實(shí)對(duì)應(yīng)的表/視圖,version標(biāo)識(shí)映射文件的版本,其余小節(jié)定義如下:
1) Properties小節(jié):定義實(shí)體類的值類型屬性以及繼承自BaseEntity類的引用類型屬性與數(shù)據(jù)列之間的對(duì)照關(guān)系。其中name對(duì)應(yīng)實(shí)體類的屬性,fieldname對(duì)應(yīng)數(shù)據(jù)列的名稱,primarykey標(biāo)識(shí)當(dāng)前的數(shù)據(jù)列是否為主鍵列,readonly標(biāo)識(shí)是否為只讀屬性。實(shí)體類屬性與數(shù)據(jù)列之間的數(shù)據(jù)類型轉(zhuǎn)換是自動(dòng)進(jìn)行的(要求二者之間能夠進(jìn)行轉(zhuǎn)換)。
2) Operations小節(jié):定義實(shí)體類的擴(kuò)展方法(除CURD之外的數(shù)據(jù)操作方法)。CRUD(creat/add, read, update, delete)操作為實(shí)體類的默認(rèn)操作[8],Operations中定義的是更復(fù)雜的操作:如多表更新、查詢以及使用存儲(chǔ)過(guò)程的操作等,支持單數(shù)據(jù)集以及多數(shù)據(jù)集的數(shù)據(jù)填充。其中name標(biāo)識(shí)操作的名稱,具備唯一性。Param小節(jié)中的name對(duì)應(yīng)sql中的參數(shù)名稱或占位標(biāo)識(shí)符,propertyname則表示若未給定參數(shù)時(shí)對(duì)應(yīng)實(shí)體類的屬性名。Result小節(jié)僅在返回多結(jié)果集時(shí)使用,index為返回的記錄集順序,propertyname為對(duì)應(yīng)的實(shí)體類屬性名。
2對(duì)象存取器的設(shè)計(jì)與實(shí)現(xiàn)
對(duì)象存取器負(fù)責(zé)實(shí)體類與數(shù)據(jù)庫(kù)的交互任務(wù),包括數(shù)據(jù)的存儲(chǔ)以及讀取(見(jiàn)圖2)[9]。故此,AORM中的實(shí)體類也是有著一定的限制和要求:
1) 實(shí)體類必須繼承自基類BaseEntity,可對(duì)應(yīng)于數(shù)據(jù)庫(kù)中的數(shù)據(jù)表、視圖以及通過(guò)SQL語(yǔ)句或存儲(chǔ)過(guò)程等方式所取得的數(shù)據(jù)集;
2) 實(shí)體類的屬性的類型可以是實(shí)體類類型。
3) 實(shí)體類的屬性的類型可以是集合類型(Array,List或Dictionary類型等),但是其基類型必須繼承自BaseEntity的實(shí)體類類型。
對(duì)象的數(shù)據(jù)存取主要通過(guò)基類BaseEntity實(shí)現(xiàn),并且所有的操作都有著共同的操作步驟:
1) 獲取操作適配器名稱。一般有3種途徑:參數(shù)進(jìn)行指定、類實(shí)例通過(guò)屬性DataProviderName進(jìn)行設(shè)置以及在實(shí)體類定義中通過(guò)類的特性進(jìn)行設(shè)定。
2) 獲取關(guān)系映射信息。根據(jù)已經(jīng)取得的適配器名稱取得適配器配置信息(DataProviderConfiguration),然后根據(jù)傳入的泛型或當(dāng)前實(shí)體類類型以及映射文件存放基礎(chǔ)路徑(TemplatePath)調(diào)用映射管理器中的LoadMapping方法獲取映射關(guān)系信息。若映射文件不存在,并且預(yù)先設(shè)定了tablename,則會(huì)自動(dòng)從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)列信息,調(diào)用BuildMapping方法生成關(guān)系映射文件。
圖2AORM對(duì)象存取器
3) 取得結(jié)果:將已經(jīng)取得的適配器配置信息作為參數(shù)調(diào)用數(shù)據(jù)庫(kù)適配器工廠類(DatabaseProviderFactory,見(jiàn)圖3)的GetDatabaseProvider方法獲取具體的適配器(實(shí)現(xiàn)了IDatabaseProvider接口并操作具體種類數(shù)據(jù)庫(kù)的適配器,如圖3中的MSSQLDatabaseProvider、MySQLDatabaseProvider、OracleDatabaseProvider等),然后根據(jù)映射文件中的操作定義調(diào)用CreateCommand方法生成具體的Command,之后再根據(jù)具體的操作要求調(diào)用不同的方法取得相應(yīng)的返回結(jié)果。
4) 實(shí)體類數(shù)據(jù)填充:根據(jù)已取得的數(shù)據(jù)結(jié)果以及實(shí)體類屬性關(guān)系映射信息,利用C#的反射機(jī)制進(jìn)行數(shù)據(jù)填充,然后將填充后的對(duì)象返回。
數(shù)據(jù)操作分為基本操作以及擴(kuò)展操作2大類[10]。其中基本操作包括Add,Save(含一個(gè)重載函數(shù)),Delete(含一個(gè)重載函數(shù))共5個(gè)操作,擴(kuò)展操作包括GetData,GetList以及Execute共3個(gè)操作,所有操作中的object類型參數(shù)均為匿名類型,格式為鍵值對(duì),用于指定參數(shù)名稱以及相應(yīng)的值。
3數(shù)據(jù)庫(kù)適配器的設(shè)計(jì)與實(shí)現(xiàn)
數(shù)據(jù)庫(kù)適配器的主要目的是實(shí)現(xiàn)實(shí)體類以及實(shí)體類的數(shù)據(jù)操作,與具體的數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)類型分離,使得實(shí)體類以及與實(shí)體類的相關(guān)操作具備數(shù)據(jù)庫(kù)無(wú)關(guān)性以及數(shù)據(jù)庫(kù)類型無(wú)關(guān)性[11],并且將所有與數(shù)據(jù)庫(kù)直接交互的操作均放到映射文件中進(jìn)行定義,避免在代碼中出現(xiàn)SQL語(yǔ)句,提高用戶系統(tǒng)的可維護(hù)性以及適用性等。事務(wù)的支持也是數(shù)據(jù)庫(kù)適配器所必須具備的[12]。
如圖3所示,數(shù)據(jù)庫(kù)適配器通過(guò)一個(gè)適配器操作接口IDatabaseProvider以及一個(gè)適配器配置信息DataProviderConfiguration實(shí)現(xiàn)了多數(shù)據(jù)庫(kù)的支持,同時(shí)也提供了一個(gè)數(shù)據(jù)庫(kù)事務(wù)支持對(duì)象DatabaseTransaction用于數(shù)據(jù)庫(kù)事務(wù)操作。不同的數(shù)據(jù)庫(kù)適配器均實(shí)現(xiàn)了IDatabaseProvider接口,用戶可以根據(jù)給定的操作條件執(zhí)行數(shù)據(jù)庫(kù)操作,使得用戶可以無(wú)視具體的數(shù)據(jù)庫(kù)種類,將具體的細(xì)節(jié)完全交與適配器進(jìn)行完成。同時(shí),適配器也提供了直接執(zhí)行SQL語(yǔ)句的操作,使得適配器可以脫離AORM單獨(dú)進(jìn)行使用。
數(shù)據(jù)庫(kù)適配器的接口函數(shù)CreateCommand用于生成符合數(shù)據(jù)庫(kù)自身規(guī)則的SQL命令對(duì)象,有效地解決了多類型數(shù)據(jù)庫(kù)的支持要求。
圖3數(shù)據(jù)庫(kù)適配器
4結(jié)束語(yǔ)
針對(duì)現(xiàn)行ORM軟件的諸多缺點(diǎn),從如何提高軟件的開(kāi)發(fā)效率、降低軟件的復(fù)雜程度等方面作為出發(fā)點(diǎn),以C#為開(kāi)發(fā)環(huán)境,設(shè)計(jì)了一個(gè)基于XML配置的、可自動(dòng)建立數(shù)據(jù)庫(kù)與實(shí)體類映射關(guān)系的、支持多種數(shù)據(jù)庫(kù)類型的AORM持久型框架。目前,AORM持久層框架已成功應(yīng)用于美國(guó)某大型法律法規(guī)網(wǎng)站系統(tǒng),一個(gè)站點(diǎn)同時(shí)提供了20多個(gè)州的法律法規(guī)站點(diǎn)服務(wù)(每個(gè)州均有一個(gè)后臺(tái)數(shù)據(jù)庫(kù),結(jié)構(gòu)不盡相同),就系統(tǒng)開(kāi)發(fā)人員反饋以及目前網(wǎng)站的運(yùn)行情況來(lái)說(shuō),達(dá)到了預(yù)期的要求和目標(biāo)。
參考文獻(xiàn):
[1] 張小鵯. 面向?qū)ο蠓治龇椒ǖ木C述[J]. 甘肅科技, 2010 (2): 44-47.
[2] 王永誠(chéng), 蘇逸倫. 深入淺出談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 平臺(tái)的 ORM 輕量級(jí)開(kāi)發(fā)框架的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電信快報(bào): 網(wǎng)絡(luò)與通信, 2012 (10): 10-16.
[5] 李杰. 基于 ORM 的輕量級(jí)數(shù)據(jù)持久化技術(shù)研究及應(yīng)用[J]. 計(jì)算機(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)系映射策略研究與實(shí)現(xiàn)[J]. 安徽廣播電視大學(xué)學(xué)報(bào), 2012 (3): 117-120.
[9] 譚瑩宇. 基于 Hibernate JPA 和 JQuery 框架的數(shù)據(jù)查詢研究與實(shí)現(xiàn)[J].計(jì)算機(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]. 青島:中國(guó)海洋大學(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
中圖分類號(hào):TP319
文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1007-4260(2015)01-0071-05
DOI:10.13757/j.cnki.cn34-1150/n.2015.01.020
作者簡(jiǎn)介:李春梅, 女, 安徽滁州人, 碩士,安徽新華學(xué)院信息工程學(xué)院講師,主要研究方向?yàn)橛?jì)算機(jī)軟件技術(shù)。
收稿日期:2014-07-09