Nhibernate

Nhibernate 半日游

Hibernatejava领域著名的ORM框架之一,NHibernate顾名思义Hibernate for .Net。它继承了Hibernate优秀思想。由于起步晚目前NHibernate不像Hibernate那样完善。用惯了微软的ADO.Net,也来看看另一片天地---- Nhibernate半日游。

今天是清明节,正好时间富余,拿出了半天到NHibernate里逛一逛。

首先,NHibernate的面向对象的观点是这样的,认为一个对象有需要持久化相关需求时,由另一个管理对象统一处理,也就是说对象的持久化不是其自身控制的,对象没有持久化自身的职责(这一点与很多其他的ORM框架不同如Castle)。

Image

 

准备,

环境:window XP2 , VS2003SQL server 2000

软件:NHibernate 1.2 (一些dll从官方下载)CodeSmith4.1

 

开始,

1.新建一个工程NHtest,目录:

Image

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.cstNHibernate.hbm.cst),配置数据库,填写命名空间和assembly名,生成:

UserInf表对应的UserInf.csUserInf.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,同时要把依赖项也包含进来,清单:

Image

4.DAO目录内新建DbManager.cs文件:

using System;

using org.zxs.NHtest.pono;

using NHibernate.Cfg;

using NHibernate;

using System.Collections;

using NHibernate.Expression;

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","Data Source=.;Database=pubs;User ID=sa;Password=;Trusted_Connection=False");

                   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步完成后就可以运行了,可以将depInfuserInf保存到数据库。一个调用NHibernate

完成持久化的Demo完成了。其实使用NHibernate的最大优势是,可以使用面向对象的思想与数据库打交道,由它托管对象到sql的处理。生成一整套实体对象(.cs)和映射文件(.hbm.xml)也有现成的模版(codeSimth非常快捷)

7.真正的面向对象查询。在javahibernate一个亮点QBC查询,在.Net中如何使用呢?修改test.csstatic void Main() 里内容为:

              DbManager dbManager=new DbManager ();

              //建立查询条件对象DetachedCriteria(使用NHibernate1.2以后的版本)

              NHibernate.Expression.DetachedCriteria dc=NHibernate.Expression.DetachedCriteria.For(typeof( UserInf));

              NHibernate.Expression.DetachedCriteria dc1=dc.CreateCriteria("DepInf");

              //增加查询条件,真正面向对象非sql语句哦

              NHibernate.Expression.EqExpression ee=new NHibernate.Expression.EqExpression ("DepName","IT2");

              NHibernate.Expression.LikeExpression le=new NHibernate.Expression.LikeExpression ("UserName","tyl",NHibernate.Expression.MatchMode.Anywhere);

              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版出来了,以此祝贺吧!


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值