wojilu系统的ORM介绍
wojilu系統是一個包含了很多很多子系統的框架,當然,ORM也是其中一個很有用的系統。
wojilu ORM 盡量設計得簡單易用,從下圖可以看出,總共也就9個方法(重載方法不算)。
下面舉一些例子來演示:
findById
Article article = Article.findById( 2 );
findAll
List<Article> list = Article.findAll();
find
說明:本方法最強大,一般的查詢、搜索都使用本方法。
List<Article> list = Article.find( "Title=:t and IsDelete=:isdel" )
??? .set( "t", "" )
??? .set( "isdel", 1 )
??? .list();
List<Article> list = Article.find( "Title=:t and IsDelete=:isdel" )
??? .set( "t", "" )
??? .set( "isdel", 1 )
??? .first();?
參數化查詢說明1(id in 的特殊處理)
List<TCat> cats = db.find<TCat>( "Id in (:id1,:id2,:id3)" ) ?? ? ? ? ? ? ? ?.set( "id1", 6 ) ?? ? ? ? ? ? ? ?.set( "id2", 7 ) ?? ? ? ? ? ? ? ?.set( "id8", 8 ) ?? ? ? ? ? ? ? ?.list();——這句是對的。或者拼接ids,不使用參數化 注意,不應該是List<TCat> cats = db.find<TCat>( "Id in (:ids)" ) ?? ? ? ? ? ? ? ?.set( "ids", "6,7,8" ) ?? ? ? ? ? ? ? ?.list();——這句是錯誤的 更多說明在這里:http://www.wojilu.com/Forum1/Topic/1108
參數化查詢說明2(like語句中的特殊處理) 正確的做法是:Package.find("Status=0 and Title like?'%'+:t+'%'").set("t",t).list() 注意:不是?Package.find("Status=0 and Title like '%:t%'").set("t",t).list()——這是錯誤做法,注意區分。
?
findPage
DataPage<Article> plist = Article.findPage( "IsDelete=0" );
int rd = plist.RecordCount;
int pageCount = plist.PageCount;
string pagerBar = plist.PageBar;
List<Article> list = plist.Results;
findBySql
List<Article> list = Article.findBySql( "select * from Article" );
count
int articleCount = Article.count( "IsDelete=0" );
insert
Article article = new Article();
...
article.insert();
update
Article article = Article.findById( 2 );
article.Title = "my new title";
article.update();?
update( string property )
Article article = Article.findById( 2 );
article.Title = "my new title";
article.update( "Title" );??
updateBatch
Article.updateBatch( "set IsDelete=1", "CategoryId=2" );
delete
Article article = Article.findById( 2 );
article.delete();??
deleteBatch
Article.deleteBatch( "CategoryId=2" );
以上方法看似簡單,實際上可以對付99%的數據操作需求,尤其是第三個find方法,采用參數化查詢方式,可以做大多數事情。
另外的 1% 的需求,您可以通過 db.run 對象操作,也就是直接使用原生的sql語句。
在設計 wojilu ORM 的時候,改版了好多次,曾經的接口方法要多很多,也復雜很多。比如曾經有一個 findBy( string property, object val ) 方法,看似很有用,在實際項目中進行統計之后,才發現用到的地方極少,就砍掉了,萬一需要,您也可以通過find方法實現。
這就是 wojilu ORM 的設計原則:簡潔!簡潔!簡潔!實用!實用!實用!
wojilu ORM 配置:
同時,wojilu的ORM,如果和wojilu的緩存系統一起使用,則可以將數據庫訪問的性能達到一個極致。
?
wojilu ORM中的緩存分成兩部分:ContextCache(一級緩存)和ApplicationCache(二級緩存)。ContextCache(一級緩存)這里的ContextCache僅僅存在于一個上下文中,具體到網站訪問上,就是頁面開始到頁面結束,之后就不存在了。雖然緩存時間是瞬間的(比如只有幾十毫秒),但也很有意義。它不是靜態緩存,作為一級緩存,在web情況下,它是放在HttpContext中的。它的特點是隨用隨棄,不用考慮緩存策略,不會給內存增加負擔,而在實戰中很有價值,比如一個很大的頁面分成了5個部分,在每個部分進行數據綁定的時候,可能出現重復的數據讀取,比如頁面頭部查詢了user,頁面中部、數據列表等也查詢了user,這些重復的查詢都會默認直接從ContextCache中讀取。如果是自己手寫sql,往往就要細心避免這里的sql重復查詢問題。
ApplicationCache(二級緩存)能長時間存在于內存中,作為二級緩存,往往是為了應付性能方面的壓力。
ContextCache基本上是必須的、默認的,而ApplicationCache則需要根據實際的應用場景來實施。通常情況下,只有從一級緩存中檢索不到數據,才去二級緩存中繼續檢索,如果二級緩存中也沒有,才去數據庫讀取。
一級緩存是默認自動開啟的,你不需要管他。
二級緩存需要手動打開。對于一個網站來說,最容易看出優化效果的,是二級緩存。它的主要目的就是實現透明緩存,所謂“透明緩存”,也就是不需要手工控制緩存的失效或過期,由ORM自動管理。 實現“透明緩存”的關鍵之處在于,在啟用了ApplicationCache之后,每次查詢出數據并加入緩存的時候,同時也緩存一個加入時間的時間戳。
我們以 ApplicationPool(對象緩存池) 為例,當將一個對象加入緩存的時候—— ? ? ? ? public void Add( IEntity obj ) {
? ? ? ? ? ? if (obj == null) return;
? ? ? ? ? ? String key = CacheKey.getObject( obj.GetType(), obj.Id ); ? ? ? ? ? ? addToApplication( key, obj ); ? ? ? ? ? ? CacheTime.updateObject( obj ); // 加入緩存的時候,設置最新 timestamp ? ? ? ? }
除了將對象放入緩存 addToApplication ,還保存了一個時間戳 CacheTime.updateObject( obj ) 。有了這個時間戳,那么,ORM就會知道哪些對象是更新過的,哪些對象是沒有更新過的。在對象更新或刪除的時候,會讓緩存的對象刷新時間戳,比如在 UpdateOperation 中—— CacheTime.updateTable( entityInfo.Type ); 表明這個對象已經被更新過了,所以下次客戶端再檢索就不會從緩存中取過期的對象。
對于一系列對象的列表,會在緩存中維護一個對象的id的列表,而不是直接將List<Object>放進去,請看 ApplicationPool 的 addList 方法, ? ? ? ? ? ? List<int> ids = new List<int>(); ? ? ? ? ? ? foreach (IEntity obj in objList) ids.Add( obj.Id ); ? ? ? ? ? ? addToApplication( key, ids );
緩存中存放的是 ids。
總結一下:二級緩存的好處有兩個:一是大幅度提高性能,降低數據庫壓力,不用重復查詢數據庫;二是全自動管理緩存,避免手工管理緩存的復雜度和bug。
關于ORM中啟用數據庫事務的介紹:? http://www.cnblogs.com/TextEditor/archive/2011/06/25/2090401.html
轉載于:https://www.cnblogs.com/TextEditor/archive/2011/06/26/2090389.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的wojilu系统的ORM介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国内云存储产品应用简介
- 下一篇: 电脑开不了机怎么办