詳談XCode學習基礎之ORM組件

來源:互聯網
上載者:User

詳談XCode學習基礎之ORM組件是本文熬介紹的內容,之前,XCode總是若隱若現,耐性好的同學想知道它還有啥特點,沉不住氣的則認為不過是CURD耳!不多說,先來看詳細內容。

XCode開發模式是靈魂,XCode組件通過具體實現對其支援!

XCode的特點如下:

1、基本的CURD功能

實在想不出來不支援CURD的ORM算不算ORM;也實在想不出來僅有CURD的ORM算不算ORM。因而,這是0號功能!

XCode的CURD通過反射實體類產生查詢和操作SQL實現,資料庫結構資訊通過特性附在實體類上。之所以選擇SQL而不是DbCommand,因為XCode的實體層和資料訪問層是分開的,目前是為了實現一級緩衝,將來會在這裡實現分布式資料訪問。

2、完美支援ObjectDataSource

XCode實現充血模型脹血模型)的實體類,提供ObjectDataSource需要的所有方法和參數,特別支援分頁和排序功能!

詳見《與ObjectDataSource共舞》

3、全面分頁支援

只有從小處開始培養分頁的思想,任何查詢都指定所需擷取資料範圍,才能保證系統資料變大時系統不會拓機。

XCode的分頁以任意查詢語句為基礎,支援統計等非常複雜的查詢分頁。並且會根據當前資料庫類型以及版本選擇最佳分頁方案。

詳見《撬動千萬級資料》

4、實體集合支援

實體集合EntityList<TEntity>繼承自List<TEntity>,提供了實體的大量操作。實際上還是通過遍曆集合逐個進行實體操作,因為充血模型的實體類可能是通過重載修改CURD的行為,所以不能使用一個SQL語句操作一批實體,XCode不會做這種可能會影響使用的小把戲。

實體集合還提供了一些方便查詢和排序的簡便方法,實體緩衝中將會大量使用。

5、萬能的一級緩衝

一級緩衝由資料訪問層實現,以查詢SQL為鍵,返回的資料集為值,查詢的表名數組為依賴項,進行緩衝。執行SQL時同樣需要指定影響的表名數組,從而清空所有影響到的緩衝。

緩衝生命週期分為請求級、定期和永久三種。如果只有當前應用系統使用該資料庫,並且伺服器記憶體足夠大,可以開啟永久緩衝,在資料沒有更新時,基本緩衝在記憶體中,適用於網站;一般設定一個緩衝到期期限,定期清理緩衝,適用於記憶體不是很足,或者允許資料更新有一定延後的分布式系統;如果上面兩種均不合適,而又需要提高系統響應速度時,可以採用請求級緩衝,在該次頁面請求生命週期內對資料進行緩衝,特別適用於在不同地方進行相同查詢的場合有時候是程式員功力不夠寫錯的)。

XCode的開發模式建議使用儘可能簡單的單表查詢,實際大部分查詢都是簡單SQL語句,快取命中率很高!

6、漂亮的實體緩衝

實體緩衝又成為二級緩衝。儘管有了一級緩衝,但它只是緩衝了資料集而已,使用的時候還是要載入Data Integration為實體集合。

實體緩衝通過指定一個查詢實體集合的方法,一般是查詢本表所有實體的FindAll()方法,把查詢返回的實體集合緩衝起來預設緩衝一分鐘),供上層代碼使用。取資料的過程完全是隱式進行,實體緩衝通過提供一個靜態實體集合供上層代碼查詢,實體集合屬性內部進行查詢資料和緩衝到期檢查等操作。查詢方法通過委託傳遞,還有參數可以指定是否非同步擷取快取資料。

總之,使用實體緩衝就是使用一個靜態實體集合屬性大多數時候使用預設配置,所以不需要配置),進行查詢排序等操作,無需關心緩衝的具體實現。當然,對實體進行修改操作時將會清空緩衝,保證資料的新鮮性。

單表資料量不大建議1000以下,不超過10000),並且極少改動的資料表使用實體緩衝。比如許可權、角色、菜單、系統參數等使用非常頻繁的資料。實體緩衝的命中率可以高達99.98%

