NHibernate學習筆記之一,Hello world!


NHibernate是一個面向.NET環境的對象/關系數據庫映射框架,主要應用在數據持久層,和其它的ORM框架一樣用來把對象模型表示的對象映射到基於SQL的關系模型數據結構中去。Nhibernate 來源於非常優秀的基於JavaHibernate 關系型持久化框架。Nhibernate支持多種類型的數據庫,包括:FireBirdMSSQLMySqlOraclePostgreSQLSQLiteSybaseASESybaseSQLAnywhere

准備工作:

需要使用.NET Framework 2.0或上以版本的框架,准備NHibernate框架,本文使用3.3版,到目前NHibernate都還是基於.net framework 2.0,官方下載地址:http://sourceforge.net/projects/nhibernate/files/,如果嫌麻煩,可以下載本文示例,中間包含了NHibernate

開始做一個簡單的增刪改查示例,如圖1示例:

 圖1

1、創建數據庫與表,這里假設使用NibernateDemo數據庫,Users表包括(id,name,pwd)字段,id是主鍵自動增長,namepwdvarchar(16)

2、新建項目並添加引用,將NHibernate-3.3.0.GA-bin中的“Iesi.Collections.dll”與“NHibernate”引用到項目中,如圖2所示復制Configuration_Templates文件夾中的對應數據庫配置文件,這里使用MSSQL,所以復制“MSSQL.cfg.xml”,並對NHibernate的配置信息適當修改

2

<? xml version="1.0" encoding="utf-8" ?>
< hibernate-configuration   xmlns ="urn:nhibernate-configuration-2.2"   >
     < session-factory  name ="NHibernateDemo" >
         < property  name ="connection.driver_class" >NHibernate.Driver.SqlClientDriver </ property >
         < property  name ="connection.connection_string" >
            server=.;uid=sa;pwd=sa;database=NibernateDemo;
         </ property >
         < property  name ="dialect" >NHibernate.Dialect.MsSql2008Dialect </ property >
         < mapping  assembly ="NHibernateDemo.WebUI" />
     </ session-factory >
</ hibernate-configuration >

其中connection.driver_class表示數據庫客戶端驅動類型;connection.connection_string表示連接字符串;dialect表示數據庫類型,如果數據庫為MSSQL2005則應修改為NHibernate.Dialect.MsSql2005Dialectmapping表示映射NHibernateDemo.WebUI命名空間下的所有類型,包含持久化類以及對應映射文件所在的應用程序集名稱

3、編寫實體類(POCOPlain Old CLR Objects),映射文件包含POCO類映射到一個或者多個數據庫表的元數據信息。User.cs文件如下所示。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace NHibernateDemo.WebUI
{
     public  class User
    {
         public  virtual  int Id {  getset; }
         public  virtual  string Name {  getset; }
         public  virtual  string Pwd {  getset; }
    }
}

NHibernate持久化類的所有的public的屬性必須聲明為virtual,否則映射不成功。

4、為POCO類編寫寫一個數據庫映射文件,其實User.hbm.xml映射文件包含了對象/關系映射(ORM)所需的元數據。元數據包含持久化類的聲明和屬性到數據庫的映射。該文件將POPO類型與數據表進行映射。User.hbm.xml內容如下所示。

<? xml version="1.0" encoding="utf-8"  ?>
< hibernate-mapping  xmlns ="urn:nhibernate-mapping-2.2"  namespace ="NHibernateDemo.WebUI"  assembly ="NHibernateDemo.WebUI" >
     < class  name ="NHibernateDemo.WebUI.User,NHibernateDemo.WebUI"  table ="Users"  lazy ="false" >
         < id  name ="Id"  column ="id"  unsaved-value ="0" >
             < generator  class ="native"   />
         </ id >
         < property  name ="Name"  column ="name"  type ="string"  length ="16"  not-null ="true" ></ property >
         < property  name ="Pwd"   column ="pwd"   type ="string"  length ="16"  not-null ="false" ></ property >
     </ class >
</ hibernate-mapping >

 

每個持久化類都應該有一個標識屬性,該文件必須輸出到Bin目錄中,否則會報錯“xxx is not mapped,如圖3所示具體方法是:選擇User.hbm.xml文件->屬性->生成操作,設置這個屬性的值為“嵌入的資源”

3

