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