7、飄逸的單對象緩衝

單對象緩衝又層三級緩衝,因為它一般構建於二級緩衝之上。對於資料量大大概幾萬到幾十萬),並且查詢又非常頻繁的資料表,任意兩行資料之間關係不大時,可以酌情使用單對象緩衝。比如會員表,一般會根據帳號進行尋找,並且很頻繁,此時可以以帳號為鍵,會員對象為值,對資料進行緩衝。設定與實體緩衝類似。取資料時先去緩衝中找,有則直接返回,沒有則調用預設的方法進行查詢,並且緩衝起來。

單對象緩衝裡面的實體物件,修改資料時,如非必要,不要手工調用更新方法,單對象緩衝有自動儲存的功能。該特性適用於更新非常頻繁的場合,比如線上使用者表,可以讓多次更新積累在一起,然後最後自動更新一下。

8、出色的效能

XCode不支援多表查詢,一般的多表關聯查詢都可以拆分成為1+X的多次單表查詢。比如學生和班級的關聯查詢,可以先查10個學生資訊,再分別查他們的班級資訊,就成了1+10=11次單表查詢。每一次單表查詢肯定會比多表關聯查詢要快,但是11次單表查詢很多時候都會比一次多表關聯查詢慢。

回過頭來看看上面的緩衝,如果這10個學生是同班,那麼在一級緩衝的作用下,實際查詢資料庫將會是1+1=2,後面9次班級查詢被一級緩衝攔截了。在高並發的系統中,後面這個1就趨向於0了,因為緩衝是全域共用的。

再來看看實體緩衝,一個學校的班級不會很多,符合條件使用實體緩衝。也就是一次性讀取所有班級資訊,緩衝到實體集合中。即使在最糟糕的情況下,10個學生都處於不同班級,實體緩衝也是百分百命中,實際查詢僅僅是對學生表的單表查詢,此時肯定比多表關聯查詢快。

在學生資料介面等地方,學生表查詢是非常頻繁的。顯然,這是一個非常適用單實體緩衝的場合。學生附屬屬性關聯表)等資訊,可以通過擴充屬性“掛”在學生實體物件上,“享受”到緩衝的待遇。

資料庫層面也有一個緩衝,可以算是0級緩衝吧。我們所有的查詢都是單表查詢,對資料庫而言非常簡單,同時,因為簡單的SQL,資料庫快取命中率極高,並且非常便於建立索引進行最佳化。

基於分頁和緩衝,XCode提供了一套高效能的解決方案,這種方案遠勝於傳統的多表關聯查詢,並且是系統並發越高,這種優勢越明顯。

9、髒資料支援

在更新資料的時候,往往業務需求是只更新我們修改過的資料。比如會員資料修改表單,可以設定會員資訊等資料,但是不能修改最後登入時間。這個時候,我們就需要知道哪個屬性的資料被我們修改過!

XCode的實體類中,每個資料屬性的set方法,都會先調用OnPropertyChange方法,其實就是為了設定該欄位的髒屬性,說明這個欄位的資料曾經被修改過。產生Update語句的時候,只修改帶有髒屬性的欄位。

實體類中,除了直接修改屬性外,還可以通過索引器進行修改,兩種的區別就在於通過索引器修改屬性時,不影響髒資料設定。實際上,載入資料行到實體類中,使用的正是索引器,所以剛載入完成資料的情況下髒資料是空的。

10、多資料庫支援

 
  1. MSSQL2000、MSSQL2005/2008、Oracle、MySQL、Access、SQLite) 

與大多數ORM一樣,XCode通過介面的方式支援多種資料庫。在XCode中,為每一個資料庫實現了一個資料庫操作類,繼承自資料庫介面。資料訪問層DAL根據資料庫連接的配置識別是哪一種資料庫,然後建立該資料庫操作類的執行個體,並通過操作介面來操作資料庫。

資料庫操作類以Access資料庫為藍本,設計了一個基類,其它資料庫操作類僅需要繼承該類,重載功能點不一致的屬性和方法,大大減小了操作類的大小。