5定義NHibernateHelper的幫助類,IsessionNHibernate的工作單元,它是一個持久化管理器,我們通過ISession來從數據庫中存取數據ISessionFactory代表一個數據庫,並且使用一個XML配置文件(Web.config或者hibernate.cfg.xml)。 NHibernate通過對Configuration().Configure()的調用來裝載配置文件,並初始化成一個Configuration實例,一般ISessionFactory通常只是被初始化一次,可以借助Application_startNHibernateHelper.cs如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using NHibernate;
using NHibernate.Cfg;

namespace NHibernateDemo.WebUI
{
     ///   <summary>
    
///  管理ISession對象的輔助類
    
///   </summary>
     public  sealed  class NHibernateHelper
    {
         private  static  readonly ISessionFactory sessionFactory;

         static NHibernateHelper()
        {
             // 獲得NHibernate對當前使用的MSSQL數據庫配置文件的物理路徑
             string configPath = HttpContext.Current.Server.MapPath( " ~/MSSQL.cfg.xml ");
             // 通過配置信息創建一個NHibernate實例
            sessionFactory =  new Configuration().Configure(configPath).BuildSessionFactory();
        }

         // 獲得當前NHibernate實例
         public  static ISession GetCurrentSession()
        {
            ISession currentSession = sessionFactory.OpenSession();
             return currentSession;
        }

         // 關閉NHibernate實例
         public  static  void CloseSessionFactory()
        {
             if (sessionFactory !=  null)
            {
                sessionFactory.Close();
            }
         }
     }
}

6、編寫數據庫訪問層代碼,UsersDAL.cs代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using NHibernate;

namespace NHibernateDemo.WebUI
{
     public  class UsersDAL
    {
         // 介於NHibernate與.NET應用程序中的主運行接口
        ISession session =  null;
         // 獲得所有用戶
         public IList<User> GetAllUsers()
        {
             try
            {
                 // 獲得當前運行的NHibernate實例
                session = NHibernateHelper.GetCurrentSession();
                 // 事務開始
                ITransaction transaction = session.BeginTransaction();
                 // 執行HQL查詢
                IList<User> users = session.CreateQuery( " from User ").List<User>();
                 // 提交事務
                transaction.Commit();
                 return users;
            }
             catch (Exception)
            {
                 throw;
            }
             finally
            {
                 // 關閉與ADO.NET的連接
                session.Close();
            }
        }

         // 添加
         public  int Add(User user)
        {
             try
            {
                session = NHibernateHelper.GetCurrentSession();
                ITransaction transaction = session.BeginTransaction();
                session.Save(user);
                transaction.Commit();
                 return user.Id;
            }
             catch (Exception)
            {
                 throw;
            }
             finally
            {
                session.Close();
            }
        }

         // 獲得單個對象通過編號
         public User GetUserById( int id)
        {
             try
            {
                session = NHibernateHelper.GetCurrentSession();
                ITransaction transaction = session.BeginTransaction();
                User user = session.Load<User>(id);
                transaction.Commit();
                 return user;
            }
             catch (Exception)
            {
                 throw;
            }
             finally
            {
                session.Close();
            }
        }

         // 更新
         public  void Update(User user)
        {
             try
            {
                session = NHibernateHelper.GetCurrentSession();
                ITransaction transaction = session.BeginTransaction();
                session.SaveOrUpdate(user);
                transaction.Commit();
            }
             catch (Exception)
            {
                 throw;
            }
             finally
            {
                session.Close();
            }
        }

         // 刪除
         public  void Delete( int id)
        {
             try
            {
                User user = GetUserById(id);
                session = NHibernateHelper.GetCurrentSession();
                ITransaction transaction = session.BeginTransaction();
                 if (user !=  null)
                {
                    session.Delete(user);
                }
                transaction.Commit();
            }
             catch (Exception)
            {
                 throw;
            }
             finally
            {
                session.Close();
            }
        }


    }
}

7、在表示層使用UserDAL中的方法。

總結:這個示例算是對Nhibernate學習的一個“Hello world”,內容中有不少是參照前輩們的文章,我只是學習和分享學習。Nhibernate的學習資源遠比不上Hibernate,性能不如ADO.NET,但它能是.NET平台中比較優秀的一個ORM框架之一,Hibernate還有很長的路要走。學習筆記而以,請大家海涵。

 

 示例下載,有數據庫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM