标题:[开源]NHibernate Step by Step
取消只看楼主
冰镇柠檬汁儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:北京
等 级:版主
威 望:120
帖 子:8074
专家分:6657
注 册:2005-11-7
结帖率:98.25%
 问题点数:0 回复次数:3 
[开源]NHibernate Step by Step
很久以前,你可能习惯了connection.open,command.execute("select...")这样的代码,写啊写啊,你开始不停地copy/paste,因为数据库的操作太雷同了,还好,粘粘贴贴倒也凑合,然后有一天客户说他们要用oracle,于是你开始抱着本oracle开发指南狂啃pl/sql,你开始试验调用oracle的存储过程该怎么写,参数是用@还是?或者是:,取个blob游标又要咋写,你纳闷为啥这不同的数据库sql区别咋这么大呢?不都是号称符合啥sql几几的标准吗?你的头开始痛了,你开始写不同的DAL,代码与十指齐飞,脑袋昏昏天黑黑——又加班了!!这次第,怎一个愁字了得!!
然后你觉得再也不能这样过了,再也不能这样活了,你开始用DAAB,后来升级到Enterprise Library,恩,不错,代码好象少了,后来再加个Code Smith,恩,不错,自动生成代码,自己敲键盘少了,虽然你还得在不同的数据库间挣扎,还得把取出来的数据一点一点地填到你的实体类里,但是目前看上去还不赖,可以忙里偷闲泡杯两块八一包的劣质茶叶咂吧咂吧你那被劣质显示器辐射的开裂的嘴唇了。但是你觉得还不够,你在想,是否有Code Neo,或者干脆来个Code Matrix,整个DAL都不用自己写了,自动把数据库的数据填到自己的实体类里,然后对这个对象进行操作就行了,剩下的CRUD全部有这个Code Matrix来完成,达不达??
神啊,救救我吧……
“当当当当……“,O/R Mapping来到了大家的眼前。
O/R Mapping全称是object/rational mapping,即对象/关系数据库映射,意思是对象模型和关系模型的映射,也就是把我们常见的以对象模型表示的对象映射到关系模型上去,当然,这个关系模型我们常常指的是目前大部分主流的关系数据库,如oracle/sqlserver等等。基于.Net来说,o/r mapping就是将我们的.Net类映射到数据库中指定的表上,由O/R Mapping框架帮我们实现object<-->table之间的交互,我们完全不再需要写sql语句(当然不是绝对的),也不再关心背后用的是那种数据库,你只需要定义好对象和数据库该如何交互,剩下的,全部由O/R Mapping的框架来解决,你只需要如下代码即可:
Customer cust = framework.Get(...);
cust.Name = "newname";
framework.Save(cust);
或者:
framework.Delete(cust);
ok!!手起键盘落,整个世界清净了!!
是不是很动心啊??
ok,正式介绍今天的主角——Hibernate!!
Hibernate是一个目前应用的最广泛的开放源代码的对象关系映射框架,它对Java的JDBC(类似于ADO.Net)进行了非常轻量级的对象封装,使得程序员可以随心所欲的使用对象编程思维来操纵数据库,目前在国内Java开发界已经颇为流行,Hibernate+Spring往往是很多Java公司招聘的要求。而NHibernate,顾名思义,如同NUnit,NAnt一样,是基于.Net的Hibernate实现,但是目前介绍NHibernate的资料非常少,缺少一个系统完整的教程来全面的展现和深入NHibernate,而且现在NHibernate的文档又残缺不全,少的可怜,很多NHibernate的学习者往往都是通过Hibernate的文档来学习,但是毕竟不是所有的.Net开发者都熟悉Java,也不是所有的人都有精力有时间去学习Java,所以,我准备开始一个Step by Step的NHibernate教程,以便有兴趣的朋友能够快速的熟悉NHibernate,能够更快地体验NHibernate的开发乐趣。

大家想得到这样的乐趣吗?我在网上找到一篇,并总结到了一个文档里
58YFPlBl.rar (94.01 KB) [开源]NHibernate Step by Step


有感兴趣的朋友,就下载吧
搜索更多相关主题的帖子: Step NHibernate 数据库 oracle 开源 
2007-04-16 09:31
冰镇柠檬汁儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:北京
等 级:版主
威 望:120
帖 子:8074
专家分:6657
注 册:2005-11-7
得分:0 

NHibernate简介 - 什么是NHibernate

NHibernate是一个基于.Net,用于关系数据库的对象持久化类库.它是著名的Hibernate的.Net版本.
NHibernate用于把你的.Net对象持久化到底层的关系数据库中.你完全不用自己编写Sql语句去操作这些对象,NH会代替你做.你的代码

里面只需要关心这些对象,NH生成sql语句并能为你取到正确的东西.
开发过程
HNibernate将会有一些工具帮助你,如:生成schema,根据映射文件(Mapping file)生成类,并更新schema(一个新开发者的建议).然而,