資料庫操作介面包含的功能有:查詢、執行、分頁、事務、擷取架構、DDL操作、資料庫版本等。實際上,各個資料庫的差異點都可以設計在操作介面中,而上層代碼根本不需要改動。

很多ORM都為各個資料庫的差異大而苦惱,XCode開發模式則不然。我們的原則是一切從簡,只使用SQL,不適用DbCommand和預存程序。而所使用的SQL,基本上也是標準SQL,不會使用資料庫特性,並且都是單表操作。當然,這種方法也不是萬能的,不得已的時候,可以在業務層判斷當前資料庫類型,根據不同資料庫編寫不同的SQL,但自XCode使用以來,還沒需要這樣做過。

11、擷取資料庫結構描述

 
  1. DAL.Tables) 

在XCode中,資料庫結構描述主要包含XTable和XField類,顧名思義,它們代表著表和欄位資訊。資料訪問層DAL中有個成員屬性Tables可以取得該資料庫連接的所有表資訊,也就是一個XTable集合。同理,每一個XTable中,都會有一個XField集合。

這樣設計,簡單明了,使用者可以很容易的找到自己需要的東西。我們的代碼產生器XCoder就是依賴於XCode來擷取資料庫結構描述的。有了這個功能,人人都可以寫自己的代碼產生器了!

12、反向產生資料庫結構描述

 
  1. DatabaseSchema) 

這是一個很另類的功能,極少有ORM提供。在開發和維護的過程中,難免需要修改表結構,重建實體類僅產生實體類資料檔案部分)。在團隊開發的時候,如果不是共用資料庫,則還需要通知隊員做相應的修改。維護的時候,還需要到生產環境做更新,如果客戶不允許直接操作資料庫,那就更麻煩了。

在資料庫操作介面中,其中一個功能就是DDL操作,各個資料庫進行重載後,可以使用DDL語句操作資料庫的結構。常用的功能有:建立表、修改欄位屬性、添加欄位、刪除欄位等。

XCode除了會從資料庫產生資料庫結構描述外,還會從實體類產生一套資料庫結構描述,然後進行對比,發現存在差異後,直接修改或者寫日誌提醒由設定決定)。修改開關沒開啟時,僅僅寫日誌提醒,日誌中寫出了完整的用於修正資料庫結構描述的DDL語句,拿到資料庫中執行即可。

基於XCode開發的系統,在發布的時候,從來不帶資料庫,因為XCode會自動根據連接字串建立資料庫、資料表和欄位。即使開發使用的是A資料庫,發布的時候修改資料庫連接字串為B資料庫,XCode將會按照B資料庫的規範來建立資料庫。如果系統發布還需要附帶資料,那就不可能做到發布時更換資料庫了,除非發布多個資料庫的版本。

也許有人會說,不帶資料庫的話,初始化的資料怎麼辦?在XCode的開發理念中,建議在實體類增加靜態建構函式,用於檢測資料表資料,如果沒有資料時,是否需要建立一個預設資料,比如在管理員表建立一個使用者名稱和密碼都是admin的管理員。

13、動態修改串連和表名

 
  1. Meta.ConnName,Meta.TableName) 

資料量增大到一定程度時,很多企業的方案都是給資料表改名或者把該表遷移到別的資料庫中去,僅用於查詢統計。

在XCode中,產生實體類時,就指定了實體類所對應的表名,但是我們並不需要為多個具有相同表結構的表產生多個實體類,因為實體類可以動態修改所指向的表名,使得操作的目標表發生改變。為了避免多線程環境所帶來的影響,該修改僅影響當前線程。

串連名的修改方式與表名相同。

14、弱類型訪問

IEntity,IEntityOperate)

有時候,我們並不知道需要操作的是哪一個實體類,只有在運行時才能確定下來。常用的做法就是反射!

為了避免不必要的效能損耗,以及避免很不美觀的編碼設計方式,XCode提供了弱類型訪問的能力。可以通過指定類型或者表名,反射找到實體類,建立一個IEntityOperate操作對象,從而完成對實體類的各種操作。

IEntityOperate所提供的方法跟實體類的靜態方法基本一致,在使用上不會遇到任何困難。IEntityOperate進行資料查詢時,返回的是IEntity集合,因為每一個實體類,都實現了IEntity介面,足以完成基本的CURD操作。

