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