NHibernate初學一之簡單增刪改查


以前有簡單了解NHibernate,但因項目一直沒有運用所以也沒有機會進行一個詳細了解;最近利用一點空閑的時間認真學習它;同樣希望把學習過程進行簡單記錄,今天簡單寫一個針對MSSQL數據庫的增刪改查的小實例,作為進行學習NHibernate第一步

一:ORM理論

ORM是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關系數據庫中。本質上就是將數據從一種形式轉換到另一種形式。數據持久化:就是將內存中的 數據模型轉換為存儲模型,以及將存儲模型轉換為內存中的數據模型的統稱。在應用程序中能永久地保存各個處理狀態信息的機制。如果沒有持久化這個機制,狀態只能保存在內存中,機器關機后就會丟失。


二:NHibernate簡介

NHibernate就是用於做數據持久化相關的編程工作,能夠使開發人員從原來枯燥的SQL語句的編寫中解放出來,解放出來的精力可以讓開發人員投入到業務邏輯的實現。NHibernate是由一個Java開源項目Hibernate發展來而來。與數據庫打交道主要是用NHibernate,NHibernate的開發者嘗試為其提供與Hibernate類似的API。使用前我們需要下載Nhibernate,

下載地址:http://sourceforge.net/projects/nhibernate/files/NHibernate/。

NHibernate-3.3.3.GA-src.zip 是源文件,里面有源代碼以及連接各種數據庫的寫法模板。

NHibernate-3.3.3.GA-bin.zip 是使用文件,解壓后能直接使用的dll。在接下的實例中,使用的NHibernate-3.3.3GA版本


三:NHibernate實例

實例中解決方案簡單的創建三層架構,符合開發過程中最簡單的運用;

 

1:首先在數據庫中創建一個表T_School,腳本如下:

復制代碼
USE [TestDb]
GO
/****** 對象:  Table [dbo].[T_School]    腳本日期: 03/01/2014 19:45:45 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T_School](
    [ID] [uniqueidentifier] NOT NULL,
    [SchoolName] [nvarchar](255) COLLATE Chinese_PRC_CI_AS NULL,
    [BuildDate] [datetime] NULL,
    [Address] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
    [IsSenior] [bit] NULL,
    [StudentNum] [int] NULL
) ON [PRIMARY]
復制代碼

2:創建實體層Model,實體中的字段還以virtual進行修飾

復制代碼
namespace Wujy.ModelLibrary.Entity
{
    public class SchoolModel
    {
        /// <summary>
        /// ID
        /// </summary>
        public virtual Guid ID
        {
            get;
            set;
        }
        /// <summary>
        /// SchoolName
        /// </summary>
        public virtual string SchoolName
        {
            get;
            set;
        }
        /// <summary>
        /// BuildDate
        /// </summary>
        public virtual DateTime? BuildDate
        {
            get;
            set;
        }
        /// <summary>
        /// Address
        /// </summary>
        public virtual string Address
        {
            get;
            set;
        }
        /// <summary>
        /// 高級
        /// </summary>
        public virtual bool IsSenior
        {
            get;
            set;
        }
        /// <summary>
        /// 人數
        /// </summary>
        public virtual int? StudentNum
        {
            get;
            set;
        }        
    }
}
復制代碼

2.1 此處還增加NHibernate需要的XML映射文件,以實體名+hbm.xml結尾並且還要設置其生成操作為"嵌入的資源";其中Class中的name是指實體類的完整名及類庫名稱,代碼如下

復制代碼
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Maticsoft" namespace="Maticsoft">
  <class name="Wujy.ModelLibrary.Entity.SchoolModel, Wujy.ModelLibrary" table="T_School">
    <id name="ID" column="ID" type="Guid"></id>
    <property name="SchoolName" column="SchoolName" type="string"  />
    <property name="BuildDate" column="BuildDate" type="DateTime"  />
    <property name="Address" column="Address" type="string"  />
    <property name="IsSenior" column="IsSenior" type="bool"  />
    <property name="StudentNum" column="StudentNum" type="int"  />
  </class>
</hibernate-mapping>
復制代碼

3:創建一個類庫作為DAL層,此處我們引用NHibernate兩個DLL,分別為NHibernate.dll及Iesi.Collection.dll;此處創建一個幫助類NHibernateHelper用於ISessionFactory;

復制代碼
using NHibernate;
using NHibernate.Cfg;

namespace Wujy.DalLibrary.DalHelp
{
    public class NHibernateHelper
    {
        private ISessionFactory _sessionFactory;
        public NHibernateHelper()
        {
            _sessionFactory = GetSessionFactory();
        }
        private ISessionFactory GetSessionFactory()
        {
            return (new Configuration()).Configure().BuildSessionFactory();
        }
        public ISession GetSession()
        {
            return _sessionFactory.OpenSession();
        }
    }
}
復制代碼

3.1:創建類SchoolDal並把一些操作的代碼寫入,如查不用transaction.Commit()則要運和isession.Flush()否則無法執行SQL就沒有效果:

復制代碼
using Wujy.ModelLibrary.Entity;
using NHibernate;
using Wujy.DalLibrary.DalHelp;

namespace Wujy.DalLibrary
{
    public class SchoolDal
    {
        private ISession isession;

        public SchoolDal()
        {
            isession = new NHibernateHelper().GetSession();
        }

        public void Add(SchoolModel model)
        {
            //如查不用transaction.Commit()則要運和isession.Flush()否則無法執行SQL就沒有效果
            //ITransaction transaction = isession.BeginTransaction();
            //isession.Save(model);
            //transaction.Commit();
            isession.Save(model);
            isession.Flush();
        }

        public bool Update(SchoolModel model)
        {
            try
            {
                isession.Update(model);
                isession.Flush();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                isession.Close();
            }
        }

        public bool Delete(SchoolModel model)
        {
            try
            {
                isession.Delete(model);
                isession.Flush();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                isession.Close();
            }
        }

        public SchoolModel GetSchoolById(Guid ID)
        {
            return isession.Get<SchoolModel>(ID);
        }

        public IList<SchoolModel> GetSchoolList()
        {
            IList<SchoolModel> list = null;
            list = isession.QueryOver<SchoolModel>().List();
            return list;
        }
    }
}
復制代碼

4:因為本實例重點是對NHibernate運用,對於邏輯層就簡單的引用;代碼也很簡單:

復制代碼
using Wujy.ModelLibrary.Entity;
using Wujy.DalLibrary;

namespace Wujy.BllLibrary
{
    public class SchoolBll
    {
        public static void Add(SchoolModel model) 
        {
            new SchoolDal().Add(model);
        }

        public static bool Update(SchoolModel model)
        {
            return new SchoolDal().Update(model);
        }

        public static bool Delete(SchoolModel model)
        {
            return new SchoolDal().Delete(model);
        }

        public static SchoolModel GetSchoolById(Guid ID)
        {
            return new SchoolDal().GetSchoolById(ID);
        }

        public static IList<SchoolModel> GetSchoolList()
        {
            return new SchoolDal().GetSchoolList();
        }
    }
}
復制代碼

5:WebUI除簡單調用BLL層外,另一個比較重要是NHibernate連接數據庫的配置文件,其中其屬性復制到輸出目錄改為"始終復制";Hibernate.cfg.xml內容:

復制代碼
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="NHibernateConfig">
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">Server=localhost;uid=sa;password=admin;database=TestDb</property>
    <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
    <property name="command_timeout">10</property>
    <mapping assembly="Wujy.ModelLibrary"/><!--表示映射Wujy.ModelLibrary實體程序集下的所有類,就不用一個個去映射-->
  </session-factory>
</hibernate-configuration>
復制代碼

 

 

感謝您的閱讀,堅持每天進步一點點,離成功就更新一步;希望文章對您有所幫助;源代碼下載

轉載至:http://www.cnblogs.com/wujy/p/3575542.html


免責聲明!

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



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