15、動態產生代碼

CodeDOM,記憶體實體)

在弱類型訪問的支援下,有些簡單的資料庫操作並不一定需要產生實體類,XCode在找不到實體類時,將會根據表架構在記憶體中產生一個實體類,然後編譯使用。

動態產生的另一目標是讓使用者通過調用一些方法來產生實體類代碼,而不是一定要通過XCoder來產生。

16、擴充載入

把查詢中的欄位對應到擴充屬性)

XCode支援的是充血模型,從物件導向的角度上來講,這個對象的所有特點屬性)和能力方法)都應該在實體類上實現。除了基本的與資料庫欄位對應的資料屬性外,還有一些跟別的實體物件關聯的屬性,我們稱之為擴充屬性。比如:Article.Board.Manager.UserName,可以直接得到一個文章的版主的使用者名稱。

XCode不支援多表關聯查詢,但是它有擴充屬性,所有的多表關聯查詢,都可以通過擴充屬性來編碼實現。Article中的Board擴充屬性,是在使用的時候才去載入的,加上Board可以使用實體緩衝,基本上沒有資料庫操作。Manager不能使用實體緩衝,但是它作為擴充屬性“掛”在Board上,間接“享受”了緩衝。

還可以編寫一個普通的屬性作為擴充屬性,然後執行查詢的時候,通過selects參數把資料對應到該擴充屬性上。比如:增加一個Total的整型屬性,然後執行查詢Article.FindAll("BoardID=123",null,"Count(*) as Total",0,1),該查詢是取得欄目編號為123的所有貼文數,然後把結果映射到Total屬性上,返回的記錄集只有一個實體物件,該實體物件的Total屬性就是所要查詢的貼文數,此時別的屬性沒有意義。

該功能一般用於查詢統計中。使用一個實體來表現資料,比資料集方便多了。

擴充屬性是充血模型所特有的東西,也是相對於貧血模型含失血模型)的最大優勢所在!

17、泛型基類模型

 
  1. Entity<TEntity>) 

XCode從v1.2起,就進入了第二代,關鍵點就在於泛型基類Entity<TEntity>的使用。

在第一代XCode中,因為充血模型,實體類上要附帶大量的方法,而當它們的傳回型別是實體類或者實體類集合時,這些方法就必須實現於實體類的代碼中,實際上是通過代碼產生器來產生。

在第二代XCode,引入了泛型基類技術,實體類通過泛型參數TEntity指定最終傳回型別,編寫查詢方法的時候,傳回型別使用泛型參數TEntity即可。所以,第二代實體類只有屬性和索引器,基本不需要產生查詢和操作的方法,因為它們都在泛型基類裡面實現了。

大多數情況下,實體類指定的基類泛型參數就是它自己,因為它需要以它自己作為傳回型別。但XCode開發模式是物件導向的,包括實體類,也希望能夠繼承,增加一些功能,該功能可以通過改變泛型參數來實現。

18、實體類的繼承與重載

 
  1. NewLife.CommonEntity) 

通過改變泛型參數的具體類型,實現實體類的繼承和重載,是XCode進入第三代的標誌。它標誌著我們可以封裝一些基礎資料實體來供多重專案使用。

通用實體組件NewLife.CommonEntity就是該功能的代表,封裝了地區、管理員、角色、菜單、授權等實體類。具體項目可以直接使用它們,也可以通過繼承與重載來實現擴充。

以封裝的地區表為例,它在靜態建構函式中檢測資料表行數,當然,在這之前XCode會自動檢測並建立地區表。如果地區表中沒有資料,則會調用一個方法進行資料初始化操作。地區表業務類代碼通過寫入程式碼方式,內建了全國幾千個地區的地區編碼和名稱。

一旦國家修改地區劃分,只需要修改該類,所有使用該組件的項目都將使用上全新的地區資料。如果這些功能代碼都複製到每一個使用的項目中去,將形成一個非常難以維護的狀況。

小結:詳談XCode學習基礎之ORM組件的內容介紹完了,希望本文對你有所協助。更多相關xcode的內容,請參考編輯精選。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.