之前的文章寫的東西比較雜亂,也許很多人並不熟悉NUnit,所以本文舉的例子跟NUnit是脫離的,對於初學者而言,最主要的還是單表操作,以及明白NHibernate究竟給我們帶來了什麼革命性的勝利。希望對大家在進行NHibernate單表操作的時候有點啟發。流程大致包括
0、建立資料庫和資料表
1、建立項目NHibernateSingle
2、建立App.Config設定資料庫串連(本文使用的是SQL Server2000)
3、建立Sessions類建立Session對象
4、建立ObjectBroker類用於封裝Nhibernate操作
5、建立UserInfo類
6、建立UserInfo對應檔UserInfo.hbm.xml
7、在Main函數中添加測試代碼
0 建立資料庫和資料表
先建立資料庫,名稱取為NHibernate,然後建立資料表UserInfo.
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserInfo]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)<br />drop table [dbo].[UserInfo]<br />GO</p><p>CREATE TABLE [dbo].[UserInfo] (<br />[UserID] [int] IDENTITY (1, 1) NOT NULL ,<br />[UserName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,<br />[UserPwd] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,<br />[UserRole] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL<br />) ON [PRIMARY]<br />GO</p><p>
1 建立項目NHibernateSingle(如所示):注意添加引用NHibernate
2、建立App.Config設定資料庫串連(本文使用的是SQL Server2000)
<?xml version="1.0" encoding="utf-8" ?><br /><configuration></p><p> <configSections><br /> <!--定義NHibernate配置節的處理類 --><br /> <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" /><br /> </configSections><br /> <nhibernate><br /> <!--指定在log中是否顯示sql語句, 用於調試 --><br /> <add key="hibernate.show_sql" value="true" /><br /> <!--資料庫連接提供 --><br /> <add key="hibernate.connection.provider"<br /> value="NHibernate.Connection.DriverConnectionProvider" /><br /> <!--指定資料庫方言, NHB可以針對資料庫方言進行最佳化 --><br /> <add key="hibernate.dialect"<br /> value="NHibernate.Dialect.MsSql2000Dialect" /><br /> <!--資料驅動對象 --><br /> <add key="hibernate.connection.driver_class"<br /> value="NHibernate.Driver.SqlClientDriver" /><br /> <!--連接字串, userid和password改成你自己的哦。 --><br /> <add key="hibernate.connection.connection_string"<br /> value="Server=localhost;initial catalog=NHibernate;user id=sa;password=123;Min Pool Size=2" /><br /> </nhibernate><br /></configuration>
3、建立Sessions類建立Session對象
using System;<br />using System.Collections.Generic;<br />using System.Text;<br />using NHibernate;<br />using System.Reflection;</p><p>namespace NHibernateSingle<br />{<br /> public class Sessions<br /> {<br /> private static readonly object lockObj = new object();<br /> private static ISessionFactory _factory;</p><p> public Sessions()<br /> {<br /> //<br /> // TODO: 在此處添加建構函式邏輯<br /> //<br /> }<br /> public static ISessionFactory Factory<br /> {<br /> get<br /> {<br /> if (_factory == null)<br /> {<br /> lock (lockObj)<br /> {<br /> if (_factory == null)<br /> {<br /> NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();<br /> cfg.AddAssembly(Assembly.GetExecutingAssembly());<br /> _factory = cfg.BuildSessionFactory();<br /> }<br /> }<br /> }<br /> return _factory;<br /> }<br /> }<br /> public static ISession GetSession()<br /> {<br /> return Factory.OpenSession();<br /> }</p><p> }<br />}<br />
4、建立ObjectBroker類用於封裝Nhibernate操作,再建立BizObject類用於封裝ObjectBroker類操作
ObjectBroker.cs
using System;<br />using System.Collections.Generic;<br />using System.Text;<br />using NHibernate;</p><p>namespace NHibernateSingle<br />{<br /> public class ObjectBroker<br /> {<br /> private ObjectBroker() { }</p><p> public static void Load(object obj, object id)<br /> {<br /> ISession s = Sessions.GetSession();<br /> try<br /> {<br /> s.Load(obj, id);<br /> }<br /> finally<br /> {<br /> s.Close();<br /> }<br /> }</p><p> public static void Create(object obj)<br /> {<br /> ISession s = Sessions.GetSession();<br /> ITransaction trans = null;<br /> try<br /> {<br /> trans = s.BeginTransaction();<br /> s.Save(obj);<br /> trans.Commit();<br /> }<br /> finally<br /> {<br /> s.Close();<br /> }<br /> }</p><p> public static void Update(object obj)<br /> {<br /> ISession s = Sessions.GetSession();<br /> ITransaction trans = null;<br /> try<br /> {<br /> trans = s.BeginTransaction();<br /> s.Update(obj);<br /> trans.Commit();<br /> }<br /> finally<br /> {<br /> s.Close();<br /> }<br /> }</p><p> public static void Delete(object obj)<br /> {<br /> ISession s = Sessions.GetSession();<br /> ITransaction trans = null;<br /> try<br /> {<br /> trans = s.BeginTransaction();<br /> s.Delete(obj);<br /> trans.Commit();<br /> }<br /> finally<br /> {<br /> s.Close();<br /> }<br /> }<br /> }</p><p>}<br />
BizObject.cs
using System;<br />using System.Collections.Generic;<br />using System.Text;<br />using NHibernate;<br />using NUnit.Framework;</p><p>namespace NHibernateSingle<br />{<br /> public class BizObject<br /> {<br /> public BizObject() { }</p><p> public BizObject(object existingId)<br /> {<br /> ObjectBroker.Load(this, existingId);<br /> }<br /> public virtual void Create()<br /> {<br /> ObjectBroker.Create(this);<br /> }<br /> public virtual void Update()<br /> {<br /> ObjectBroker.Update(this);<br /> }<br /> public virtual void Delete()<br /> {<br /> ObjectBroker.Delete(this);<br /> }<br /> }<br />}<br />
5、建立UserInfo類,從BizObject繼承
using System;<br />using System.Collections.Generic;<br />using System.Text;</p><p>namespace NHibernateSingle<br />{<br /> class UserInfo : BizObject<br /> {<br /> public UserInfo() : base() { }<br /> public UserInfo(int existingId) : base(existingId) { }<br /> private int _userid=0;<br /> private String _username;<br /> private String _userpwd;<br /> private String _userrole;</p><p> public int UserID<br /> {<br /> set { this._userid = value; }<br /> get { return this._userid; }<br /> }</p><p> public String UserName<br /> {<br /> set { this._username = value; }<br /> get { return this._username; }<br /> }</p><p> public String UserPwd<br /> {<br /> set { this._userpwd = value; }<br /> get { return this._userpwd; }<br /> }</p><p> public String UserRole<br /> {<br /> set { this._userrole = value; }<br /> get { return this._userrole; }<br /> }<br /> }<br />}<br />
6、建立UserInfo對應檔UserInfo.hbm.xml(檔案名稱必須保持一致)
<?xml version="1.0" encoding="utf-8" ?><br /><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"><br /> <class name="NHibernateSingle.UserInfo, NHibernateSingle" table="UserInfo" lazy="false"><br /> <id name="UserID" column="UserID" type="Int32" unsaved-value="0"><br /> <generator class="identity"/><br /> </id><br /> <property name="UserName" column="UserName" type="String" /><br /> <property name="UserPwd" column="UserPwd" type="String" /><br /> <property name="UserRole" column="UserRole" type="String" /><br /> </class><br /></hibernate-mapping>
7、在Main函數中添加測試代碼
using System;<br />using System.Collections.Generic;<br />using System.Text;<br />using NHibernate;<br />using NUnit.Framework;</p><p>namespace NHibernateSingle<br />{<br /> class Program<br /> {<br /> static void Main(string[] args)<br /> {<br /> UserInfo u = new UserInfo();<br /> u.UserName = "rocket";<br /> u.UserPwd = "rrr";<br /> u.UserRole = "admin";<br /> u.Create();//insert操作</p><p> UserInfo u2 = new UserInfo(u.UserID);<br /> u2.UserPwd = "rrrrr";<br /> u2.Update();//update操作</p><p> UserInfo u3 = new UserInfo(u.UserID);<br /> u3.Delete();//delete操作<br /> }<br /> }<br />}<br />
結論
此時運行解決方案後,就可以在資料表中看到插入的資料,使用者可以根據以上的代碼就可以進行insert、update、delete操作了。此時我們再看一下整個解決方案的檔案組織圖,以及看到Main函數中執行的語句,大家就可以知道NHibernate究竟協助我們做了些什麼工作了。