AORM持久层框架的设计与实现

2016-01-27 06:24

李 春 梅

(安徽新华学院 信息工程学院,安徽 合肥 230088)



AORM持久层框架的设计与实现

李 春 梅

(安徽新华学院 信息工程学院,安徽 合肥 230088)

摘要:针对传统ORM(object-relational mapping)框架使用成本高、执行效率难以控制等缺点,结合软件开发过程中的实际要求,提出了AORM(adaptive object-relational mapping)持久层框架的设计方案。该方案以C#的反射机制为基础,综合考虑软件实际开发过程中的具体要求,结合多种数据库类型的语法特点,建立了以XML关系映射文件与自适应关系映射相结合的AORM持久层框架。与传统ORM框架相比,其最大的特点是将SQL语句独立于应用程序,非常有利于数据库结构的调整和优化。

关键词:AORM;ORM;对象关系映射;多种数据库类型;数据持久化

ORM系统作为中间件,将关系数据库中的数据以及数据关系转换成对象以及对象之间的关系[1],用于解决关系数据库与对象之间存在的互不匹配的现象[2]。就目前市面上常见的ORM框架来说,基本上都是提前建立数据表与实体类对象及其属性之间的映射关系[3],一方发生变化则另一方必须进行相应的变化,而且实体类库的变化则会导致整个系统的代码均需要做出修改[4],一变则全变,限制了系统的灵活性。AORM的中心思想是使数据库"适应"实体类库,而不是使实体类库依赖数据库结构。从而使得开发人员可以严格的按照对象模型以及状态机去编写软件,而无需考虑数据的存储格式以及存储方式, AORM则承担起对象模型(实体类)与持久化数据之间的转换,大大提高了系统的灵活性以及适用性。以下具体给出了AORM持久层框架的详细设计与实现过程。

1映射生成器的设计与实现

映射生成器负责管理数据结果集与实体类之间的映射关系[5],并且将映射关系以XML文件为载体存储在物理磁盘中,以便随时调用。映射关系可事先定义好,也可以在实体类首次被实例化时自动的创建其映射关系,并生成相应的XML文件进行存储[6],即实现自动化映射,降低了开发人员的学习难度。映射生成器操作类如图1所示。LoadMapping方法根据给定的映射文件存放路径以及实体类类型获取实体类的映射关系,BuildMapping方法则通过C#的反射机制,获取该实体类的可读写属性信息(包括继承的属性信息)[7],并与给定的数据列相互对照,提取二者匹配信息并生成映射关系文件(仅生成映射文件中的Properties小节的内容)。

映射关系映射文件结构如下所示:

〈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小节中的fulltypename标识实体类的全名称,tablename标识实对应的表/视图,version标识映射文件的版本,其余小节定义如下:

1) Properties小节:定义实体类的值类型属性以及继承自BaseEntity类的引用类型属性与数据列之间的对照关系。其中name对应实体类的属性,fieldname对应数据列的名称,primarykey标识当前的数据列是否为主键列,readonly标识是否为只读属性。实体类属性与数据列之间的数据类型转换是自动进行的(要求二者之间能够进行转换)。

2) Operations小节:定义实体类的扩展方法(除CURD之外的数据操作方法)。CRUD(creat/add, read, update, delete)操作为实体类的默认操作[8],Operations中定义的是更复杂的操作:如多表更新、查询以及使用存储过程的操作等,支持单数据集以及多数据集的数据填充。其中name标识操作的名称,具备唯一性。Param小节中的name对应sql中的参数名称或占位标识符,propertyname则表示若未给定参数时对应实体类的属性名。Result小节仅在返回多结果集时使用,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语句,提高用户系统的可维护性以及适用性等。事务的支持也是数据库适配器所必须具备的[12]。

如图3所示,数据库适配器通过一个适配器操作接口IDatabaseProvider以及一个适配器配置信息DataProviderConfiguration实现了多数据库的支持,同时也提供了一个数据库事务支持对象DatabaseTransaction用于数据库事务操作。不同的数据库适配器均实现了IDatabaseProvider接口,用户可以根据给定的操作条件执行数据库操作,使得用户可以无视具体的数据库种类,将具体的细节完全交与适配器进行完成。同时,适配器也提供了直接执行SQL语句的操作,使得适配器可以脱离AORM单独进行使用。

数据库适配器的接口函数CreateCommand用于生成符合数据库自身规则的SQL命令对象,有效地解决了多类型数据库的支持要求。

图3数据库适配器

4结束语

针对现行ORM软件的诸多缺点,从如何提高软件的开发效率、降低软件的复杂程度等方面作为出发点,以C#为开发环境,设计了一个基于XML配置的、可自动建立数据库与实体类映射关系的、支持多种数据库类型的AORM持久型框架。目前,AORM持久层框架已成功应用于美国某大型法律法规网站系统,一个站点同时提供了20多个州的法律法规站点服务(每个州均有一个后台数据库,结构不尽相同),就系统开发人员反馈以及目前网站的运行情况来说,达到了预期的要求和目标。

参考文献:

[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 轻量级开发框架的设计与实现[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