在本文档中,前提是你已经手动的数据库的创建喝.Net类的编写...
这里是我们要做的:

1. 在数据库中创建把.Net类持久化的对应表.
2. 创建需要被持久化的.Net类.
3. 创建映射文件,以告诉NH怎样持久化这些类的属性.
4. 创建NH的配置文件,以告诉NH怎样连接数据库.
5. 使用NH提供的API.

步骤1:创建数据库表
我们正在做的是一个非常简单的NH示例.在这个例子里面,我们实现一个基本的用户管理子系统.我们将会使用一个user表(sql server

2000):

use NHibernate
go

CREATE TABLE users (
LogonID varchar(20) NOT NULL default '0',
Name varchar(40) default NULL,
Password varchar(20) default NULL,
EmailAddress varchar(40) default NULL,
LastLogon datetime default NULL,
PRIMARY KEY (LogonID)
)
go

我使用的是MS Sql Server 2000,但是如果你找到一个任何数据库的.net Data Provider驱动,你可以使用任何数据库.

步骤2:创建.Net类:
当我们这样一堆的用户的时候,我们需要某种对象来保存.NH是通过reflection对象的属性来工作的,所以我们给需要持久化的对象添

加属性.一个对应于上面数据库结构的类可以写成这个样子:

using System;

namespace NHibernate.Demo.QuickStart
{
public class User
{
private string id;
private string userName;
private string password;
private string emailAddress;
private DateTime lastLogon;


public User()
{
}

public string Id
{
get { return id; }
set { id = value; }
}

public string UserName
{
get { return userName; }
set { userName = value; }
}

public string Password
{
get { return password; }
set { password = value; }
}

public string EmailAddress
{
get { return emailAddress; }
set { emailAddress = value; }
}

public DateTime LastLogon
{
get { return lastLogon; }
set { lastLogon = value; }
}

}
}

在上面的代码里面,我们把属性和构造函数写成了public-NH并不要求一定要这样做.你可以使用public,protected,internal或者干脆

private来标记你的属性.

步骤3:编写映射文件(Mapping File)
现在我们有了数据库表和.Net类,我们还需要告诉NH怎样在数据库和类之间映射.这就需要映射文件了.最简捷(也是可维护性最好的)

方法就是为每一个类编写一个映射文件,如果你把命名为"XXX.hbm.xml"的映射文件和XXX类文件放在同一目录下,NH会很让 一切变得

很轻松.这儿,我们的User.hbm.xml可能会像这样:
<?xml version="1.0" encoding="utf-8" ?>


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


<class name="NHibernate.Demo.QuickStart.User, NHibernate.Demo.QuickStart" table="users">
<id name="Id" column="LogonId" type="String(20)">

<generator class="assigned" />

</id>

<property name="UserName" column="Name" type="String(40)"/>

<property name="Password" type="String(20)"/>

<property name="EmailAddress" type="String(40)"/>

<property name="LastLogon" type="DateTime"/>

</class>

</hibernate-mapping>
让我们来看看这个有趣的映射文件:第一个tag是class,这里我们把类型名(类名和Assembly名)映射到数据库中的user表(这里和hiber

nate有些不同,我们必须告诉NH这个类从哪儿来的.这个差异是由.Net和Java Reflect机制的不同引起的-zyyang).这种情况下,我们是

从Assembly NHibernate.Demo.QuickStart中载入NHibernate.Demo.QuickStart.User类..NH遵守.Net Framework使用Reflection载入

类型的规则-所以遇到什么疑惑,就去查查.NET Framework SDK.
让我们暂时跳过"id" tag,先说property节点."name"属性值就是我们写的.Net类中的属性,column属性值就是在数据库中与'Net类属

性对应的字段名.type属性是可选的(如果你没有标明,NH会给出一个最适合的),但是推荐的做法是带上这个属性.hibernate用户会注

意到,在type属性值里,我们给出了长度值,这是因为ADO.NET需要这样做.
让我们返回到"id" tag,你可能会猜想这个tag和映射到表的Primary Key有关.正确.ID tag的格式和Property

tag的相似.我们从Property(name)映射到目标数据库的字段(colume).
这些嵌入的Generator标记告诉NH怎样生成Primary Key(NH很方便的就能给你生成一个,不管是什么类型的,只要你告诉它怎样去做).

在我们举的例子中,把它设置成"assigned",意思是"我们的对象将自己生成key"(User对象将总是需要一个UserID),如果你乐意让NH代

替你生成,你会对uuid.hex和uuid.string类感兴趣的(参看chm文档).
Tip:如果你使用vs.net编译,设置Build Action,把User.hbm.xml文件作为资源绑定到Asssembly,这样映射文件就成了Asssembly的一

