一步步學習NHibernate(3)——NHibernate增刪改查


請注明轉載地址:http://www.cnblogs.com/arhat

在上一章中,我們配置了以下NHibernate的運行環境, 並介紹了NHibernate的中兩個非常中重要的接口”ISessionFactory”和”ISession”。那么今天我們將主要學習一下NHibernate是如何通過配置文件來操作數據庫的。

重新打開我們的項目“NHibernateStudy”。然后在通過MySql來創建School的一張表“Student”。SQL腳本如下:

wps_clip_image-21991

然后在NHibernateStudy解決方案中我們創建一個Model的類庫。同時對DAL,NHibernateTest對Model的引用。在Model中創建一個Config文件夾用來存放映射文件。

wps_clip_image-17153

由於在數據庫中,我們有了一張表,那么我們在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是找不到這個文件的。
wps_clip_image-31139

      然后,我們打開App.config文件,加入一個節點,讓NHibernate能夠找到這個映射文件。

wps_clip_image-32544

      mapping節點就用來設置從哪讀取映射五年,assembly是設置從哪個程序集中讀取文件。由於我們的映射文件是在Model中,所以這里設置為Model。注意程序集和命名空間不同。

wps_clip_image-18672
      下面呢,我們來試着向數據庫中插入一條記錄,看是否能夠成功。在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語句。

wps_clip_image-6490

然后我們查看一下數據庫時候多了一條數據,

wps_clip_image-10366

的確,在數據庫中我們添加了一條數據。現在我們把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("");

        }

運行一下看看結果:
wps_clip_image-7194

我們已經正確的得到了結果。那么這只是得到一條記錄,如果是多條的話,老魏會在后面的章節中講述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);

            }

        }

運行一下,看看結果:

wps_clip_image-14240

數據庫查詢結果:

wps_clip_image-13745

我們會發現,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);

            }

        }

運行結果如下:

wps_clip_image-28289

數據庫查詢結果如下:

wps_clip_image-31802

到此為止,ISession提供的Save,Update,Delete,Get方法就給大家講述到此了,其中在使用Update,Delete的時候要注意使用事務。


免責聲明!

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



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