NHibernate教程

一、NHibernate简介

在今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦、浪费时间的。NHibernate是一个面向.Net环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping (ORM))这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。

NHibernate除了能将一张表映射为一个对象,还可以将表间关系变为对象的属性。例如学生和课程间的多对多关系就可以转化为学生类中的一个课程集合的属性。由此可见,NHibernate不仅仅管理.Net类到数据库表的映射,还提供数据查询和获取数据的方法。因此采用NHibernate,可以大幅度减少开发时人工使用SQL处理数据的时间。

二、NHibernate使用步骤

1.为系统引入NHibernate的库,并且配置NHibernate;

2.新建一个将要持久化.Net对象的表;

3.构建一个需要被持久化的.Net类;

4.构建一个可以让NHibernate知道如何完成ORM映射的XML文件;

5.使用NHibernate的API来编程

三、NHibernate的使用

1. 配置NHibernate

(1)NHibernate的配置文件有两种:在桌面应用程序(WinForm)中为App.config,在网页应用程序(WebForm)中为web.config。两种方法要添加的配置信息是一样的,目标都是告诉NHbiernate使用什么样的数据库,使用哪个库,用户密码分别是什么。

如果使用的是WinForm,将如下文本保存为App.config放到程序启动目录就可以。如果是WebForm,则将下面的文本添加到web.config中

<?xml version="1.0" encoding="utf-8" ?>
   <configuration>
      <configSections>
         <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </configSections>
      <nhibernate>
         <!--连接数据提供者 -->
         <add key="hibernate.connection.provider"
          value="NHibernate.Connection.DriverConnectionProvider" />
         <!--连接数据方言最常用的是MsSql2000Dialect -->
         <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" />
         <!--连接数据驱动类-->
         <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
         <!--数据库连接字符串-->
        <add key="hibernate.connection.connection_string" value="workstation id=BILLGATES;packet size=4096;integrated security=SSPI;initial catalog=CAW;persist security info=False" />
      </nhibernate>
   </configuration>

(2)然后将NHibernate唯一的一个dll(NHibernate.dll)添加到工程的引用中,步骤如下:

à   à

2. 创建一个用于测试的表

这里需要创建3张表,分别用于保存:学生、课程、选课信息。可以用Sql语句来创建,也可以用其他方式创建。创建表的Sql语句如下:

CREATE TABLE Student (

StudentId int identity (1, 1) PRIMARY KEY NOT NULL,

StudentName nvarchar(40) default NULL,

StudentPassword nvarchar(20) default NULL,

EmailAddress nvarchar(40) default NULL,

DateCreated datetime default getdate()

)

CREATE TABLE Course (

CourseId int identity (1, 1) PRIMARY KEY NOT NULL,

CourseName nvarchar(40) default NULL,

DateCreated datetime default getdate()

)

CREATE TABLE StudentCourse (

StudentCourseId int identity (1, 1) PRIMARY KEY NOT NULL,

StudentId int,

CourseId int,

DateCreated datetime default getdate()

)

产生的三张表的结构如下所示:

3. 创建.Net类和与其对应的XML文件

(1) 单表的情况

单表的情况就是指该表没有和其他表有关联的情况。这样情况下,可以用软件来辅助产生类和对应的XML文件。在这里,仍然采用手写的方式来生成这两个文件。对于课程表,需要写的类和XML如下所示:

类文件(Course.cs)

using System;

namespace NHibernateTest{

public class Course{

public Course(){}

private int courseId;

private string courseName;

private DateTime dateCreated= DateTime.Now;

public int CourseId{

get { return courseId; }

set { courseId = value; }

}

public string CourseName{

get { return courseName; }

set { courseName = value; }

}

public DateTime DateCreated{

get { return dateCreated; }

set { dateCreated = value; }

}

}

}

XML文件(Course.hbm.xml)

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

<class name="NHibernateTest.Course, NHibernateTest" table="Course">

<id name="CourseId" column="CourseId" type="Int32">

<generator class="native" />

</id>

<property name="CourseName" column= "CourseName" type="string" length="40"/>

<property name="DateCreated"  type="DateTime" length="8"/>

</class>

</hibernate-mapping>

(2) 含有关系的表的情况

含有关系的表指的是像学生这样,除了保存学生的基本信息,还希望把选课信息保存到学生的类中。这样情况下不能用软件来辅助产生对应的类和XML,这是NHibernate中唯一需要费脑筋学的地方。学生表对应的类和XML如下所示:

