一步步学习NHibernate(1)——NHibernate介绍
请注明转载地址:http://www.cnblogs.com/arhat
第十五章
从本章开始,老魏将给大家一起学习NHibernate这个流行的ORM框架,本来老魏想要和大家一起探讨微软的EF框架的,但是有EF框架现在版本不确定,所以老魏决定先讲NHibernate吧。本来我们学习.NET技术的基本上没有接触过框架开发,用的都是微软官方提供的技术。但是现在随着微软的开放,出现了很多开源的框架,有其是ASP.NET MVC的出现,导致很多人想把J2EE中流行的SSH框架移植到.NET平台上。但是我们主要学习是ASP.NET MVC,所以对于Java的struts我们就不在讲述了。但是对于Spring和Hibernate分别都对.NET平台进行了二次开发,推出了Spring.NET和NHibernate的.NET版本,所以老魏觉得这两个在JAVA中盛行的框架值得我们的学习,而且由于都是开源的,所以我们可以学到很多的知识。
这里呢,老魏有其要说明一点的是,我们学习Spring.NET,NHibernate这两个框架并不是让大家成为“框架奴”,而是让大家知道有些优秀的框架可以帮助我们快速的开发项目,当然更要的是我们从中可以学到框架的很多原理是知识,这才是我们的重点。
什么是NHibernate?NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object /relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。