部分了.后面我们会明白这个步骤的重要性.

步骤4:创建数据库配置文件
目前为止,我们还没有告诉NH到哪儿去找数据库.最直接的方法就是在你程序的配置文件中给NH一个部分,就是这样:
<?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" />
<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="Server=localhost;initial

catalog=nhibernate;User ID=someuser;Password=somepwd;Min Pool Size=2" />

</nhibernate>

</configuration>
上面的例子中使用SqlClient驱动,连接到本地的nhibernate数据库,并且使用提供的用户和密码.还会有其他的配置项,你可以参看文

档.

步骤5:开始体验NHibernate的神奇
所有艰苦的工作已经做完了.如果所有的工作完成后,你将会有这些成果:
æ User.cs - 需要持久化的.Net类.
æ User.hbm.xml - 映射文件
æ app.config - 带有Ado.net连接信息的配置文件(你也可以在代码中指定的)
æ 一个叫做user的数据库表.

在代码里面使用NHibernate是很简单的事情:
1. 创建一个Configuration对象.
2. 告诉Configuration你想要持久化哪一种对象.
3. 创建一个Session连接到你设定的数据库.
4. 载入,保存和查询你的对象.
5. Flush()你的Session

好,让我们来看看一些代码:

创建一个Configuration对象....
Configuration对象知道所有在.Net类和后端数据库之间的映射关系,

Configuration cfg = new Configuration();
cfg.AddAssembly("NHibernate.Demo.QuickStart");

Configuration对象会查找这个Assembly中所有以.hbm.xml结尾的文件.也有其他的方法添加映射文件,这个可能是最简单的一个.

创建一个Session对象.......
ISession对象代表着一个到后端数据库连接,ITransaction代表一个NHibernate管理的事务(Transaction).

ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();

载入,保存和查询你的对象......

现在你可以以.net的方式对待这些对象.想在数据库中保存一个新的user?只需要:

User newUser = new User();
newUser.Id = "joe_cool";
newUser.UserName = "Joseph Cool";
newUser.Password = "abc123";
newUser.EmailAddress = "joe@cool.com";
newUser.LastLogon = DateTime.Now;

// Tell NHibernate that this object should be saved
session.Save(newUser);

// commit all of the changes to the DB and close the ISession
transaction.Commit();
session.Close();

这就是NH的好处,大部分时间内你只用关心你的业务对象(BO).

假如你需要根据已经知道的user ID查询一个对象,如果session是open的,你只需要一行:

// open another session to retrieve the just inserted user

session = factory.OpenSession();
User joeCool = (User)session.Load(typeof(User), "joe_cool");

这样你又会得到这个对象,设置一下对象的属性,它会在下一次Flush()方法出现的时候被持久化到数据库.

// set Joe Cool's Last Login property
joeCool.LastLogon = DateTime.Now;

// flush the changes from the Session to the Database
session.Flush();

让NH去写入你对对象作出的修改,你只需要Flush Session就可以了.

更好的是,你可以从数据库中查询到一个System.Collections.IList:

IList userList = session.CreateCriteria(typeof(User)).List();
foreach(User user in userList)
{
Console.WriteLine(user.Id + " last logged in at " + user.LastLogon);
}

这个查询会返回整个表的内容.尤其是当你想要更多的控制时候--像类出所有在March 14, 2004 10:00 PM之后登陆过的用户,你可以:

IList recentUsers = session.CreateCriteria(typeof(User)).Add(Expression.Gt("LastLogon", new DateTime(2004, 03, 14,

20, 0, 0))).List();
foreach(User user in recentUsers)
{
Console.WriteLine(user.Id + " last logged in at " + user.LastLogon);
}

文档里还有很多的查询选项,但是以上这些足够让你看出Hinernate的力量了.
不要忘记了,最后要关掉你的Session.

// tell NHibernate to close this Session
session.Close();


本来无一物,何处惹尘埃
It is empty at all here, Why pm 2.5 is so TMD high!
2007-04-16 09:37
冰镇柠檬汁儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:北京
等 级:版主
威 望:120
帖 子:8074
专家分:6657
注 册:2005-11-7
得分:0 
怎么没几个人看啊,难道是我弄的东西太简单了吗

本来无一物,何处惹尘埃
It is empty at all here, Why pm 2.5 is so TMD high!
2007-04-16 16:55
冰镇柠檬汁儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:北京
等 级:版主
威 望:120
帖 子:8074
专家分:6657
注 册:2005-11-7
得分:0 
我找到的都是些简单的东西,现在在学习这些,有个新项目要用这个,嘿嘿,.NET2005和NHibernate一起练习

本来无一物,何处惹尘埃
It is empty at all here, Why pm 2.5 is so TMD high!
2007-04-17 09:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-132176-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.923140 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved