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

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

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

      充血模型的ORM能做什么?——ORM組件XCode(十八般武藝)

      ORM組件XCode(十八般武藝)

      之前,XCode總是若隱若現,耐性好的同學想知道它還有啥特點,沉不住氣的則認為不過是CURD耳!

       

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

       

      XCode的特點如下:

      0、基本的CURD功能

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

      XCodeCURD通過反射實體類生成查詢和操作SQL實現,數據庫結構信息通過特性附在實體類上。之所以選擇SQL而不是DbCommand,因為XCode的實體層和數據訪問層是分開的,目前是為了實現一級緩存,將來會在這里實現分布式數據訪問。

      1、完美支持ObjectDataSource

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

      詳見《與ObjectDataSource共舞》

      2、全面分頁支持

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

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

      詳見《撬動千萬級數據》

      3、實體集合支持

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

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

      4、萬能的一級緩存

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

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

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

      5、漂亮的實體緩存

      實體緩存又成為二級緩存。盡管有了一級緩存,但它只是緩存了數據集而已,使用的時候還是要加載數據集成為實體集合。

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

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

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

      6、飄逸的單對象緩存

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

      單對象緩存里面的實體對象,修改數據時,如非必要,不要手工調用更新方法,單對象緩存有自動保存的功能。該特性適用于更新非常頻繁的場合,比如在線用戶表,可以讓多次更新積累在一起,然后最后自動更新一下。

      7、出色的性能

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

      回過頭來看看上面的緩存,如果這10個學生是同班,那么在一級緩存的作用下,實際查詢數據庫將會是1+1=2,后面9次班級查詢被一級緩存攔截了。在高并發的系統中,后面這個1就趨向于0了,因為緩存是全局共享的。

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

      在學生資料界面等地方,學生表查詢是非常頻繁的。顯然,這是一個非常適用單實體緩存的場合。學生附屬屬性(關聯表)等信息,可以通過擴展屬性“掛”在學生實體對象上,“享受”到緩存的待遇。

      數據庫層面也有一個緩存,可以算是0級緩存吧。我們所有的查詢都是單表查詢,對數據庫而言非常簡單,同時,因為簡單的SQL,數據庫緩存命中率極高,并且非常便于建立索引進行優化。

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

      8、臟數據支持

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

      XCode的實體類中,每個數據屬性的set方法,都會先調用OnPropertyChange方法,其實就是為了設置該字段的臟屬性,說明這個字段的數據曾經被修改過。生成Update語句的時候,只修改帶有臟屬性的字段。

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

      9、多數據庫支持

      MSSQL2000MSSQL2005/2008OracleMySQLAccessSQLite

      與大多數ORM一樣,XCode通過接口的方式支持多種數據庫。在XCode中,為每一個數據庫實現了一個數據庫操作類,繼承自數據庫接口。數據訪問層DAL根據數據庫連接的配置識別是哪一種數據庫,然后創建該數據庫操作類的實例,并通過操作接口來操作數據庫。

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

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

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

      10、獲取數據庫架構

      DAL.Tables

      XCode中,數據庫架構主要包含XTableXField類,顧名思義,它們代表著表和字段信息。數據訪問層DAL中有個成員屬性Tables可以取得該數據庫連接的所有表信息,也就是一個XTable集合。同理,每一個XTable中,都會有一個XField集合。

      這樣設計,簡單明了,使用者可以很容易的找到自己需要的東西。我們的代碼生成器XCoder就是依賴于XCode來獲取數據庫架構的。有了這個功能,人人都可以寫自己的代碼生成器了!

      11、反向生成數據庫架構

      DatabaseSchema

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

      在數據庫操作接口中,其中一個功能就是DDL操作,各個數據庫進行重載后,可以使用DDL語句操作數據庫的結構。常用的功能有:創建表、修改字段屬性、添加字段、刪除字段等。

      XCode除了會從數據庫生成數據庫架構外,還會從實體類生成一套數據庫架構,然后進行對比,發現存在差異后,直接修改或者寫日志提醒(由設置決定)。修改開關沒打開時,僅僅寫日志提醒,日志中寫出了完整的用于修正數據庫架構的DDL語句,拿到數據庫中執行即可。

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

      也許有人會說,不帶數據庫的話,初始化的數據怎么辦?在XCode的開發理念中,建議在實體類增加靜態構造函數,用于檢測數據表數據,如果沒有數據時,是否需要創建一個默認數據,比如在管理員表創建一個用戶名和密碼都是admin的管理員。

      12、動態修改連接和表名

      Meta.ConnNameMeta.TableName

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

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

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

      13、弱類型訪問

      IEntityIEntityOperate

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

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

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

      14、動態生成代碼

      CodeDOM,內存實體)

      在弱類型訪問的支持下,有些簡單的數據庫操作并不一定需要生成實體類,XCode在找不到實體類時,將會根據表架構在內存中生成一個實體類,然后編譯使用。

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

      15、擴展加載

      (把查詢中的字段映射到擴展屬性)

      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屬性就是所要查詢的帖子數,此時別的屬性沒有意義。

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

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

      16、泛型基類模型

      Entity<TEntity>

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

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

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

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

      17、實體類的繼承與重載

      NewLife.CommonEntity

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

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

      以封裝的地區表為例,它在靜態構造函數中檢測數據表行數,當然,在這之前XCode會自動檢測并創建地區表。如果地區表中沒有數據,則會調用一個方法進行數據初始化操作。地區表業務類代碼通過硬編碼方式,內置了全國幾千個地區的區域編碼和名稱。一旦國家修改區域劃分,只需要修改該類,所有使用該組件的項目都將使用上全新的區域數據。如果這些功能代碼都復制到每一個使用的項目中去,將形成一個非常難以維護的狀況。

       

      XCode的十八般武藝就介紹到這,更多的功能需要你去發現!歡迎感興趣的朋友前來交流討論,QQ10193406

       

      XCode就是為了讓一切變得簡單!學習簡單、使用簡單、想法簡單……功能不簡單!

       

      大石頭

      新生命開發團隊

      2010-09-24 4:18

      posted @ 2010-09-25 09:21  大石頭  閱讀(8714)  評論(58)    收藏  舉報
      主站蜘蛛池模板: 国产精品制服丝袜无码| 国产又爽又大又黄a片| 东京热高清无码精品| 亚洲熟妇一区二区三个区| 深夜福利啪啪片| 国产极品美女高潮抽搐免费网站 | 日本免费人成视频在线观看| 国内精品久久久久影院不卡| 亚洲男人在线天堂| 国产精品国三级国产专区| 国产精品久久久久久久久电影网| 久久热这里只有精品66| 亚洲性线免费观看视频成熟| 免费无码黄网站在线观看| 亚洲精品国产老熟女久久| caoporn免费视频公开| 乱人伦中文字幕成人网站在线| 亚洲 一区二区 在线| 美女裸体十八禁免费网站| 一区二区三区无码免费看| 国产成人免费| 国产精品护士| 亚洲精品日韩在线丰满| 成人免费亚洲av在线| 成人伊人青草久久综合网| 亚洲欧美牲交| 男女性高爱潮免费网站| 亚洲热视频这里只有精品| 亚洲国产色播AV在线| 日本免费一区二区三区日本 | 无码国模国产在线观看免费| 办公室强奷漂亮少妇同事| 国产在线中文字幕精品 | 99九九成人免费视频精品| 亚洲国产精品久久久天堂麻豆宅男 | 武邑县| 亚洲国产精品一区二区第一页| 国产乱子伦一区二区三区视频播放 | 国产精品久久蜜臀av| 在线观看潮喷失禁大喷水无码| 亚洲中文字幕无码专区 |