關於ORM實體映射的感想 (Object /Relational Mapper) GOOD!

關於ORM實體映射的感想 (Object /Relational Mapper )

2005-05-29  njbaige/白鴿  於蘇州


What  ORM?
Object /Relational Mapper

Why ORM
一般的數據庫訪問是建立於傳統的數據庫訪問模型的基礎之上,
即是Connection,Command等對象,通過SQL語句與數據庫交互,並返回結果
現在.NET下面的數據庫訪問框架已經到了ADO.NET 時代,ADO.NET 的訪問方式
詳見MSDN的相關文檔,這不是本文討論的重點。但是要說明的是,在.NET 環境
下的數據訪問,都得要和ADO.NET打交道,那個是最底層得東西,我們今天談的
數據庫映射框架底層也是基於ADO.NET的訪問模式,只是他們進行了很有效的封裝
是得對數據庫的操作從傳統的SQL模式,轉換爲基於對象的模式。
使業務邏輯與數據層分離,減少之間的藕合性,讓系統開發對數據庫透明

目前在網絡上大家可以找到好幾種持久層,其實各個持久層的思想都是相同的,只是在實現的方式上,
還有一些細節功能上有差異,每個持久層都有獨特之處或是不足之處

How ORM

實體映射:將數據庫中的實體(一般是一張表)映射爲類,對數據庫的操作就
直接轉換爲對這些實體的操作:包括新,增,刪,改等。採用實體的操作,會使我們對數據
庫訪問時,更方便,減少很多不必要的代碼
關係映射:數據庫中多個表之間會有相互的關係,怎樣把這些關係也反映到映射好的類中
這就是關係映射,不過相比實體映射,關係映射實現起來更難,這也是評估不同ORM好壞的
一個重要因素
高級查詢:在數據庫操作中,用得最多的是數據獲取(Retrieve)。查詢條件也是很多樣,會
有關聯查詢的情況,獲取的結果也是要定製的,而不是簡單的每個表的所有字段。
這點也是ORM實現最關鍵的地方,各自實現的方式不同,而且有的用起來也很麻煩,不友好。
感覺還不如直接採用SQL語句來的方便。這點NHibernate繼承了Hibernate的長處,採用HQL
查詢語言,功能最爲強大。其他的ORM 就不是很方便了。個人覺得還有必要保留SQL語句接
口,返回Table對象也是有不錯的。

事務處理:在數據可靠性要求很高的時候,需要引入事務。由於ADO.NET 中對事務的支持
很好,所以在ORM實現起來也是很棒的,一般的框架都支持這樣的事務。

實體類和操作類的生成: ORM說到底就是幫我們生成了一個功能強大的數據庫訪問類,
裏面包括實體對象類,實體操作類等,實現了這樣的思想,在代碼生成上也需要友好,方便
才能爲大衆所用。所以一個優秀的ORM框架需要搭配一個好的代碼生成工具。目前一部分框架都有的,
支持直接同數據庫連接,選擇要生成的數據表,直接生成CS文件,編譯成DLL文件,直接導入到工程中就能用啦,
是不是很酷~(不過有的ORM框架需要一些配置文件,也有生成的哦)

數據訪問實現方式:對實體對象的獲取,更新保存至數據庫,在ORM的底層都需要通過
連接來實現(不管是SQL連接還是OLEDB 連接,還是ORACLE連接 ),他們實現的方式也有不同
這決定了我們在代碼中的操作方式也不同。一種是通過一個Manage類來實現,就像NHibernate、ORM.NET等,
這樣的有點是連接操作效率更高,公用一個連接操作實體,缺點是我們使用起來不是很方便,
不是完全符合對象映射的構想,每次操作都得取找那個Manage,麻煩;還有一種是直接放到實體類中,
也就是每一個實體類中都封裝好了Save,del等數據訪問方法,要操作直接調用,就不要再去麻煩第三者了~

目前用過幾個ORM框架,下面是主要操作方式的學習筆記:
一 . ORM.NET   下載URL:http://www.olero.com/ormweb/index.aspx
一個國外的ORM框架,主要是生成代碼工具很酷,才試用的。幫助文件也全,不過爲E文的。
啓動工具,連接至SQL Server(好像它只支持SQL Server,用的是System.Data.SqlClient )
,顯示出數據庫中的每一張表和相應的關係,選擇要生成的實體對象,配置文件路徑和CS類名之後,
代碼就出來了。就一個DLL(外帶一個連接配置文件,也可以不用,在代碼裏面賦值就OK)去看了裏面的具體內容,
實體映射,事務處理是沒問題的,在數據的複雜查詢上,採用了自定義的一個查詢條件類,
支持很複雜的查詢條件(不過感覺開始用起來比較難上手)

