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.Order