那么大家从上面的图可以看出,NHibernate在应用程序和数据库之间起到了一个桥梁的作用,起到了数据持久化(Persistent)的作用,当然平时我们使用的是ADO.NET,这里我们使用了NHibernate。其实两者之间老魏认为没有什么大的区别,都是用来做持久化用的,但是我们可以这样认为,NHibernate是对ADO.NET的一种高级的封装。
NHibernate主要解决的是数据和对象之间的关系,我们称之为ORM。那么什么是ORM呢?对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存 在,主要实现程序对象到关系数据库数据的映射。
其实简单的说就是用对象来表示一条数据。比如现在数据库中有一条数据如下:
|
U_Id |
U_Name |
U_Sex |
U_Email |
U_Tel |
U_Address |
|
1 |
大话济公 |
男 |
Single_jie@163.com |
xxxxx |
九重天 |
那么如果用对象去表现这条数据怎么办呢?我们可以定义一个User类,同时定义User类的属性为数据库字段。
public class User
{
public int U_Id{get;set;}
public string U_Name{get;set;}
public string U_Sex{get;set;}
public string U_Email{get;set;}
public string U_Tel{get;set;}
public string U_Address{get;set;}
}
那么我们定义一个对象user同时给user对象的属性赋值
User user = new User{
U_Id=1,
U_Name=”大话济公”,
U_Sex=”男”,
U_Email=”single_jie@163.com”,
U_Tel=”xxxxx”,
U_Address=”九重天”
};
从这个对象中我们可以看出,这个对象的属性值和数据库存的数据是一样的,那么这样我们就通过对象来表现数据库中的数据了。这就是所谓的ORM。当然了,由于数据比较简单,没有体现数据和数据之间的关系,但是随着我们慢慢的学习,就知道使用NHibernate是如何表示这种关系的。
本章并不带着大家开始写NHibernate的第一个程序,主要来介绍一下NHibenate.
我们来看一下NHibenate的有点和缺点吧
优点:
(1).面向对象:NHiberante的使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想。
(2).透明持久化:带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。这些对象可能是普通的POCO,这个对象没有实现第三方 框架或者接口,唯一特殊的是他们正与(仅仅一个)Session相关联。一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序 的任何层自由使用。(例如,用作跟表示层打交道的数据传输对象。)
(3).它没有侵入性,即所谓的轻量级框架。正因为它具有透明持久化的优点,它才没有侵入性,才是一个轻量级框架。恒定一个框架为重量级、还是轻量级,是根据其侵入性而定夺的。而NHibernate就是一个轻量级ORM框架。
(4).较好的移植性:支持多种数据库,便于数据库的迁移。
(5).缓存机制:提供一、二级缓存和查询缓存。
(6).开发效率:众所周知,使用NHibernate可以简化程序开发,从而达到快速开发的目的。作为软件公司,项目管理的关键就是控制开发 成本。正因为使用NHibernate后所写的代码量减少了,相对于原先使用“SqlHelper、DAL、BLL”开发程序的项目周期缩短了,成本就降低了。
缺点:
(1).内存消耗:直接使用“SqlHelper、DAL、BLL”无疑是最省内存的。使用NHibernate后,内存开销比较大,这点是毋庸置疑的。
(2).批量数据库的处理:由于NHibernate是基于面向对象的ORM框架,处理数据库的方式是针对单个对象的。对数据库的增、删、改都 是正对一条记录而言。对于批量修改、删除数据,不适合用NHiberante。这也是所有OR框架弱点,其原因,我认为是在于与缓存机制的冲突。
(3).较多使用数据库特性时,也不适合使用NHiberante。如数据库中大量的存储过程、触发器、特点的SQL语句。
(4).表关系比较混乱时也不适合使用NHiberante。NHibernate只适合于表与表的关系比较明确的环境中。如本应该建立外键的,没有建立外键。这时使用NHiberante不仅没有减少工作量,反而增加了工作量。
(5).学习成本:相对于NHibernate来说,使用“SqlHelper、DAL、BLL”操作数据库,学习成本比较低,而且上手很快。 使用NHibernate需要有一定OOP(面向对象编程)和OOD(面向对象设计)的基础,这对于基础薄弱的程序员来说,从面向过程的编程到面向对象的 编程,需要一定的投入;一般情况下需要学习1个月左右的时间才能够深入NHiberante。
当然了,我们并不只看优点或者缺点,而是根据具体的情况来使用NHibernate。本章主要就介绍一下NHibenate,下一章我们开始来玩玩NHibernate吧。
一步步学习NHibernate(1)——NHibernate介绍的更多相关文章
- NHibernate简单使用介绍
1.在数据库中新建表格,并插入记录,SQL如下: USE WFC_DB GO create table Students ( Id ,) not null, Name ), Age int, Scor ...
- 一步步学习ASP.NET MVC3 (3)——Razor(1)
请注明转载地址:http://www.cnblogs.com/arhat 首先这个<一步步学习ASP.NET MVC3>前段时间有些忙,没有顾得上写文章,昨天呢写了3个和ASP.NET的相 ...
- 一步步学习javascript基础篇(0):开篇索引
索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...
- 一步步学习javascript基础篇(6):函数表达式之【闭包】
回顾前面介绍过的三种定义函数方式 1. function sum (num1, num2) { return num1 + num2; } //函数声明语法定义 2. var sum = funct ...
- 一步步学习javascript基础篇(5):面向对象设计之对象继承(原型链继承)
上一篇介绍了对象创建的几种基本方式,今天我们看分析下对象的继承. 一.原型链继承 1.通过设置prototype指向“父类”的实例来实现继承. function Obj1() { this.name1 ...
- 一步步学习javascript基础篇(4):面向对象设计之创建对象(工厂、原型和构造函数等模式)
前面我们介绍了可以通过Object构造函数或对象字面量都可以用来创建单个对象,但是如果需要创建多个对象的话,显然很多冗余代码. 接下来介绍几种模式来创建对象.不过在此之前,我们还是先来了解下 type ...
- 一步步学习javascript基础篇(3):Object、Function等引用类型
我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...
- Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程
Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程 教程简介: 本教程共71节,主要介绍了shell的相关知识教程,如shell编程需要的基础知识储备.shell脚本概念介 ...
- 基于asp.net + easyui框架,一步步学习easyui-datagrid——实现分页和搜索(二)
http://blog.csdn.net/jiuqiyuliang/article/details/19967031 目录: 基于asp.net + easyui框架,一步步学习easyui-data ...
随机推荐
- Introducing the Blog Module
Introducing the Blog Module Now that we know about the basics of the zend-mvc skeleton application, ...
- javascript笔记05:函数表达式和函数语句的区别
1.首先是函数语句: myfunc(); function myfunc() { //执行一些语句 } 当函数语句被定义的时候,在一个脚本代码被优先考虑,因此,无论该函数是定义之前或者定义之后都可以被 ...
- Unix网络编程(1)——socket一窥
套接口地址结构 IPv4的套接口地址结构为: struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family; struct in_addr ...
- [MSDN]关键字查询语言 (KQL) 语法参考
MSDN:http://msdn.microsoft.com/library/ee558911(v=office.15) 了解如何构造 SharePoint 2013 中的搜索功能 的 KQL 查询. ...
- WEB前端优化一些经验技巧
引言: 1. 慢的页面可能会网站失去更多的用户. 2. 慢500ms意味着20%的用户将放弃访问(google) 3. 慢100ms意味着1%的用户将放弃交易(amazon) 前段时间偶然看到网上的两 ...
- ThinkPHP的配置
ThinkPHP配置:conf目录下 'URL_PATHINFO_DEPR'=>'-',//修改URL的分隔符, 'TMPL_L_DELIM'=>'<{', //修改左定界符 'TM ...
- JQuery 性能优化
一.合适的选择器 JQuery 选择器提供丰富的选择器来定位DOM元素, 基本选择器 #id..class.element.*等:那他们哪个更高效呢? 第一选择: $("#id") ...
- hadoop的mapreduce过程
http://www.cnblogs.com/sharpxiajun/p/3151395.html 下面我从逻辑实体的角度讲解mapreduce运行机制,这些按照时间顺序包括:输入分片(input s ...
- HW-文件恢复-测试300
//package t0817; import java.util.*; public class FileRelive {//类名换成Main public static void main(Str ...
- iOS对textField进行字符长度限制的办法
在项目开发过程中,遇到这么一个需求,编辑标签时,输入的最大长度需要限制为24个字节. 查阅了一些材料,并参考了之前项目的相关处理办法,今天在这里总结一下解决方案. 1.写一个截取字符串的方法,将超长的 ...