天天看點

NHibernate ORM介紹及優缺點-NHibernate入門到精通系列1

對于.NET的開發,優秀的資料持久層架構層出不窮:

如國内的:CYQ.Data 資料層架構

如國外的:Spring.net架構

這個系列,也是國外的NHibernate入門到精通系列,各家各自用,有心也支援下國産。

下面進入 NHibernate 系列的開篇介紹:

一、何為NHibernate?

  什麼是?NHibernate?NHibernate是一個面向.NET環境的對象/關系資料庫映射工具。對象/關系資料庫映射(object/relational mapping,ORM)這個術語表示一種技術,用來把對象模型表示的對象映射到基于SQL的關系模型資料結構中去。

NHibernate ORM介紹及優缺點-NHibernate入門到精通系列1

  在今日的企業環境中,把面向對象的軟體和關系資料庫一起使用可能是相當麻煩和浪費時間的。而NHibernate不僅僅管理.NET類到資料庫表的映射(包括.NET 資料類型到SQL資料類型的映射),還提供資料查詢和擷取資料的方法,可以大幅度減少開發時人工使用SQL和ADO.NET處理資料的時間。

  NHibernate的目标主要是用于與資料持久化相關的程式設計任務,能夠使開發人員從原來枯燥的SQL語句的編寫中解放出來,解放出來的精力可以讓開發人員投入到業務邏輯的實作上。對于以資料為中心的程式,開發人員往往是在資料庫中使用存儲過程來實作商業邏輯,這種情況下NHibernate可能不是最好的解決方案,但對于那些基于.NET,并且能夠實作OO業務模型和商業邏輯的中間層應用,NHibernate是最有用的。NHibernate可以幫助使用者消除或者包裝那些針對特定廠商的SQL代碼,并且幫使用者把結果集從表格式的表示形式轉換成一系列的對象。   

  NHibernate是一個目前應用的最廣泛的開放源代碼的對象關系映射架構,它對Java的JDBC(類似于ADO.Net)進行了非常輕量級的對象封裝,使得程式員可以随心所欲的使用對象程式設計思維來操縱資料庫,目前在國内Java開發界已經頗為流行,Hibernate+Spring往往是很多Java公司招聘的要求。而NHibernate,顧名思義,如同NUnit,NAnt一樣,是基于.Net的Hibernate實作,但是目前介紹NHibernate的資料非常少,缺少一個系統完整的教程來全面的展現和深入NHibernate,而且現在NHibernate的文檔又殘缺不全,少的可憐,很多NHibernate的學習者往往都是通過Hibernate的文檔來學習,但是畢竟不是所有的.Net開發者都熟悉Java,也不是所有的人都有精力有時間去學習Java,是以,我準備開始一個Step by Step的NHibernate教程,以便有興趣的朋友能夠快速的熟悉NHibernate,能夠更快地體驗NHibernate的開發樂趣。   

  NHibernate 是一個基于.Net 的針對關系型資料庫的對象持久化類庫。Nhibernate 來源于非常優秀的基于Java的Hibernate 關系型持久化工具。   

  NHibernate 從資料庫底層來持久化你的.Net 對象到關系型資料庫。NHibernate 為你處理這些,遠勝于你不得不寫SQL去從資料庫存取對象。你的代碼僅僅和對象關聯,NHibernat 自動産生SQL語句,并確定對象送出到正确的表和字段中去。