类文件(Student.cs)

using System;

using Iesi.Collections;

namespace NHibernateTest{

public class Student{
public Student(){}

private int studentId;

private string studentName;

private string studentPassword;

private string emailAddress;

private DateTime dateCreated= DateTime.Now;

private ISet courses =

new HashedSet();

public int StudentId{

get { return studentId; }

set { studentId = value; }}

public string StudentName{

get { return studentName; }

set { studentName = value; } }

public string StudentPassword{

get { return studentPassword; }

set { studentPassword = value; } }

public string EmailAddress{

get { return emailAddress; }

set { emailAddress = value; }}

public DateTime DateCreated{

get { return dateCreated; }

set { dateCreated = value; }}

public ISet Courses{

get{return courses;}

set{courses=value;}

}

}

}

XML文件(Student.hbm.xml)

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

<class name="NHibernateTest.Student, NHibernateTest" table="Student">

<id name="StudentId" column="StudentId" type="Int32">

<generator class="native" />

</id>

<property name="StudentName" column= "StudentName" type="string" length="40"/>

<property name="StudentPassword" type="string" length="20"/>

<property name="EmailAddress" type="String" length="40"/>

<property name="DateCreated"  type="DateTime" length="8"/>

<set name="Courses" table="StudentCourse" inverse="false">

<key column="StudentID"/>

<many-to-many column="CourseID" class=" NHibernateTest.Course, NHibernateTest "/>

</set>

</class>

</hibernate-mapping>

4. 使用NHibernate的API进行编程

数据库编程不外乎“添加”、“删除”、“更新”,看看NHibernate是如何实现这三种操作吧。

(1) 在类中声明NHibernate的Factory

private static Configuration mCfg=new Configuration();
private static NHibernate.ISessionFactory SessionFactory=null;

(2) 在系统初始化的时候加载XML,并创建Factory

mCfg.AddXmlFile( ApplicationPath +"/Course.hbm.xml");
mCfg.AddXmlFile( ApplicationPath +"/Student.hbm.xml");

SessionFactory=mCfg.BuildSessionFactory();

(3) 使用HSql查询

string hsql="from Student where StudentName='kexd'";

ISession vSession= SessionFactory.OpenSession();

IQuery query = vSession.CreateQuery(hsql);

IList list = query.List();

if(list.Count>0){

Student obj=(Student)list[0];

//.....

}

vSession.Close();

(4) 根据主键查询

int studentID=1;

ISession vSession= SessionFactory.OpenSession();

Student obj=(Student) vSession.Load(typeof(Student),studentID);

vSession.Close();

(5) 插入

ITransaction vTransaction = vSession.BeginTransaction();

try

{

Student obj=new Student();

obj.StudentName="wuyang";

obj.StudentPassword="helloWorld";

Course obj1=(Course) vSession.Load(typeof(Course),1);

Course obj2=(Course) vSession.Load(typeof(Course),2);

student.Courses.Add(obj1);

student.Courses.Add(obj2);

vSession.Save(obj);

vTransaction.Commit();

}

catch(Exception)

{

vTransaction.Rollback();

}

vSession.Close();

(6) 更新

ISession vSession= SessionFactory.OpenSession();

IQuery query = vSession.CreateQuery("from Student where StudentName='kexd'");

IList list = query.List();

ITransaction vTransaction = vSession.BeginTransaction();

try

{

foreach(Student obj in list)

{

obj.EmailAddress="kesfzu@21cn.com";

vSession.Save(obj);

}

vTransaction.Commit();

}

catch(Exception)

{

vTransaction.Rollback();

}

finally

{

vSession.Close();

}

(7) 删除

ISession vSession= SessionFactory.OpenSession();

IQuery query = vSession.CreateQuery("from Student where StudentName='kexd'");

IList list = query.List();

ITransaction vTransaction = vSession.BeginTransaction();

try

{

foreach(Student obj in list)

{

vSession.Delete(obj);

}

vTransaction.Commit();

}

catch(Exception)

{

vTransaction.Rollback();

}

finally

{

vSession.Close();

}

