轻量级ORM数据访问框架SqlBuilder.NET的设计与实现

2018-09-10 13:18温皓晴靳晓松
计算机与网络 2018年3期

温皓晴 靳晓松

摘要:基于ORM思想,结合Nhibernate与NBear的优点,提出了一种轻量级ORM数据访问框架SqlBuilder.NET,旨在为通用数据访问提供完整的解决方案。Sqlbuilder.NET基于C#语言编写,主要由OracleSqlBuilder、DBOperation和SqlObjectMarker构成。Sqlbuilder.NET具有一个事务一个日志列表、特殊字符的编解码、查询结果多种类型输出和组件间的松耦合的特性,实现了数据新增、更新的对象化操作及对象化的复杂查询语句生成等功能。

关键词:SqlBuilder.NET;数据访问;ORM;NHibernate;Nbear

中图分类号:TP393文献标志码:A文章编号:1008-1739(2018)03-70-3

Design and Implementation of Lightweight ORM Data Access Framework SqlBuilder.NET

WEN Haoqing1, JIN Xiaosong2

(1. The No.2 High School Shijiazhuang, Shijiazhuang Hebei 050000, China; 2. The 54th Research Institute of CETC, Shijiazhuang Hebei 050081, China)

0引言

在應用软件项目开发中,数据访问必不可少。为了便于系统的开发维护,根据“高内聚、低耦合”的思想,通过分离数据访问层与业务逻辑层实现。因此,可以设计独立的数据访问构件,在不同的项目中复用。

目前比较流行的.NET数据访问ORM框架有Nhibernate、Spring.NET及Nbear等[1-3],通过项目实践发现,这些框架在实现其高扩展性、快速开发及良好的通用性的同时,也会失去一定的灵活性和性能,显得过于臃肿,这正是Sqlbuilder.NET产生的原因。

1主流数据访问ORM框架比较

在SqlBuilder.NET设计前,先对现有主流.NET平台下的ORM框架进行分析:

①Nhibernate:完整的ORM框架[4],功能强大、通用性强,而且有很多辅助工具;缺点就是配置比较多、性能低,执行效率不理想。

②NBear:完整的ORM框架,实现了强类型数据库查询语法[5],提供代码生成工具,性能较高;缺点是配置复杂,开发时很容易出错,最关键的是框架很久未更新。

③IBatis:优点是简单、实用、功能完整、效率高及运行稳定,SQL和代码分离,提高了可维护性;缺点是配置文件多,查询条件麻烦[6]。

2 SqlBuilder.NET的设计思想

通过经验总结不难发现,数据库的写操作中Insert、Update和Delete一般为单表操作,读操作Select经常会有联表操作,形式多样,因此在设计框架时,写操作可以采用对象操作的方式实现数据库的操作,例如,Insert.Object(User)就可以将User对象的数据写入到数据表中。读操作则分为2种情况,一种是在事务操作中需要返回对象类型或对象数组类型,便于业务逻辑编码;另一种则只是为了将数据显示给用户,只需返回非对象数据类型。

因此,Sqlbuilder.NET在基于ORM思想的同时,结合了Nhibernate与NBear的优点,既实现了Nhibernate类似Save(Object)插入数据的简便操作,又实现了类似NBear对复杂查询语句的对象化操作,甚至在复杂语句的支持度上比NBear还要强大。由于目前开发针对的都是Oracle数据库,因此SQL语句对象化方面针对Oracle写了很多函数,可以使用Oracle的很多特性。

3 SqlBuilder.NET的构成

Sqlbuilder.NET是基于C#语言编写的轻量级对象化ORM数据访问构件,实现了类似LINQ的数据库查询语法,可以像使用一个.NET类的方法一样生成SQL语句并访问数据库,由项目驱动开发而成,通过不断地重构和增加功能,目前已经趋于稳定。

Sqlbuilder.NET没有XML映射文件,在性能与开发效率上做了一定的取舍,但是对性能的影响并不是很大。另外SqlBuilder.NET的设计思想避免了对象间的复杂关系,因此,Sqlbuilder.NET虽然牺牲了一定的开发效率,却在性能上带来了质的飞跃。

Sqlbuilder.NET主要由以下三部分组成:

①OracleSqlbuilder:采用对象的形式生成标准SQL语句,此组件包含了Oracle数据库的一些特性函数,例如“FOR UPDATE”锁机制;

②DBOpertion:目前实现了对Oracle、SqlServer、MySql和Access数据库的增删改查(查询包括分页查询)、事务及存储过程等操作,可以通过XML配置文件实现数据库的切换,而无需更改代码;

③SqlObjectMarker:主要是将数据库的表生成为C#实体对象,其中表字段对应对象的属性,还有用于OracleSqlbuilder构建SQL语句的特殊字段。

4 SqlBuilder.NET的特性

SqlBuilder.NET在具有部分ORM框架的特性(事务、异常)的同时,还具有以下特性:

①一个事务一个日志列表:大部分ORM框架的日志系统都是链式的,没有分组,而SqlBuilder.NET则会一个事务对应一个SQL列表,SQL列表中包含SQL执行后影响的行数或者返回结果的行数,提供了日志接口,可以根据系统需求写入数据库或者文件中。

