請注明轉載地址:http://www.cnblogs.com/arhat
在上一章中,我們配置了以下NHibernate的運行環境, 並介紹了NHibernate的中兩個非常中重要的接口”ISessionFactory”和”ISession”。那么今天我們將主要學習一下NHibernate是如何通過配置文件來操作數據庫的。
重新打開我們的項目“NHibernateStudy”。然后在通過MySql來創建School的一張表“Student”。SQL腳本如下:
然后在NHibernateStudy解決方案中我們創建一個Model的類庫。同時對DAL,NHibernateTest對Model的引用。在Model中創建一個Config文件夾用來存放映射文件。
由於在數據庫中,我們有了一張表,那么我們在DAL中創建一個實體類為Student.cs建議大家在創建這個實體類的時候名字和數據庫表的名字一樣,這樣好對應。當我們創建好Student.cs類的時候,我們的目的就是讓這個實體類和數據庫表Student對應起來。Student.cs的內容如下:
public class Student { public virtual int SId { get; set; } public virtual string SName { get; set; } public virtual string SSex { get;get; } public virtual DateTime SBirthday{get;set;} }
大家需要注意的地方是,平時我們在定義實體類的時候並沒有對其屬性設置virtual屬性,但是如果我們使用NHibernate的時候,NHibernate要求我們的實體類必須是virtual的。
下面是比較重要的內容,我們現在就要創建一個映射文件,用來把實體類和數據庫表進行一個關聯。在Config下創建一個Student.hbm.xml文件。內容如下:
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping assembly="Model" namespace="Model" xmlns="urn:nhibernate-mapping-2.2"> <class name="Student" table="Student"> <id name="SId" type="int"> <column name="sid"></column> <generator class="native"></generator> </id> <property name="SName" type="string"> <column name="sname"/> </property> <property name="SSex" type="string"> <column name="ssex"/> </property> <property name="SBirthday" type="DateTime"> <column name="sbirthday"/> </property> </class> </hibernate-mapping>
這個文件就是一個映射文件,把Student類和Student表對應起來了,但是在寫這個文件的時候,需要注意的是:
hibernate-mapping節點中的assembly是設置程序級的名稱,namespace是實體類的命名空間。
class節點是要對應那個類,其中name屬性的值是“類名”,table屬性是指這個類要對應數據庫的那個表。
id節點是非常重要的,它關乎了表中主鍵和對象之間的關系,name是對象的屬性名,column設置對應表中的那個主鍵,generator 是設置這個主鍵的生成方式是什么,這里是native使用本地的策略(MySQL中,主鍵是auto_increment)。
property節點是用來設置對象屬性和表字段的對應關系,name是對象的屬性名,column是表的字段名。這里一定注意一一對應。
然后選中這個xml文件,把他的屬性設置為“嵌入的資源”,這里非常的重要,否則NHibernate是找不到這個文件的。
然后,我們打開App.config文件,加入一個節點,讓NHibernate能夠找到這個映射文件。
mapping節點就用來設置從哪讀取映射五年,assembly是設置從哪個程序集中讀取文件。由於我們的映射文件是在Model中,所以這里設置為Model。注意程序集和命名空間不同。
下面呢,我們來試着向數據庫中插入一條記錄,看是否能夠成功。在DAL中我們新建一個類“D_User”,內容如下:
public class D_User { public void Add(Model.Student student) { using (ISession session = NHibernateHelper.OpenSession()) { //保存一條記錄 session.Save(student); } } }
然后,我們在NHibernateTest主項目中創建D_User對象,並調用Add方法執行。
static void Main(string[] args) { TestSave(); } public static void TestSave() { DAL.D_User dal = new DAL.D_User(); dal.Add(new Model.Student { SName="大話濟公",SSex="男",SBirthday=DateTime.Now}); }
Ctrl+F5來運行一下,發現打開的DOS窗口中打印出了NHibernate生成的SQL語句。
然后我們查看一下數據庫時候多了一條數據,
的確,在數據庫中我們添加了一條數據。現在我們把ISession常用的方法給用一下,上面我們使用的是Save方法,用來保存對象的,現在我們來查詢一條數據。更改D_User代碼如下:
public Model.Student GetUser(int id) { using (ISession session = NHibernateHelper.OpenSession()) { return session.Get<Model.Student>(id); } }
在主程序中改寫代碼:
static void Main(string[] args) { TestGet(); } public static void TestGet() { DAL.D_User dal = new DAL.D_User(); Model.Student student = dal.GetUser(1); Console.WriteLine(""); Console.WriteLine("Student ,Id:"+student.SId+",Name:" + student.SName + ",Sex:" + student.SSex + ",Birthday:" + student.SBirthday); Console.WriteLine(""); }
我們已經正確的得到了結果。那么這只是得到一條記錄,如果是多條的話,老魏會在后面的章節中講述IQuery接口和HQL語句。
下面,我們看一下更新是怎么實現的。還是首先更改一下D_User的代碼:
public void EditUser(Model.Student student) { using (ISession session = NHibernateHelper.OpenSession()) { using (ITransaction trans = session.BeginTransaction()) { try { session.Update(student); trans.Commit(); } catch (Exception ex) { throw new Exception("更新數據異常信息:" + ex.Message); } finally { trans.Rollback(); } } } }
從上面的代碼中,我們看到了,在更新數據的時候,NHibernate要求我們必須使用事務,所以我們使用了ITransaction來提交事務和回滾事務。
然后我們更改一下主程序代碼:
static void Main(string[] args) { TestUpdate(); } public static void TestUpdate() { DAL.D_User dal = new DAL.D_User(); Model.Student student = dal.GetUser(1); student.SName = "劑顛長老"; try { dal.EditUser(student); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
運行一下,看看結果:
數據庫查詢結果:
我們會發現,NHibernate提交了兩個SQL語句,一個是用來得到數據的,一個是更新數據的。到現在位置,我們會得到數據,更新數據,插入數據了,現在就掉一個刪除數據了,我們來看看如何刪除數據的。同理,更新一下D_User
public void DeleteUser(Model.Student student) { using (ISession session = NHibernateHelper.OpenSession()) { using (ITransaction trans = session.BeginTransaction()) { try { session.Delete(student); trans.Commit(); } catch (Exception ex) { throw new Exception("更新數據異常信息:" + ex.Message); trans.Rollback(); } finally { } } } }
同理,在刪除數據的時候,也是要使用事務的。主程序代碼:
static void Main(string[] args) { TestDelete(); } public static void TestDelete() { DAL.D_User dal = new DAL.D_User(); Model.Student student = dal.GetUser(1); try { dal.DeleteUser(student); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
運行結果如下:
數據庫查詢結果如下:
到此為止,ISession提供的Save,Update,Delete,Get方法就給大家講述到此了,其中在使用Update,Delete的時候要注意使用事務。