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. vmware设置centos虚拟机nat联网(转载)

    今天在vmware虚拟主机中安装hearbeat,为了使用最新的版本,选用编译安装了.在编译过程中,需要连接被墙的网站下载文件,那只能用vpn,但我使用的是桥接方式联网,使用不了真实主机的vpn,于是 ...

  2. 了解JBoss Drools Engine

    说一个自己比较喜欢的开源产品JBoss Drools, 很多企业内部大型项目都在使用的规则引擎该怎么理解规则引擎,到底是个什么东西,我好像没听过,我们能用么. 它是配有内置算法及对应数据结构的计算容器 ...

  3. Flex3.0 Loader类的练习

    <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="h ...

  4. bzoj2940: [Poi2000]条纹

    2940: [Poi2000]条纹 条纹游戏是一个双人的游戏.所需要的物品有一个棋盘以及三种颜色的长方形条纹,这三种颜色分别是红色.绿色和蓝色.所有的红色条纹的尺寸是c*1,所有的绿色条纹的尺寸是z* ...

  5. html5 拖拽

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. openstack neutron 各节点网络配置

  7. 【MySql】权限不足导致的无法连接到数据库以及权限的授予和撤销

    [环境参数] 1.Host OS:Win7 64bit 2.Host IP:192.168.10.1 3.VM: VMware 11.1.0 4.Client OS:CentOS 6 5.Client ...

  8. 【转】Mysql进程管理

    mysql> show processlist; +----+------+-----------+------+---------+------+-------+--------------- ...

  9. HD1046An Easy Task

    Problem Description Ignatius was born in a leap year, so he want to know when he could hold his birt ...

  10. POJ 1066 Treasure Hunt(线段相交判断)

    Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4797   Accepted: 1998 Des ...