APP下载

基于Linq to NHibernate数据库应用系统的设计与实现

2010-09-17傅棋灿史浩山

微型电脑应用 2010年12期
关键词:配置文件面向对象数据表

傅棋灿,史浩山

0 引言

面向对象的开发方法是当今企业级应用中的主流开发方法,关系数据库则是永久存放数据的主流数据存储系统。由于对象和关系模型之间存在“阻抗不匹配”问题[1],而且面向对象数据库还不成熟。因此,研究如何在开发应用中进行关系—对象转换,有效地集成面向对象应用和关系数据库显得格外重要。对象关系映射(Object Relational Mapping,简称 ORM[2])是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术 。ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。

自从微软在2004年提出ObjectSpaces以来,涌现了很多ORM软件。一个最有影响力的解决方案就是从一个Java开源项目Hibernate发展来的 NHibernate。它为面向对象开发提供了持久的类。NHibernate的开发者尝试为其提供与Hibernate类似的API,使其具有通用性。NHibernate的使用使开发人员大幅度减少直接使用SQL和ADO.NET处理数据的时间。

在微软发布C# 3.0后,LINQ在项目中发挥了重要作用。作为 3.0语言身份的象征之一,学习 LINQ由为重要。而NHibernate作为运用最广的ORM框架之一,在大型项目中广受开发人员的青睐。前不久,NHibernate Forge宣布NHibernate Linq 1.0正式发布了(参考)。 Linq to NHibernate有机的在 NHibernate结合了 Linq的查询功能,良好的把LINQ表达式转换为Criteria API。

1 Linq to NHibernate

1.1 Linq to NHibernate的特性

NHibernate对数据库结构提供了较为完整的封装,实现了持久对象[3](Persistent Object,PO)和数据库表之间的映射,以及SQL的自动生成和执行。程序员只需定义好PO到数据库表的映射关系,即可通过其提供的方法完成持久层操作,甚至不需要对SQL熟练掌握,它会根据制定的存储逻辑,自动生成对应的SQL并调用ADO.NET接口加以执行。

相对于简单的NHibernate,Linq to NHibernate有如下优点:1. Linq to NHibernate有VS的IDE提示,编译器可以帮助我提示出错误。2. Linq to NHibernate最大限度的帮我们优化SQL语句,尤其是匿名类的查询语句和聚合函数的查询。3. 可以结合Linq加NHibernate各自的延迟加载特性,帮我们在必要的时候生成特定的SQL语句。4. 方便于满足复杂查询的需求(如报表)。

1.2 Linq to NHibernate 工作原理

Linq to NHibernate体系结构如图1所示。从图中可以看见,从应用程序来看,Linq to NHibernate处于应用程序和数据库之间,Linq to NHibernate使用配置文件数据和数据库来为应用程序提供持久化服务。

图1 Linq to NHibernate体系结构

2 Linq to NHibernate的开发实现

Linq to NHibernate的实现,简要的讲,分为五步:1.搭建开发环境。2. 创建所需数据表。3. 创建映射文件。4. 创建需要被持久化的.Net类。5. 开发程序实例。

2.1 搭搭建开发环境

首先根据需要选择数据库类型并创建所需要的数据库(如:Fly),然后从JBoss网站下载最新的NHibernate压缩包和NHibernate.Linq 压缩包,把其中相关的动态链接库加添加到项目中。编写配置文件告诉Linq to NHibernate连接怎么数据库,到哪里去连。最直接的办法是在应用程序的配置文件里(app.config或web.config)设置一个NHibernate配置节点。也可以在一个单独的配置文件中,但必须在程序中显示地加载配置文件。我的配置文件( NHibernate.config )如下:

最外层的 hibernate-configuration是配置文件的主题,session-factory元素中的内容用来配置NHbernate与数据库之间的会话参数。在下载的 NHibernate压缩包里面已经有相关的模板。最后把 NHibernate中的函数进行一些封装,如我把它们写在DataHelper命名空间中的Db类中

2.2 创建所需数据表

在Fly的数据库中根据具体的项目需要创建数据表,如:一个部门数据表(Pb_Department)的和员工数据表(Pb_Staff)。数据库表的创建是程序开发者的必备技能,可以通过图形化的方式或者SQL语句进行。

2.3 创建映射文件

NHibernate用以 .hbm.xml结尾的文件描述.NET对象和数据库资源的映射关系,称为映射文件。映射文件把数据库中的数据表映射成对应的类,表的字段映射到类的属性,表中的一行数据映射成一个类的实例。建一个XML文件,并命名为YourClass.hbm.xml(YourClass是映射对应的类名),下面是Department.hbm.xml的映射代码。

由于Department.hbm.xml中的内容将Fly.Core.Domain.Department与数据库中PB_DEPARTMENT数据表映射,对于PB_DEPARTMENT数据表所在的数据库信息由NHibernate.config文件提供,所以:*.hbm.xml文件与具体数据库连接无关,是与数据库应用相关的源文件。*.hbm.xml映射文件以hibernate-mapping元素作为最外层,hibernate-mapping元素类可以包含 0到多个表 1中的子元素。