②特殊字符的编解码:SqlOracleSqlBuilder在生成SQL语句时会对数据中的特殊字符进行编码,在DBOpertion访问数据库返回数据时进行解码。不仅保证了用户的输入意愿,同时防止了危险字符对系统的威胁,还有就是该功能对于开发人员透明。

③查询结果多种类型输出:支持将查询结果输出为Datatable、Dataset及Json(String)等

④组件间的松耦合:SqlOracleBuilder与DBOpertion松耦合,2个组件可以根据项目的实际需要独立使用,对于2个组件有关联的地方则可以通过配置解耦。

5 SqlBuilder.NET的设计实现

由SqlObjectMarker连接数据库将数据表生成特定的C#实体对象(数据表与实体对象一一对应,没有了ORM框架对象之间的关联),OracleSqlBuilder通过实体中的字段构建对象化SQL,并解析成标准SQL语句,最后DBOpertion与数据库通信通过SQL语句返回数据,如图1所示。

5.1 OracleSqlbuilder的设计实现

OracleSqlBuilder主要使用了泛型编程和反射机制,其过程就是将C#类型转换成相应SQL的特定类型,调用不同类的不同方法实现SQL语句的拼接,从而形成标准的SQL语句。

OracleSqlBuilder提取了数据表的通用属性和方法,比如数据表的表名、别名及序列等,形成ModelBase类,所有的数据库实体对象将继承ModelBase。图中User实体对象继承自Modelbase,由SqlObjectMarker生成。Select、Insert、Update、Delete可以依据User表生成相应的SQL语句,它们是由含有不同业务逻辑功能的类组成的,其类的分类主要依据SQL语句的关键字封装而成,比如“Group By”及“Order By”等。

其中TableField类是OracleSqlBuilder的重要组成部分,负责字段的各种SQL函数(如SUM、Distinct和Max函数)、赋值、运算以及复杂语句中子语句的生成等。

5.2 DBOpertion的设计实现

DBOpertion采用了设计模式中的抽象工厂模式,基于ADO.NET,同时结合反射+配置文件实现数据库访问,其中数据库的连接字符串与数据库类型可以在配置文件中配置,设计UML图如图2所示。

IDBOperation中定義了数据库操作的通用接口,包括数据库连接的打开关闭、SQL语句执行、存储过程执行及事务处理等。OracleOperation、AccessOperation、MySqlOperation和SqlServerOperation实现了IDBOperation接口,DbOper则通过反射与配置文件相结合的设计思想实现面向IDBOperation的接口编程。

由于解除了ORM框架中对象间的复杂关系,DBOpertion可以依据业务逻辑选择不同的返回类型,例如复杂查询,没有必要返回实体列表,而只需返回DataTable类型的数据,减少数据到实体的转换;在业务逻辑编写时需要根据数据做不同的操作,那么就可以返回实体对象,整体上可以极大提高系统的性能。

5.3 SqlObjectMarker的设计实现

SqlObjectmarker实体对象生成工具采用C/S模式开发,数据库相关配置采用XML配置文件,便于一次配置和团队开发。SqlObjectMarker可以自动获取指定数据库中的表及其注释,生成的实体类会根据数据库中的注释加入C#注释,便于开发时的自动提示,提高开发效率。

5.4 SqlBuilder.NET的不足

由于数据表与实体是一一对应的关系,并且没有XML映射文件的支持,因此在数据表发生字段变化的时候需要修改实体对象文件,造成框架的不灵活。当然框架也会存在其他的不足之处,每个框架的存在都会有它的优势和不足,都会在性能与功能上做一些取舍。

6结束语

SqlBuilder.NET作为一个轻量级的数据访问框架,其设计初衷就是为了减小开发的复杂度,因此后续的应用中,将继续保持简单、实用的设计理念,不会为了追求通用性而变得臃肿。希望该框架能够在以后的应用开发中继续发挥作用并接受磨练,使其更加稳定、实用。

参考文献

[1]李斌勇,李庆.基于NHibernate的ORM映射机制研究[J].计算机技术与发展,2009,19(7):32-34.

[2]潘立武,张建平.基于NBear企业级应用设计与开发[J].电脑编程技巧与维护,2009(13):28-33.

[3]欧勤坪,余建桥.基于SpringMVC+iBATIS框架的生物信息数据库的设计与实现[J].西南大学学报(自然科学版), 2008,30(11):142-145.

[4]刘冬.NHibernate从入门到精通系列(1)[EB/OL].(2011/2/14)[2018-1-1]. http://www.cnblogs.com/GoodHelper/archive/ 2011/02/14/nhiberante_01.html.

[5] NBear Google Group.NBear常见问题集[EB/OL].(2006/12/13)[2018-1-1] https://www.cnblogs.com/fengmk2 / archive/2006/12/13/590447.html.

[6] PatrickLiu.Net环境下比较流行的ORM框架对比[EB/OL].(2016/10/25) [2018-1-1].http://www.cnblogs.com/PatrickLiu/ p/5995592.html.