<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      地平線

      ......

      ADO.NET與ORM的比較:NHibernate實現(xiàn)CRUD(轉(zhuǎn))

      原文地址

      http://blog.csdn.net/zhoufoxcn/article/details/5402511

       

      說明:個人感覺在Java領(lǐng)域大型開發(fā)都離不了ORM的身影,所謂的SSH就是Spring+Struts+Hibernate,除了在學習基礎知識的時候被告知可以使用JDBC操作數(shù)據(jù)庫之外,大量的書籍中都是講述使用Hibernate這個ORM工具來操作數(shù)據(jù)。在.NET中操作數(shù)據(jù)庫的方式有多種,除了最直接的方式就是使用ADO.NET之外,還可以使用NHibernate這個Hibernate在.NET中的實現(xiàn)ORM,如果你對第三方的ORM持懷疑態(tài)度,你還可以使用來自微軟的實現(xiàn)、根正苗紅的Linq或者EntityFramework。
      大部分從早期就開始使用.NET開發(fā)的程序員可能對ADO.NET有種迷戀,使用ADO.NET可以充分將我們早期的SQL知識發(fā)揮得淋漓盡致,并且出于對性能的考慮,有些人對.NET中的ORM還保持一種觀望態(tài)度,包括我自己也是這種態(tài)度。不過即使在實際開發(fā)中不用,并不代表我們不能去了解和比較這些技術(shù),任何事物的出現(xiàn)和消亡總有其原因的,我們可以了解它們的優(yōu)點和長處。所以本人抽出了幾個周末的時間分別用ADO.NET、NHibernate、Linq和EntityFramework來實現(xiàn)對數(shù)據(jù)庫單表數(shù)據(jù)的創(chuàng)建、讀取、更新和刪除操作,也就是所謂的CRUD(C:Create/R:Read/U:Update/D:Delete)。
      通過實現(xiàn)相同功能的比較,大家自己判斷那種方式更適合自己。需要說明的是,如果在VS2008中使用EntityFramework就需要安裝VS2008SP1。
      在本篇周公將講述如何利用NHibernate實現(xiàn)CRUD功能,為了便于對比,在本次中采用與上次同樣的數(shù)據(jù)庫和表,并且也實現(xiàn)同樣的功能。NHibernate是一個ORM框架,所謂ORM就是Object Relational Mapping,是一種將關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)與面向?qū)ο笳Z言中對象建立映射關(guān)聯(lián)的技術(shù),我們可以想操作對象一樣操作數(shù)據(jù),NHibernate將我們對對象的變更保存到數(shù)據(jù)庫中去,并且還負責以對象的方式從數(shù)據(jù)庫中查詢數(shù)據(jù),這樣就可以使開發(fā)人員從處理SQL和ADO.NET上節(jié)省一些時間和精力用于處理業(yè)務邏輯。
      1、準備
      首先我們需要從網(wǎng)上下載NHibernate框架,這個可以到它的官方網(wǎng)站www.nhibernate.org上去下載,在周公寫這篇文章的時候從網(wǎng)上能下載到的最新版本為2.1.2.GA。如果下載的是壓縮包,請將壓縮包解壓,將會看到四分文件夾,它們的名稱和作用分別如下:
      Configuration_Templates:存放NHibernate連接數(shù)據(jù)庫的配置文件的示例,在這個文件夾下分別有連接Firebird、SQL Server、MySQL、Oracle、PostgreSQL和SQLite數(shù)據(jù)庫的配置示例,可以根據(jù)實際所使用的數(shù)據(jù)庫選擇示例中的代碼并更改其中的數(shù)據(jù)源即可。
      Required_Bins:存放NHibernate運行過程中所需要的類庫文件,其中還包含了第三方的開源日志框架Log4Net,在不確定到底會使用那些類庫的條件下建議將這個文件夾下所有的dll文件拷貝到項目的bin文件夾下。
      Required_For_LazyLoading:存放延時加載特性支持所需的框架文件,在這個文件夾下提供了三種實現(xiàn),選擇一種將其下所有的dll文件拷貝到項目所在的bin文件夾下。在本示例中選擇了Castle。
      Tests:存放測試用文件,在此文件夾下還有一個名為ABC.hbm.xml的文件,這是一個數(shù)據(jù)表對應的配置文件的示例,在這個文件夾下的文件我們都用不著,不過在以后我們會用到.hbm.xml文件。
      2、創(chuàng)建項目
      我們創(chuàng)建一個項目,項目類型可以根據(jù)情況選擇,因為我今后要使用NUnit來對項目進行單元測試,所以創(chuàng)建的類庫項目。
      創(chuàng)建項目成功之后將如下文件拷貝到項目的bin目錄下:
      Antlr3.Runtime.dll
      Castle.Core.dll
      Castle.DynamicProxy2.dll
      Iesi.Collections.dll
      log4net.dll
      NHibernate.ByteCode.Castle.dll
      NHibernate.dll
      然后在項目中添加對這些dll的引用,如下圖所示:
       
      3、編寫代碼
      3.1創(chuàng)建NHibernate配置文件
      NHibernate的配置文件有相對比較固定的格式,這個可以從下載到框架文件壓縮包解壓得到,位于Configuration_Templates文件夾下。
      向當前項目添加一個名為hibernate.cfg.xml的xml文件,在周公的機器上這個文件的格式內(nèi)容如下:

      [xhtml] view plaincopy
      1. <?xml version="1.0" encoding="utf-8" ?>  
      2. <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >  
      3.  <session-factory>  
      4.   <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>  
      5.   <property name="connection.connection_string">  
      6.    Data Source=zhou;Initial Catalog=AspNetStudy;User ID=sa;Password=jerry;  
      7.   </property>  
      8.   <property name="adonet.batch_size">10</property>  
      9.   <property name="show_sql">true</property>  
      10.   <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>  
      11.   <property name="use_outer_join">true</property>  
      12.   <property name="command_timeout">10</property>  
      13.   <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>  
      14.   <property name="proxyfactory.factory_class">  
      15.    NHibernate.ByteCode.Castle.ProxyFactoryFactory,  
      16.    NHibernate.ByteCode.Castle  
      17.   </property>  
      18.   <mapping assembly="NHibernateDemo"/>  
      19.  </session-factory>  
      20. </hibernate-configuration>  

       

      如果你也是使用SQL Server2005作為數(shù)據(jù)庫的話,那么需要更改connection.connection_string中的數(shù)據(jù)庫連接信息為你本機的連接信息,并且實際情況更改assembly的值為你當前項目編譯后的程序集名稱。
      在這里還需要注意的是需要將hibernate.cfg.xml的屬性更改為復制屬性改為始終復制,如下圖所示:
       
      3.2創(chuàng)建映射文件
      映射文件包含了對象/關(guān)系所需要的元數(shù)據(jù),其中包含了所使用的持久化類和到數(shù)據(jù)庫的映射。NHibernate就是通過映射文件知道怎樣加載和存儲持久化對象。
      在項目中增加一個名為UserInfo.hbm.xml的xml文件,這個xml文件的內(nèi)容如下:

      [xhtml] view plaincopy
      1. <?xml version="1.0" encoding="utf-8" ?>  
      2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateDemo" namespace="NHibernateDemo">  
      3.  <class name="UserInfo">  
      4.   <id name="UserId" column="UserId">  
      5.    <generator class="native"/>  
      6.   </id>  
      7.   <property name="UserName"/>  
      8.   <property name="RealName"/>  
      9.   <property name="Age"/>  
      10.   <property name="Sex"/>  
      11.   <property name="Mobile"/>  
      12.   <property name="Phone"/>  
      13.   <property name="Email"/>  
      14.  </class>  
      15. </hibernate-mapping>  


      注意:如果想要獲得在編輯hibernate.cfg.xml或者UserInfo.hbm.xml時的智能提示,可以將下載NHibernate壓縮包中的nhibernate-configuration.xsd和nhibernate-mapping.xsd文件拷貝到VS的一個特殊文件夾中,在本機上周公在C盤安裝了VS2008,那么需要將上面提到的文件拷貝到C:/Program Files/Microsoft Visual Studio 9.0/Xml/Schemas目錄下,你需要根據(jù)你的實際情況來拷貝。
      需要更改這個文件的屬性,改為“嵌入的資源”,如下圖所示:
       
      3.3創(chuàng)建持久化類
      在當前項目中創(chuàng)建一個名為UserInfo.cs的類文件,這個類的代碼如下:

       

       

      [c-sharp] view plaincopy
      1. using System;  
      2. using System.Collections.Generic;  
      3. using System.Text;  
      4.   
      5. namespace NHibernateDemo  
      6. {  
      7.     /// <summary>  
      8.     /// 數(shù)據(jù)庫中UserInfo表的持久化類  
      9.     /// 作者:周公  
      10.     /// 博客地址:http://blog.csdn.net/zhoufoxcn  
      11.     /// 日期:2010-03-19  
      12.     /// </summary>  
      13.     public class UserInfo  
      14.     {  
      15.         public virtual int UserId { getset; }  
      16.         public virtual string UserName { getset; }  
      17.         public virtual string RealName { getset; }  
      18.         public virtual int Age { getset; }  
      19.         public virtual bool Sex { getset; }  
      20.         public virtual string Mobile { getset; }  
      21.         public virtual string Phone { getset; }  
      22.         public virtual string Email { getset; }  
      23.     }  
      24. }  


      注意:NHibernate通過使用屬性的getter和setter操作來實現(xiàn)對象的持久化,并且要求類不能為sealed,方法和屬性必須為virtual。
      3.4編寫輔助類
      通過上面的文件NHibernate就可以實現(xiàn)關(guān)系映射了,這里編寫相關(guān)的輔助類代碼,如下:

      [c-sharp] view plaincopy
      1. using System;  
      2. using System.Collections.Generic;  
      3. using System.Text;  
      4. using Iesi.Collections;  
      5. using NHibernate;  
      6. using NHibernate.Cfg;  
      7.   
      8. namespace NHibernateDemo  
      9. {  
      10.     /// <summary>  
      11.     /// 說明:這個類是為了演示NHibernate中的CRUD的用法  
      12.     /// 作者:周公(周金橋)  
      13.     /// 日期:2010-03-07  
      14.     /// </summary>  
      15.     public class NHibernateCRUD  
      16.     {  
      17.         private ISessionFactory sessionFactory;  
      18.         public NHibernateCRUD()  
      19.         {  
      20.             sessionFactory = new Configuration().Configure().BuildSessionFactory();  
      21.         }  
      22.   
      23.         public ISession GetSession()  
      24.         {  
      25.             return sessionFactory.OpenSession();  
      26.         }  
      27.         /// <summary>  
      28.         /// 統(tǒng)計用戶總數(shù)  
      29.         /// </summary>  
      30.         /// <returns></returns>  
      31.         public int Count()  
      32.         {  
      33.             #region 方法一  
      34.             //ISession session = GetSession();  
      35.             //ISQLQuery query = session.CreateSQLQuery("select count(1) from UserInfo");  
      36.             //int count = query.List<int>()[0];  
      37.             //session.Close();  
      38.             //return count;  
      39.             #endregion  
      40.  
      41.             #region 方法二  
      42.             ISession session = GetSession();  
      43.             IQuery query = session.CreateQuery("select count(c.UserId) from UserInfo c");  
      44.             //注意:不能對于count函數(shù)不能使用query.List<int>(),因為默認返回的數(shù)值類型是long  
      45.             //否則會拋出GenericADOException,異常描述是:Could not execute query[SQL: SQL not available]  
      46.             //InnerException: System.ArgumentException,InnerException描述是:"值“*”不是“System.Int32”類型,不能在此泛型集合中使用。/r/n參數(shù)名: value  
      47.             int count =(int)(query.List<long>()[0]);  
      48.             session.Close();  
      49.             return count;  
      50.             #endregion  
      51.         }  
      52.         /// <summary>  
      53.         /// 創(chuàng)建用戶  
      54.         /// </summary>  
      55.         /// <param name="info">用戶實體</param>  
      56.         /// <returns></returns>  
      57.         public int Create(UserInfo info)  
      58.         {  
      59.             ISession session = GetSession();  
      60.             int newId=(int)(session.Save(info));  
      61.             session.Flush();  
      62.             session.Close();  
      63.             return newId;  
      64.         }  
      65.         /// <summary>  
      66.         /// 讀取用戶信息  
      67.         /// </summary>  
      68.         /// <param name="userId">用戶編號</param>  
      69.         /// <returns></returns>  
      70.         public UserInfo Read(int userId)  
      71.         {  
      72.             ISession session = GetSession();  
      73.             UserInfo info=session.Get<UserInfo>(userId);  
      74.             session.Close();  
      75.             return info;  
      76.         }  
      77.         /// <summary>  
      78.         /// 更新用戶信息  
      79.         /// </summary>  
      80.         /// <param name="info">用戶實體</param>  
      81.         /// <returns></returns>  
      82.         public void Update(UserInfo info)  
      83.         {  
      84.             ISession session = GetSession();  
      85.             session.Update(info);  
      86.             session.Flush();  
      87.             session.Close();  
      88.         }  
      89.         /// <summary>  
      90.         /// 刪除用戶  
      91.         /// </summary>  
      92.         /// <param name="userId">用戶編號</param>  
      93.         /// <returns></returns>  
      94.         public void Delete(int userId)  
      95.         {  
      96.             ISession session = GetSession();  
      97.             //在NHibernate中支持直接使用參數(shù)值、":"+參數(shù)名、?(類似于在Access中使用參數(shù)化SQL語句的方式,給參數(shù)賦值要按照參數(shù)出現(xiàn)的順序來)等幾種方式  
      98.             IQuery query = session.CreateQuery("delete from UserInfo where UserId=:UserId");  
      99.             //如果采用":"+參數(shù)名方式使用參數(shù),那么給參數(shù)賦值時不需要在參數(shù)名前加":"號,如query.SetInt32(":UserId", userId);就會報錯  
      100.             query.SetInt32("UserId", userId);  
      101.             int affectedRows = query.ExecuteUpdate();  
      102.             session.Close();  
      103.             //return affectedRows;  
      104.         }  
      105.   
      106.         /// <summary>  
      107.         /// 刪除用戶  
      108.         /// </summary>  
      109.         /// <param name="userId">用戶實體</param>  
      110.         /// <returns></returns>  
      111.         public void Delete(UserInfo info)  
      112.         {  
      113.             ISession session = GetSession();  
      114.             session.Delete(info);  
      115.             session.Flush();  
      116.             session.Close();  
      117.         }  
      118.   
      119.         /// <summary>  
      120.         /// 獲取用戶表中編號最大的用戶  
      121.         /// </summary>  
      122.         /// <returns></returns>  
      123.         public int GetMaxUserId()  
      124.         {  
      125.             ISession session = GetSession();  
      126.             IQuery query=session.CreateQuery("select max(UserId) from UserInfo");  
      127.             int userId=query.List<int>()[0];  
      128.             session.Close();  
      129.             return userId;  
      130.         }  
      131.     }  
      132. }  

       


      3.5單元測試代碼

       

      [c-sharp] view plaincopy
      1. using System;  
      2. using System.Collections.Generic;  
      3. using System.Linq;  
      4. using System.Text;  
      5. using NUnit.Framework;  
      6. using NHibernateDemo;  
      7.   
      8. namespace NUnitTest  
      9. {  
      10.     [TestFixture]  
      11.     public class NHibernateTest  
      12.     {  
      13.         private NHibernateCRUD instance = null;  
      14.         [SetUp]  
      15.         public void Initialize()  
      16.         {  
      17.             instance = new NHibernateCRUD();  
      18.         }  
      19.         [Test]  
      20.         /// <summary>  
      21.         /// 統(tǒng)計用戶總數(shù)  
      22.         /// </summary>  
      23.         /// <returns></returns>  
      24.         public void Count()  
      25.         {  
      26.             Assert.Greater(instance.Count(), 0);  
      27.         }  
      28.         [Test]  
      29.         /// <summary>  
      30.         /// 創(chuàng)建用戶  
      31.         /// </summary>  
      32.         /// <param name="info">用戶實體</param>  
      33.         /// <returns></returns>  
      34.         public void Create()  
      35.         {  
      36.             UserInfo info = new UserInfo()  
      37.             {  
      38.                 Age = 12,  
      39.                 Email = "zzz@ccav.com",  
      40.                 Mobile = "13812345678",  
      41.                 Phone = "01012345678",  
      42.                 RealName = "測試" + DateTime.Now.Millisecond.ToString(),  
      43.                 Sex = true,  
      44.                 UserName = "zhoufoxcn" + DateTime.Now.Millisecond.ToString()  
      45.             };  
      46.             instance.Create(info);  
      47.         }  
      48.         [Test]  
      49.         /// <summary>  
      50.         /// 讀取用戶信息  
      51.         /// </summary>  
      52.         /// <param name="userId">用戶編號</param>  
      53.         /// <returns></returns>  
      54.         public void Read()  
      55.         {  
      56.             UserInfo info = instance.Read(1);  
      57.             Assert.NotNull(info);  
      58.         }  
      59.         [Test]  
      60.         /// <summary>  
      61.         /// 更新用戶信息  
      62.         /// </summary>  
      63.         /// <param name="info">用戶實體</param>  
      64.         /// <returns></returns>  
      65.         public void Update()  
      66.         {  
      67.             UserInfo info = instance.Read(1);  
      68.             info.RealName = "測試" + DateTime.Now.Millisecond.ToString();  
      69.             instance.Update(info);  
      70.         }  
      71.         [Test]  
      72.         /// <summary>  
      73.         /// 刪除用戶  
      74.         /// </summary>  
      75.         /// <param name="userId">用戶編號</param>  
      76.         /// <returns></returns>  
      77.         public void DeleteByID()  
      78.         {  
      79.             int userId = instance.GetMaxUserId();  
      80.             instance.Delete(userId);  
      81.         }  
      82.   
      83.         [Test]  
      84.         /// <summary>  
      85.         /// 刪除用戶  
      86.         /// </summary>  
      87.         /// <param name="userId">用戶實體</param>  
      88.         /// <returns></returns>  
      89.         public void Delete()  
      90.         {  
      91.             int userId = instance.GetMaxUserId();  
      92.             UserInfo info = instance.Read(userId);  
      93.             Console.WriteLine("MaxUserId=" + userId);  
      94.             instance.Delete(info);  
      95.         }  
      96.     }  
      97. }  


      4.點評
      使用ORM的很大的一個好處就是很少或者根本不用編寫數(shù)據(jù)庫記錄映射到對象的代碼,并且在大部分情況下也不用編寫SQL代碼(取而代之的是HSQL)。在使用ADO.NET時代我經(jīng)常有這樣的體會,因為數(shù)據(jù)庫的變動可能需要更改從顯示到數(shù)據(jù)庫訪問層的相關(guān)代碼,并且還需要更改自己編寫的從數(shù)據(jù)庫記錄轉(zhuǎn)換為對象的代碼,而現(xiàn)在僅僅需要更改映射文件和持久化類的代碼就可以了,除此之外我們還可以使用面向?qū)ο蟮姆绞綄?shù)據(jù)進行操作,大家可以看到在NHibernateCRUD中對數(shù)據(jù)庫進行CRUD的代碼比直接使用ADO.NET進行CRUD操的代碼要簡潔許多,這就是ORM的魅力。
      當然使用ORM也會存在一些缺點,畢竟ORM在底層使用的是ADO.NET,對于一個有經(jīng)驗的開發(fā)人員來說,可能直接使用ADO.NET的性能比使用NHibernate的效率要高,通過NHibernate的緩存機制多少能在某種程度上緩解這個問題。不過當數(shù)據(jù)量在千萬級左右時這個問題就顯得比較突出了,在一些數(shù)據(jù)量在百萬級以下的情況中,合理使用NHibernate是沒有什么問題的。

       

      posted on 2014-04-23 11:06  煙灰缸  閱讀(2486)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 日本东京热不卡一区二区| 久久综合国产精品一区二区| 99国产欧美另类久久久精品| 国产精品中文字幕在线| 欧美精品videosbestsex日本| 国产初高中生在线视频| 日本道不卡一二三区视频| 欧美牲交a欧美牲交aⅴ免费真| 亚洲AV乱码毛片在线播放| 强行交换配乱婬bd| 日韩中文字幕一二三视频| 国产99在线 | 免费| 风流少妇树林打野战视频| 人妻精品中文字幕av| 中文无码av一区二区三区| 亚洲精选av一区二区| 国产首页一区二区不卡| 国产一区二区三区黄色片| 少妇粗大进出白浆嘿嘿视频| 黄又色又污又爽又高潮| 在线日韩日本国产亚洲| jizzjizz日本高潮喷水| 精品视频在线观自拍自拍| 成人av一区二区三区| 欧美成人精品在线| 久久综合国产一区二区三区| 亚洲中文字幕久久精品蜜桃| 亚洲精品一二三四区| 国产成人精品一区二区三区| 好吊视频一区二区三区人妖| 深夜释放自己在线观看| 久久天堂综合亚洲伊人HD妓女| 中文字幕av一区| 国产一区二区三区美女| 欧美性猛交xxxx免费看| 国产精品国产三级国快看| 99久久久国产精品免费无卡顿 | 亚洲精品免费一二三区| 中国CHINA体内裑精亚洲日本| 久久久久夜夜夜精品国产 | 中文字幕第一页亚洲精品|