之前有簡單瞭解NHibernate,但因項目一直沒有運用因此也沒有機會進行一個詳細瞭解;最近利用一點空閒的時間認真學習它;一樣但願把學習過程進行簡單記錄,今天簡單寫一個針對MSSQL數據庫的增刪改查的小實例,做爲進行學習NHibernate第一步git
一:ORM理論github
ORM是經過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關係數據庫中。本質上就是將數據從一種形式轉換到另外一種形式。數據持久化:就是將內存中的 數據模型轉換爲存儲模型,以及將存儲模型轉換爲內存中的數據模型的統稱。在應用程序中能永久地保存各個處理狀態信息的機制。若是沒有持久化這個機制,狀態只能保存在內存中,機器關機後就會丟失。數據庫
二:NHibernate簡介編程
NHibernate就是用於作數據持久化相關的編程工做,可以使開發人員從原來枯燥的SQL語句的編寫中解放出來,解放出來的精力可讓開發人員投入到業務邏輯的實現。NHibernate是由一個Java開源項目Hibernate發展來而來。與數據庫打交道主要是用NHibernate,NHibernate的開發者嘗試爲其提供與Hibernate相似的API。使用前咱們須要下載Nhibernate,微信
下載地址:http://sourceforge.net/projects/nhibernate/files/NHibernate/。session
NHibernate-3.3.3.GA-src.zip 是源文件,裏面有源代碼以及鏈接各類數據庫的寫法模板。架構
NHibernate-3.3.3.GA-bin.zip 是使用文件,解壓後能直接使用的dll。在接下的實例中,使用的NHibernate-3.3.3GA版本app
三:NHibernate實例ide
實例中解決方案簡單的建立三層架構,符合開發過程當中最簡單的運用;學習
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>
感謝您的閱讀,堅持天天進步一點點,離成功就更新一步;但願文章對您有所幫助;源代碼下載
最近有個妹子弄的一個關於擴大眼界跟內含的訂閱號,天天都會更新一些深度內容,在這裏若是你感興趣也能夠關注一下(嘿對美女跟知識感興趣),固然能夠關注後輸入:github 會有個人微信號,若是有問題你也能夠在那找到我;固然不感興趣無視此信息;