NHibernate教程
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" ?> |
(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{ 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教程的更多相关文章
- 通俗易懂的Nhibernate教程(2) ---- 配置之Nhibernate配置
在上一个教程中,我们讲了Nhibernate的基本使用!So,让我们回顾下Nhibernate使用基本的步骤吧 1.NHibernate配置 ----- 这一步我们告诉了Nhibernate:数据库 ...
- NHibernate教程(21)——二级缓存(下)
本节内容 引入 使用NHibernate二级缓存 启用缓存查询 管理NHibernate二级缓存 结语 引入 这篇我还继续上一篇的话题聊聊NHibernate二级缓存剩下的内容,比如你修改.删除数据时 ...
- NHibernate教程(20)——二级缓存(上)
本节内容 引入 介绍NHibernate二级缓存 NHibernate二级缓存提供程序 实现NHibernate二级缓存 结语 引入 上一篇我介绍了NHibernate内置的一级缓存即ISession ...
- NHibernate教程(19) —— 一级缓存
本节内容 引入 NHibernate一级缓存介绍 NHibernate一级缓存管理 结语 引入 大家看看上一篇了吗?对象状态.这很容易延伸到NHibernate的缓存.在项目中我们灵活的使用NHibe ...
- NHibernate教程(18)--对象状态
本节内容 引入 对象状态 对象状态转换 结语 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的 ...
- NHibernate教程(14)--使用视图
本节内容 引入 1.持久化类 2.映射文件 3.测试 结语 引入 在数据库操作中,我们除了对表操作,还有视图.存储过程等操作,这一篇和下篇来学习这些内容.这篇我们来学习如何在NHibernate中使用 ...
- NHibernate教程(13)--立即加载
本节内容 引入 立即加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的加载机制--延迟加载.其本质就是使用GoF23中代理模式 ...
- NHibernate教程(12)--延迟加载
本节内容 引入 延迟加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过前面文章的分析,我们知道了如何使用NHibernate,比如CRUD操作.事务.一对多.多对多映射等问题,这 ...
- NHibernate教程(11)--多对多关联查询
本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...
随机推荐
- kali2 ssh
vi /etc/ssh/sshd_config 1.将#PasswordAuthentication no的注释去掉,并且将NO修改为YES 2.将#PermitRootLogin without-p ...
- IOS 异步加载图片
#import <Foundation/Foundation.h> #import "StringUtils.h" @interface ImageManager : ...
- mediawiki 的使用 2
要想外部电脑能访问你的网站,网站部署好后,在LocalSettings.php 里将这句 $wgServer = "http://localhost"; 改成 $wgServer ...
- 服务框架Dubbo(转)
add by zhj:该开源项目已经停止更新了,不过倒是可以学学该软件的架构设计 原文:http://www.oschina.net/p/dubbo Dubbo 是阿里巴巴公司开源的一个高性能优秀的服 ...
- 串口发送浮点型数据及int(2个字节)long int(4个字节)的方法
方法一: 直接把float数据拆分为4个unsigned char(由于数字没法拆分,所以只能用指针的),发过去,在合并为float. 其中有两点要注意. (1)大端存储,小端存储:如果搞错读取数据就 ...
- ThinkPad X220i 刷白名单BIOS,改装第三方无线网卡
ThinkPad X220i自带的网卡是REALTEK RTL8188CE,这张卡在Mac下目前是无解的.国外网站有该卡liunx.unix内核的驱动,但还是没有高人编译出来. 不等了,这卡没戏.正好 ...
- class-dump-z下载地址
支持MAC.Linux.Win和iOS各个版本 http://download.csdn.net/detail/yukang1989/8414567
- 配置Redis主从复制
[构建高性能数据库缓存之redis主从复制][http://database.51cto.com/art/201407/444555.htm] 一.什么是redis主从复制? 主从复制,当用户往Mas ...
- 国内外从事CV相关的企业[转]
提示:本文为笔者原创,转载请注明出处:blog.csdn.net/carson2005 经常碰到朋友问我国内从事计算机视觉(CV)领域的公司的发展情况,产品情况,甚至找工作等问题,这里,我给出自己收集 ...
- 快速界面:QML。
PyQt, QML,Qt Quick. QML: QML可以在脚本里创建图形对象,并且支持各种图形特效,以及状态机等,同时又能跟Qt写的C++代码进行方便的交互,使用起来非常方便. 功能性不能,此篇博 ...