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. Canvas 2D绘制抗锯齿的1px线条

    当绘制1像素的线条时,发现多条线明显存在着粗细不均的问题,线条带有明显的锯齿. 事实上,Canvas的绘制线条指令都存在这个状况,如lineTo,arcTo,strokeRect. 解决方案是将Can ...

  2. LeetCode(8) - String to Integer (atoi)

    虽然是easy,却是比较繁琐的一道题,需要考虑各种边界条件.在WA了好几遍之后,才把各种边界条件给补全.需要考虑到的因素如下: 输入不合法字符,非"0-9",对于首位,合法字符还包 ...

  3. erlang代码片段

    转载自http://blog.csdn.net/sw2wolf/article/details/6797708 .列表操作 lists:foreach(fun(X) -> io:format(& ...

  4. Java WEB —— Java提升

    Java 5.0新特性: 枚举: enum Grade{ --> 相当于类 A("80~100"),B("70~80"),C("60~70&qu ...

  5. Java基础 —— JavaScript

    Javascript:基于对象与事件驱动的脚本语言,主要用于客户端 特点: 交互性:信息动态交互. 安全性:不能访问本地硬盘. 跨平台性:只要有浏览器就支持Javascript,与平台无关. Java ...

  6. EventSource (node.js 与 OC)

    node.js服务器代码: var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, ...

  7. poj 3094 Quicksum

    #include <stdio.h> #include <string.h> ]; int main() { ; int i,len; while(gets(word)) { ...

  8. ubuntu设置服务开机启动

    在Ubuntu下用sysv-rc-conf命令,它是chkconfig的替代命令,而使用方法与chkconfig基本相同. 安装: sudo apt-get install sysv-rc-conf ...

  9. lambda表达式和ef的语句转化

    这两者转化可以用linqpad进行转化, 首先推荐一个网站可以了解一下orderby的排序方式 http://www.csharpwin.com/csharpspace/614.shtml 然后下面有 ...

  10. yii缓存设置使用

    'filecache'=>array( 'class'=>'system.caching.CFileCache', 'directoryLevel'=>'3',), //在main. ...