一、何為ORM?

  什麼是ORM?對象-關系映射(Object/Relation Mapping,簡稱ORM),是随着面向對象的軟體開發方法發展而産生的。面向對象的開發方法是當今企業級應用開發環境中的主流開發方法,關系資料庫是企業級應用環境中永久存放資料的主流資料存儲系統。對象和關系資料是業務實體的兩種表現形式,業務實體在記憶體中表現為對象,在資料庫中表現為關系資料。記憶體中的對象之間存在關聯和繼承關系,而在資料庫中,關系資料無法直接表達多對多關聯和繼承關系。是以,對象-關系映射(ORM)系統一般以中間件的形式存在,主要實作程式對象到關系資料庫資料的映射。   

  面向對象是從軟體工程基本原則(如耦合、聚合、封裝)的基礎上發展起來的,而關系資料庫則是從數學理論發展而來的,兩套理論存在顯著的差別。為了解決這個不比對的現象,對象關系映射技術應運而生。   

  讓我們從O/R開始。字母O起源于"對象"(Object),而R則來自于"關系"(Relational)。幾乎所有的程式裡面,都存在對象和關系資料庫。在業務邏輯層和使用者界面層中,我們是面向對象的。當對象資訊發生變化的時候,我們需要把對象的資訊儲存在關系資料庫中。

  如果打開你最近的程式(如,PetShop4.0),看看DAL(資料庫通路層)代碼,你肯定會看到很多近似的通用的模式。我們以儲存對象的方法為例,你傳入一個對象,為SqlCommand對象添加SqlParameter,把所有屬性和對象對應,設定SqlCommand的CommandText屬性為存儲過程,然後運作SqlCommand。對于每個對象都要重複的寫這些代碼。除此之外,還有更好的辦法嗎?有,引入一個O/R Mapping。實質上,一個O/R Mapping會為你生成DAL。與其自己寫DAL代碼,不如用O/R Mapping。你用O/R Mapping儲存,删除,讀取對象,O/R Mapping負責生成SQL,你隻需要關心對象就好。

三、NHiberante優缺點介紹

先說說缺點:

  (1).記憶體消耗:直接使用“SqlHelper、DAL、BLL”無疑是最省記憶體的。使用NHibernate後,記憶體開銷比較大,這點是毋庸置疑的。

  (2).批量資料庫的處理:由于NHibernate是基于面向對象的ORM架構,處理資料庫的方式是針對單個對象的。對資料庫的增、删、改都是正對一條記錄而言。對于批量修改、删除資料,不适合用NHiberante。這也是所有OR架構弱點,其原因,我認為是在于與緩存機制的沖突。

  (3).較多使用資料庫特性時,也不适合使用NHiberante。如資料庫中大量的存儲過程、觸發器、特點的SQL語句。

  (4).表關系比較混亂時也不适合使用NHiberante。NHibernate隻适合于表與表的關系比較明确的環境中。如本應該建立外鍵的,沒有建立外鍵。這時使用NHiberante不僅沒有減少工作量,反而增加了工作量。

  (5).學習成本:相對于NHibernate來說,使用“SqlHelper、DAL、BLL”操作資料庫,學習成本比較低,而且上手很快。使用NHibernate需要有一定OOP(面向對象程式設計)和OOD(面向對象設計)的基礎,這對于基礎薄弱的程式員來說,從面向過程的程式設計到面向對象的程式設計,需要一定的投入;一般情況下需要學習1個月左右的時間才能夠深入NHiberante。

再談談優點:

  (1).面向對象:NHiberante的使用時隻需要操縱對象,使開發更對象化,抛棄了資料庫中心的思想,完全的面向對象思想。

  (2).透明持久化:帶有持久化狀态的、具有業務功能的單線程對象,此對象生存期很短。這些對象可能是普通的POCO,這個對象沒有實作第三方架構或者接口,唯一特殊的是他們正與(僅僅一個)Session相關聯。一旦這個Session被關閉,這些對象就會脫離持久化狀态,這樣就可被應用程式的任何層自由使用。(例如,用作跟表示層打交道的資料傳輸對象。)

  (3).它沒有侵入性,即所謂的輕量級架構。正因為它具有透明持久化的優點,它才沒有侵入性,才是一個輕量級架構。恒定一個架構為重量級、還是輕量級,是根據其侵入性而定奪的。而NHibernate就是一個輕量級ORM架構。

  (4).較好的移植性:支援多種資料庫,便于資料庫的遷移。

  (5).緩存機制:提供一、二級緩存和查詢緩存。

  (6).開發效率:衆所周知,使用NHibernate可以簡化程式開發,進而達到快速開發的目的。作為軟體公司,項目管理的關鍵就是控制開發成本。正因為使用NHibernate後所寫的代碼量減少了,相對于原先使用“SqlHelper、DAL、BLL”開發程式的項目周期縮短了,成本就降低了。

NHibernate ORM介紹及優缺點-NHibernate入門到精通系列1

本節開篇介紹到這裡,下節我們開始新的旅程!