NHibernate教程的更多相关文章

  1. 通俗易懂的Nhibernate教程(2) ---- 配置之Nhibernate配置

    在上一个教程中,我们讲了Nhibernate的基本使用!So,让我们回顾下Nhibernate使用基本的步骤吧 1.NHibernate配置  ----- 这一步我们告诉了Nhibernate:数据库 ...

  2. NHibernate教程(21)——二级缓存(下)

    本节内容 引入 使用NHibernate二级缓存 启用缓存查询 管理NHibernate二级缓存 结语 引入 这篇我还继续上一篇的话题聊聊NHibernate二级缓存剩下的内容,比如你修改.删除数据时 ...

  3. NHibernate教程(20)——二级缓存(上)

    本节内容 引入 介绍NHibernate二级缓存 NHibernate二级缓存提供程序 实现NHibernate二级缓存 结语 引入 上一篇我介绍了NHibernate内置的一级缓存即ISession ...

  4. NHibernate教程(19) —— 一级缓存

    本节内容 引入 NHibernate一级缓存介绍 NHibernate一级缓存管理 结语 引入 大家看看上一篇了吗?对象状态.这很容易延伸到NHibernate的缓存.在项目中我们灵活的使用NHibe ...

  5. NHibernate教程(18)--对象状态

    本节内容 引入 对象状态 对象状态转换 结语 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的 ...

  6. NHibernate教程(14)--使用视图

    本节内容 引入 1.持久化类 2.映射文件 3.测试 结语 引入 在数据库操作中,我们除了对表操作,还有视图.存储过程等操作,这一篇和下篇来学习这些内容.这篇我们来学习如何在NHibernate中使用 ...

  7. NHibernate教程(13)--立即加载

    本节内容 引入 立即加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的加载机制--延迟加载.其本质就是使用GoF23中代理模式 ...

  8. NHibernate教程(12)--延迟加载

    本节内容 引入 延迟加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过前面文章的分析,我们知道了如何使用NHibernate,比如CRUD操作.事务.一对多.多对多映射等问题,这 ...

  9. NHibernate教程(11)--多对多关联查询

    本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...

随机推荐

  1. debian7下部署nginx服务器

    笔者是在vmware中的Debian7下部署nginx服务器,采用离线部署方式.过程如下: 1.准备好需要的离线安装包 nginx-1.6.2.tar.gz,pcre-8.34.tar.gz,open ...

  2. flex中文说明手册

    http://help.adobe.com/zh_CN/Flex/4.0/UsingFlashBuilder/WS6f97d7caa66ef6eb1e63e3d11b6c4d0d21-7f07.htm ...

  3. phonegap,Cordova 使用html5标签

    某些安卓手机的webview使用location.href="tel:123456"不能调到打电话的界面,可以用下面的解决办法: config.xml文件最后加上一行: <a ...

  4. LINQ标准查询操作符(四) —AsEnumerable,Cast,OfType,ToArray,ToDictionary,ToList,ToLookup,First,Last,ElementAt

    十.转换操作符 转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以“As”开头的转换方法可更改源集合的静态类型但不枚举(延迟加载)此源集合.名称以“To”开头的方法可枚举(即时加载)源集合并 ...

  5. Spark RDD概念学习系列之RDD的操作(七)

    RDD的操作 RDD支持两种操作:转换和动作. 1)转换,即从现有的数据集创建一个新的数据集. 2)动作,即在数据集上进行计算后,返回一个值给Driver程序. 例如,map就是一种转换,它将数据集每 ...

  6. Instagram的技术探索2(转)

    原文:http://www.cnblogs.com/xiekeli/archive/2012/05/28/2520770.html 前一篇翻译了Instagram blog上的一篇文章<What ...

  7. 服务框架Dubbo(转)

    add by zhj:该开源项目已经停止更新了,不过倒是可以学学该软件的架构设计 原文:http://www.oschina.net/p/dubbo Dubbo 是阿里巴巴公司开源的一个高性能优秀的服 ...

  8. HTML5每日一练之progress标签的应用

    progress标签:从名字上来看,估计大家也能猜到这个标签是什么标签了,没错,他是一个进度条.在HTML5中我们终于可以不用模拟了. <progress id="W3Cfuns_pr ...

  9. C#下载http文件

    @(编程) using System; using System.IO; using System.Net; namespace Wisdombud.Util { public class HttpH ...

  10. 理解MFC 文档、视图、框架[转]

    理解文档/视图框架                                      出处.雷神 了解文档和视图的相互作用关系是编写MFC程序的基本功.但是MFC的应用程序框架把文档和视图之间 ...