您的位置:首页 > 其它

【转载】ADO.NET与ORM的比较(2):NHibernate实现CRUD

2014-12-09 15:13 369 查看
【转载】ADO.NET与ORM的比较(2):NHibernate实现CRUD 转自周公

说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hibernate,除了在学习基础知识的时候被告知可以使用JDBC操作数据库之外,大量的书籍中都是讲述使用Hibernate这个ORM工具来操作数据。在.NET中操作数据库的方式有多种,除了最直接的方式就是使用ADO.NET之外,还可以使用NHibernate这个Hibernate在.NET中的实现ORM,如果你对第三方的ORM持怀疑态度,你还可以使用来自微软的实现、根正苗红的Linq或者EntityFramework。
大部分从早期就开始使用.NET开发的程序员可能对ADO.NET有种迷恋,使用ADO.NET可以充分将我们早期的SQL知识发挥得淋漓尽致,并且出于对性能的考虑,有些人对.NET中的ORM还保持一种观望态度,包括我自己也是这种态度。不过即使在实际开发中不用,并不代表我们不能去了解和比较这些技术,任何事物的出现和消亡总有其原因的,我们可以了解它们的优点和长处。所以本人抽出了几个周末的时间分别用ADO.NET、NHibernate、Linq和EntityFramework来实现对数据库单表数据的创建、读取、更新和删除操作,也就是所谓的CRUD(C:Create/R:Read/U:Update/D:Delete)。
通过实现相同功能的比较,大家自己判断那种方式更适合自己。需要说明的是,如果在VS2008中使用EntityFramework就需要安装VS2008SP1。
在本篇周公将讲述如何利用NHibernate实现CRUD功能,为了便于对比,在本次中采用与上次同样的数据库和表,并且也实现同样的功能。NHibernate是一个ORM框架,所谓ORM就是Object Relational Mapping,是一种将关系型数据库中的数据与面向对象语言中对象建立映射关联的技术,我们可以想操作对象一样操作数据,NHibernate将我们对对象的变更保存到数据库中去,并且还负责以对象的方式从数据库中查询数据,这样就可以使开发人员从处理SQL和ADO.NET上节省一些时间和精力用于处理业务逻辑。
1、准备
首先我们需要从网上下载NHibernate框架,这个可以到它的官方网站www.nhibernate.org上去下载,在周公写这篇文章的时候从网上能下载到的最新版本为2.1.2.GA。如果下载的是压缩包,请将压缩包解压,将会看到四分文件夹,它们的名称和作用分别如下:
Configuration_Templates:存放NHibernate连接数据库的配置文件的示例,在这个文件夹下分别有连接Firebird、SQL Server、MySQL、Oracle、PostgreSQL和SQLite数据库的配置示例,可以根据实际所使用的数据库选择示例中的代码并更改其中的数据源即可。
Required_Bins:存放NHibernate运行过程中所需要的类库文件,其中还包含了第三方的开源日志框架Log4Net,在不确定到底会使用那些类库的条件下建议将这个文件夹下所有的dll文件拷贝到项目的bin文件夹下。
Required_For_LazyLoading:存放延时加载特性支持所需的框架文件,在这个文件夹下提供了三种实现,选择一种将其下所有的dll文件拷贝到项目所在的bin文件夹下。在本示例中选择了Castle。
Tests:存放测试用文件,在此文件夹下还有一个名为ABC.hbm.xml的文件,这是一个数据表对应的配置文件的示例,在这个文件夹下的文件我们都用不着,不过在以后我们会用到.hbm.xml文件。
2、创建项目
我们创建一个项目,项目类型可以根据情况选择,因为我今后要使用NUnit来对项目进行单元测试,所以创建的类库项目。
创建项目成功之后将如下文件拷贝到项目的bin目录下:
Antlr3.Runtime.dll
Castle.Core.dll
Castle.DynamicProxy2.dll
Iesi.Collections.dll
log4net.dll
NHibernate.ByteCode.Castle.dll
NHibernate.dll
然后在项目中添加对这些dll的引用,如下图所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using NHibernateDemo;

namespace NUnitTest
{
[TestFixture]
public class NHibernateTest
{
private NHibernateCRUD instance = null;
[SetUp]
public void Initialize()
{
instance = new NHibernateCRUD();
}
[Test]
/// <summary>
/// 统计用户总数
/// </summary>
/// <returns></returns>
public void Count()
{
Assert.Greater(instance.Count(), 0);
}
[Test]
/// <summary>
/// 创建用户
/// </summary>
/// <param name="info">用户实体</param>
/// <returns></returns>
public void Create()
{
UserInfo info = new UserInfo()
{
Age = 12,
Email = "zzz@ccav.com",
Mobile = "13812345678",
Phone = "01012345678",
RealName = "测试" + DateTime.Now.Millisecond.ToString(),
Sex = true,
UserName = "zhoufoxcn" + DateTime.Now.Millisecond.ToString()
};
instance.Create(info);
}
[Test]
/// <summary>
/// 读取用户信息
/// </summary>
/// <param name="userId">用户编号</param>
/// <returns></returns>
public void Read()
{
UserInfo info = instance.Read(1);
Assert.NotNull(info);
}
[Test]
/// <summary>
/// 更新用户信息
/// </summary>
/// <param name="info">用户实体</param>
/// <returns></returns>
public void Update()
{
UserInfo info = instance.Read(1);
info.RealName = "测试" + DateTime.Now.Millisecond.ToString();
instance.Update(info);
}
[Test]
/// <summary>
/// 删除用户
/// </summary>
/// <param name="userId">用户编号</param>
/// <returns></returns>
public void DeleteByID()
{
int userId = instance.GetMaxUserId();
instance.Delete(userId);
}

[Test]
/// <summary>
/// 删除用户
/// </summary>
/// <param name="userId">用户实体</param>
/// <returns></returns>
public void Delete()
{
int userId = instance.GetMaxUserId();
UserInfo info = instance.Read(userId);
Console.WriteLine("MaxUserId=" + userId);
instance.Delete(info);
}
}
}


View Code
4.点评
使用ORM的很大的一个好处就是很少或者根本不用编写数据库记录映射到对象的代码,并且在大部分情况下也不用编写SQL代码(取而代之的是HSQL)。在使用ADO.NET时代我经常有这样的体会,因为数据库的变动可能需要更改从显示到数据库访问层的相关代码,并且还需要更改自己编写的从数据库记录转换为对象的代码,而现在仅仅需要更改映射文件和持久化类的代码就可以了,除此之外我们还可以使用面向对象的方式对数据进行操作,大家可以看到在NHibernateCRUD中对数据库进行CRUD的代码比直接使用ADO.NET进行CRUD操的代码要简洁许多,这就是ORM的魅力。
当然使用ORM也会存在一些缺点,毕竟ORM在底层使用的是ADO.NET,对于一个有经验的开发人员来说,可能直接使用ADO.NET的性能比使用NHibernate的效率要高,通过NHibernate的缓存机制多少能在某种程度上缓解这个问题。不过当数据量在千万级左右时这个问题就显得比较突出了,在一些数据量在百万级以下的情况中,合理使用NHibernate是没有什么问题的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: