Nhibernate 半日游
Hibernate是java领域著名的ORM框架之一,NHibernate顾名思义Hibernate for .Net。它继承了Hibernate优秀思想。由于起步晚目前NHibernate不像Hibernate那样完善。用惯了微软的ADO.Net,也来看看另一片天地---- Nhibernate半日游。
今天是清明节,正好时间富余,拿出了半天到NHibernate里逛一逛。
首先,NHibernate的面向对象的观点是这样的,认为一个对象有需要持久化相关需求时,由另一个管理对象统一处理,也就是说对象的持久化不是其自身控制的,对象没有持久化自身的职责(这一点与很多其他的ORM框架不同如Castle)。
准备,
环境:window XP2 , VS2003,SQL server 2000
软件:NHibernate 1.2 (一些dll从官方下载),CodeSmith4.1
开始,
1.新建一个工程NHtest,目录:
2.在PUBS建表:
UserInf表:
CREATE TABLE [userInf] (
[userId] [int] IDENTITY (1, 1) NOT NULL ,
[userName] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[userPwd] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[depId] [int] NULL ,
PRIMARY KEY CLUSTERED
(
[userId]
) ON [PRIMARY] ,
CONSTRAINT [FK8FE779D59C88439] FOREIGN KEY
(
[depId]
) REFERENCES [depInf] (
[depId]
)
) ON [PRIMARY]
DepInf表:
CREATE TABLE [depInf] (
[depId] [int] IDENTITY (1, 1) NOT NULL ,
[depName] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[depDesc] [nvarchar] (300) COLLATE Chinese_PRC_CI_AS NOT NULL ,
PRIMARY KEY CLUSTERED
(
[depId]
) ON [PRIMARY]
) ON [PRIMARY]
GO
3.在CodeSmith的现有模版(NHibernate.class.cst和NHibernate.hbm.cst),配置数据库,填写命名空间和assembly名,生成:
UserInf表对应的UserInf.cs、UserInf.hbm.xml;
DepInf 表对应的DepInf.cs 、DepInf.hbm.xml。
codeSmith生成的映射文件版本应改为2.2(<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">)
并将生成的代码粘贴到VS2003项目对应的目录下。并且将两个hbm.xml文件设置为包含资源(Embedded Resource)。在工程中引用NHibernate.dll,同时要把依赖项也包含进来,清单:
4.在DAO目录内新建DbManager.cs文件:
using System;
using org.zxs.NHtest.pono;
using NHibernate.Cfg;
using NHibernate;
using System.Collections;
using NHibernate.Expr
using NHibernate.Collection;
namespace org.zxs.NHtest.dao
{
public class DbManager
{
private ISessionFactory _factory;
public DbManager()
{
NHConfigProperty config = new NHConfigProperty();
Configuration cfg = config.GetConfig();
this._factory = cfg.BuildSessionFactory();
}
public void Save(object obj)
{
ISession session = this._factory.OpenSession();
try
{
ITransaction transaction = session.BeginTransaction();
session.Save(obj);
transaction.Commit();
}
catch(Exception ex){
throw new Exception(ex.Message,ex);
}finally
{
session.Close();
}
}
}
}
NHConfigProperty.cs文件
using System;
using NHibernate.Cfg;
namespace org.zxs.NHtest.dao
{
/// <summary>
/// Summary description for NHConfigProperty.
/// </summary>
public class NHConfigProperty
{
public NHConfigProperty()
{
}
public Configuration GetConfig()
{
try
{
Configuration cfg = new Configuration();
cfg.SetProperty("hibernate.connection.provider","NHibernate.Connection.DriverConnectionProvider");
//请修改此行中的SQLServer的配置
cfg.SetProperty("hibernate.connection.connection_string","Da
cfg.SetProperty("hibernate.dialect","NHibernate.Dialect.MsSql2000Dialect");
cfg.SetProperty("hibernate.connection.driver_class","NHibernate.Driver.SqlClientDriver");
cfg.SetProperty("hibernate.show_sql","true");
//cfg.SetProperty("hibernate.hbm2ddl.auto","update");
cfg.AddAssembly("NHtest");
return cfg;
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
return null;
}
}
}
5.程序入口,新建test.cs文件
using System;
using org.zxs.NHtest.pono;
using org.zxs.NHtest.dao;
using System.Collections;
namespace org.zxs.NHtest
{
public class test
{
public test()
{
}
[STAThread]
static void Main()
{
//create depInf
DepInf depInf=new DepInf ();
//depInf.DepId=1;
depInf.DepName="IT2";
depInf.DepDesc="bbb";
//create UserInf
UserInf user=new UserInf ();
//user.UserId=1;
user.UserName="Tyler";
user.UserPwd="111111";
user.DepInf=depInf;
DbManager dbManager=new DbManager ();
dbManager.Save(depInf);
dbManager.Save(user);
}
}
}
6.第5步完成后就可以运行了,可以将depInf和userInf保存到数据库。一个调用NHibernate
完成持久化的Demo完成了。其实使用NHibernate的最大优势是,可以使用面向对象的思想与数据库打交道,由它托管对象到sql的处理。生成一整套实体对象(.cs)和映射文件(.hbm.xml)也有现成的模版(codeSimth非常快捷)
7.真正的面向对象查询。在java中hibernate一个亮点QBC查询,在.Net中如何使用呢?修改test.cs的static void Main() 里内容为:
DbManager dbManager=new DbManager ();
//建立查询条件对象DetachedCriteria(使用NHibernate1.2以后的版本)
NHibernate.Expr
NHibernate.Expr
//增加查询条件,真正面向对象非sql语句哦
NHibernate.Expr
NHibernate.Expr
dc.Add(le);
dc1.Add(ee);
//查询
IList list = dbManager.SearchByDC(dc);
foreach(object obj in list){
UserInf user1 =obj as UserInf;
System.Console.Out.WriteLine(user1.UserId+" "+user1.UserName+" "+user1.UserPwd);
}
因为调用dbManager.SearchByDC(dc);所以要为DbManager类增加一个检索方法(注意这可是一个通用的方法哦,NHibenate的强大之处!!)
public IList SearchByDC(DetachedCriteria dc)
{
ISession session = this._factory.OpenSession();
ICriteria criteria= dc.GetExecutableCriteria(session);
return criteria.List();
}
8.按照这个思路,使用NHibernate制作一个通用DAO对象,实现对象object的增删改查。
9.如果再使用Spring.Net,对它实现的封装将更加强大和简洁。在此不做阐述(半日游的时间到了)
最后,需要指出程序只为说明NHibernate的使用和思想,在项目中有意去除了业务逻辑层。目的达到了。
刚刚看到NHibernate2.0alpha版出来了,以此祝贺吧!