表1 NHbernate-mapping的子元素[4]

hibernate-mapping的属性xmlns指定映射文件的版本,namespace指定映射的类所属命名空间,assembly指定映射的类的程序集名称。

class这个元素是用来定义持久化类的,属性name指定要映射的类名。table指定映射的类在数据库中进行持久存储的数据表名。

class有很多子元素,id子元素用于声明类标识属性对应于数据库表的主键字段的映射关系,属性name标识类的属性名称,column标识PB_DEPARTMENT表的主键字段的名称,type标识字段的数据类型, 而内嵌的generator元素则指明主键字段唯一值的生成方法。Property是 class中最常用的子元素,其属性name指定类的属性,column为类的属于对应于数据表中的字段,type为类属性的类型。

值得注意的是class的子元素bag,bag本身不是.Net集合框架中的接口,但是 bag可以对应集合中框架中的Collection何List接口类型作为属性,如本例对应为IList接口。bag集合的顺序通过order-by属性来实现。lazy属性设定是否延迟加载。one-to-many(一对多)是众多映射关联关系中的一种。映射关联关系[4]一般包括一对一、多对一、一对多、多对多(单向和双向)。

2.4 创建需要被持久化的Net类

创建表示部门的Department类如下:

图2 对象的创建

这是一个简单的部门(Department)类,里面有部门标示(Id)、部门名称(Name)和部门的全部员工(Staffs)。这些都是与映射文件相对应得属性,当然,也可以写一些与映射无关的属性和方法,同时还可以对映射的属性进行合理性检验,如长度是否过长,过长就抛异常,形式如下:

图3 有自检的类属性

员工Staff类的写法和上面的Department类相似,就没有写了。

2.5 开发程序实例

开发人员根据开发的需要,调用数据持久层 Linq to NHibernate提供的方法,以面向对象的方式完成对象持久化操作封装,开发人员不需要知道数据库底层结构,甚至不需要知道数据库的存在。所有访问数据库的操作都调用NHibernate来完成。对应基本的CRUD[5](插入——Create、查找——Read、更新——Update和删除——Delete)操作,可以封装在一个类中,而这些操作基本不涉及什么SQL语句,NHibernate会负责对象与数据库表之间的这种映射关系。Session贯穿NHibernate的持久化管理器核心,用Save、Update和Delete的方法来完成对象的插入、更新和删除操作。而且操作非常简单,如插入操作:

Session的Load ()方法可以通过制定的OID从数据库中加载一个实例对象。

Session的Find()方法可以用HQl语句查找符合条件数据集。Linq to NHibernate是在NHibernate的基础上多了Linq的性能,查询数据集就变的更加方便。如:

就可以查出所有的部门.如果想要查看本公司有多少个部门,可以用如下函数:

3 总结

随着面向对象编程的普及和面向对象的数据库不够成熟,对象关系映射技术在这个过程中尤为重要,Linq to NHibernate作为一种ORM框架,不但有很强的对象关系映射能力,而且还有机地结合了Linq的查询功能,因此Linq to NHibernate将作为广大.NET编程爱好者的首要选择,文中介绍了Linq to NHibernate和使用其进行开发的方法,实际开发中存在生成的SQL语句查询效率需要进一步优化等问题。但总的来说,使用Linq to NHibernate进行开发,可以使程序结构清晰、易于维护、具有更好的扩展性、更容易开发可复用的组件。同时,减少了出错机会,提高开发效率。

[1]刘金,徐苏,冯豫华.基于Hibernate的J2EE数据持久层的设计与实现[J].计算机与现代化,2007,23(4):56-58.

[2]贾新茹,须德.对象/关系映射机制研究与实现[J].铁路计算机应用,2005:11-13.

[3]李绍文,董辉琴,NHibernate在.NE T开发中的应用[J],福建电脑2006(6):1

[4]张顺青,熊伟,吴秋云.基于NHibernate的信息管理系统实体建模[J].软件开发与应用,2007,26(11):93.

[5]Pierre Henri Kuaté, Christian Bauer and Gavin King NHibernate in Action [M], Copyright 2008 Manning Publications,2008:13.

猜你喜欢

配置文件面向对象数据表
湖北省新冠肺炎疫情数据表(2.26-3.25)
湖北省新冠肺炎疫情数据表
互不干涉混用Chromium Edge
基于列控工程数据表建立线路拓扑关系的研究
基于Zookeeper的配置管理中心设计与实现
忘记ESXi主机root密码怎么办
为View桌面准备父虚拟机
面向对象Web开发编程语言的的评估方法
峰丛洼地农作物面向对象信息提取规则集
基于面向对象的车辆管理软件的研制与开发