请注明转载地址: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介绍的更多相关文章

  1. NHibernate简单使用介绍

    1.在数据库中新建表格,并插入记录,SQL如下: USE WFC_DB GO create table Students ( Id ,) not null, Name ), Age int, Scor ...

  2. 一步步学习ASP.NET MVC3 (3)——Razor(1)

    请注明转载地址:http://www.cnblogs.com/arhat 首先这个<一步步学习ASP.NET MVC3>前段时间有些忙,没有顾得上写文章,昨天呢写了3个和ASP.NET的相 ...

  3. 一步步学习javascript基础篇(0):开篇索引

    索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...

  4. 一步步学习javascript基础篇(6):函数表达式之【闭包】

    回顾前面介绍过的三种定义函数方式 1. function sum (num1, num2) { return num1 + num2; }  //函数声明语法定义 2. var sum = funct ...

  5. 一步步学习javascript基础篇(5):面向对象设计之对象继承(原型链继承)

    上一篇介绍了对象创建的几种基本方式,今天我们看分析下对象的继承. 一.原型链继承 1.通过设置prototype指向“父类”的实例来实现继承. function Obj1() { this.name1 ...

  6. 一步步学习javascript基础篇(4):面向对象设计之创建对象(工厂、原型和构造函数等模式)

    前面我们介绍了可以通过Object构造函数或对象字面量都可以用来创建单个对象,但是如果需要创建多个对象的话,显然很多冗余代码. 接下来介绍几种模式来创建对象.不过在此之前,我们还是先来了解下 type ...

  7. 一步步学习javascript基础篇(3):Object、Function等引用类型

    我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...

  8. Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程

    Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程 教程简介: 本教程共71节,主要介绍了shell的相关知识教程,如shell编程需要的基础知识储备.shell脚本概念介 ...

  9. 基于asp.net + easyui框架,一步步学习easyui-datagrid——实现分页和搜索(二)

    http://blog.csdn.net/jiuqiyuliang/article/details/19967031 目录: 基于asp.net + easyui框架,一步步学习easyui-data ...

随机推荐

  1. How-to Dump Keys from Memcache--reference

    Submitted by Lars Windolf on 19. October 2012 - 21:53 http://lzone.de/dump%20memcache%20keys You spe ...

  2. Database ORM

    Database ORM Introduction Basic Usage Mass Assignment Insert, Update, Delete Soft Deleting Timestamp ...

  3. MVC中使用QrCodeNet 生成二维码

    QrCodeNet下载地址:http://qrcodenet.codeplex.com/ using System.Drawing; using System.Drawing.Imaging; usi ...

  4. Bleed Brake Master Cylinder with Intelligent Tester IT2

    When the brake fluid level drops too low in the master cylinder reservoir, air bubbles can get caugh ...

  5. 异常的应用finally与总结

    一.finally{   },finally块中放入一定要执行的代码,通常用来关闭数据库,关闭链接,节约资源,所以finally中的内容一定要被执行,但是有一张情况不被执行,就是catch(Excep ...

  6. Android线控的使用

    实现方式一:只能在程序为前台时监控 在Activity中即可监听 @Override public boolean onKeyUp(int keyCode, KeyEvent event) { Log ...

  7. python内置函数大全

    一.数学运算类 abs(x) 求绝对值1.参数可以是整型,也可以是复数2.若参数是复数,则返回复数的模 complex([real[, imag]]) 创建一个复数 divmod(a, b) 分别取商 ...

  8. 12天学好C语言——记录我的C语言学习之路(Day 4)

    12天学好C语言--记录我的C语言学习之路 Day 4: 首先来看一段程序: //输出下面4*5的矩阵 /* 1  2  3   4   5 2  4  6   8   10 3  6  9   12 ...

  9. 03_线程的创建和启动_实现Runnable接口方式

    [线程的创建和启动的步骤(实现Runnable接口方式)] 1.定义Runnable接口的实现类,并重写其中的run方法.run()方法的方法体是线程执行体. class SonThread  imp ...

  10. 什么是SQL statement?

    什么是SQL statement? 1.SQL SELECT statement - SELECT命令 REFER: What is SQL, and what are some example st ...