二  SmartPersistenceLayer  下載URL;http://www.cnblogs.com/tintown/category/12787.html 
附很詳細的幫助文檔和實例

簡稱SPL,最新版本3.1 , 聽棠大哥的作品,也是目前國產最棒的ORM映射框架,以郭先堯的Xxmm.Net爲基礎做的。
(不是幫他打廣告,而是裏面的功能確實很Cool,不過也有不是很完美的地方-感覺)
支持SQL Server(System.Data.SqlClient)、Access(System.Data.OleDb)、Oracle(System.Data.OracleClient)、
Informix (ODBC連接方式)
  提供“併發處理”、“異構數據庫事務處理”、“多帳套”、“實體克隆”、“Top功能”等解決方案。
有代碼生成工具 SmartRobot

配置文件:是採用Config/DatabaseMap.xml ,設置數據庫的連接參數
O/R Mapping 採用Config/ClassMap.xml ,設置數據庫中表字段和實體類之間的對應關係

基本的實體操作 :
實體類繼承於EntityObject,具父類爲SPL中的一個public abstract類,只要具體的實體類繼承後,
實體類就擁有了Save(),Retrieve(),Delete()的實體操作功能,無需借用Manage類來實現

如:
StudentEntity student=new StudentEntity();  //實體化一個學生對象

//以下進行屬性賦值
//student.Id=1;                        //此爲自動增長,SPL會自動獲取

student.No=” 200401”;
student.Name=”張三”;
student.Birthday=DateTime.Parse(“1979-01 -22”);
student.Grade=2;
student.Score=580;
    student.Save();

是不是不用串SQL語句了?

Criteria(標準)操作:對複雜條件的,返回值爲實體對象集合的操作
採用幾個Criteria(標準)對象實現

RetrieveCriteria(獲取標準)
UpdateCriteria (更新標準)
DeleteCriteria(刪除標準)

RetrieveCriteria rc=new RetrieveCriteria(typeof(StudentEntity)); //實例化

       Condition c=rc.GetNewCondition();  //實例化一個條件

       c.AddEqualTo(StudentEntity.__GRADE,2);   //二年級條件

       c.AddMatchPrefix(StudentEntity.__Name,’劉’); //匹配’劉’字開頭

       c.OrderBy(StudentEntity.__NO);             //按學號排

       DataTable dt=rc.AsDataTable() ;              //以DataTable方式返回


EntityContainer ec=rc.AsEntityContainer();   //以實體集合的形式返回,然後在集合中操作Entity。
有點類似RowCollection

rc.AsEntity();  //返回實體集合中的第一個對象

rc.Top=20;  可以返回前20條記錄哦

但是在複雜的表間連接,嵌套查詢做得不夠,聽棠大哥解釋的是採用數據庫中的視圖來完成。
所以我現在對於很複雜的查詢,還是採用SQL傳遞,返回TABLE的方式,這點有待改進。
不過也是所有ORM要面對的難題哦~

三  NHibernate  下載URL:http://nhibernate.sourceforge.net/
國外的一個ORM映射框架。繼承了JAVA平臺Hibernate的血統,不過功能
有待完善,但應該算是開源的業內最權威的ORM框架了(不知道是不是沾了Hibernate的光~)

操作非常全面,規範。

開發的過程

1.新建一個將要持久化.Net對象的表

2.構建一個需要被持久化的.Net類

3.構建一個可以讓NHibernate知道如何持久化對象屬性的映射文件

4.構建一個讓NHibernate知道如何連接數據庫的配置文件]

5.使用NHibernate的API

Nhibernate雖好,但是未提供工具來自動產生schema文件和代碼,這是目前比較麻煩的,
完全手寫,包括設置表和.Net類的編寫,比較鬱悶,所以讓很多初學者望而卻步,或者在觀望中。期待很酷的工具能出現

這篇關於 Nhibernate的文章寫得很好,我就不羅嗦了,要不大家會砸我滴~
NHibernate快速指南 http://dev.csdn.net/develop/article/63/63977.shtm

據不完全統計,.NET下的ORM 有如下這些,高手們用了發發意見啊~


歡迎交流.net開發經驗.
qq: 32660346
msn: [email protected]
Mial:[email protected]

原著文章,如果有轉載請告知,謝謝。
大家有好的文章可以發郵件給我,互相學習,共同進步!


發佈了1 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章