前言
在bs開發上不可避免地要實現分頁處理,分頁處理目前來說基本是兩種處理方式:資料庫分頁和記憶體分頁。
資料庫分頁
資料庫分頁:利用資料庫提供的分頁查詢功能實現,如在mysql3中的查詢**:
select * from employee where dept_id='d11' limit 10,20
這兒利用limit實現資料庫分頁查詢。這樣做的好處是顯而易見的,當employee**的資料量很大時可以獲得乙個效率非常好的查詢。
但是這樣做也存在乙個缺點,就是我們無法獲知部門d11下員工的總記錄數資訊,為了得到這個資訊,我們就只能再通過乙個select count(*) from (select * from employee where dept_id='d11')這種sql語句再執行一次查詢,得到記錄總數並計算總頁數資訊。從而得到如下圖翻頁導航欄。
記憶體分頁
記憶體分頁:目前不少web框架提供的標籤分頁功能都是通過記憶體分頁實現的。記憶體分頁就是你把所有的資料統統交給標籤(或則標籤的dataprovider),由標籤根據自身的需要從這些資料中檢索出需要的資料傳遞到客戶端並加以展示。很顯然,這種做法對於記錄總數和總頁數資訊的統計非常直接。很容易就可以計算出來。
但是我們也要看到這種處理方式應付資料量較小的資料庫問題不大,遇上資料量大的就一定有較嚴重的效能問題。
筆者曾經遇到過一家軟體開發公司使用了sitemesh開發框架實現分頁處理,初期很順利,可以到系統上線的時候系統響應就極為緩慢。為此還特別論證了數日,最終不得不在持久層實現資料庫分頁技術再整合到sitemesh標籤中加以解決。工作量較大,會引起應用框架(bo,dao等等)的大調整。
以上兩種實現方式中除了效能上的差異,我想最大的差異會體現在軟體架構的設計上。乙個實現記憶體分頁的軟體架構在設計上只要在view層將資料過濾一下就可以。這樣在bo這一層以及dao呼叫層就不需要考慮分頁問題,例如乙個員工查詢我們可以這麼設計乙個介面:
list getemployees();//獲取員工
list getemployees(object queryparameters);//根據引數查詢員工
//但是如果我們要在資料庫層實現分頁技術,則我們在呼叫dao或bo的時候的介面就得怎麼寫:
list getemployees(int pageindex, int pagesize);//獲取員工
list getemployees(object queryparameters, int pageindex, intpagesize);//根據引數查詢員工
很顯然,這種介面對於uml設計模式來說實在是令人太難接受了,所有的介面都得這麼寫,幾乎找不到任何oo理念了。
dataset預設支援資料庫分頁技術
dbdataset
dataset預設支援資料庫分頁技術,dbdataset(子類有sqldataset, autosqldataset)都是直接在資料庫中分頁的,例如我們在sqldataset中設定了sql為select * from employee屬性,並設定pagesize屬性為5之後,系統執行時sqldataset會自動的在sql語句之後新增分頁處理**。執行時sql為select * from employee limit 5,當我們檢視第二頁資料時,則sql語句變為select * from employee limit 6,10
在dorado中,dbdataset支援各種型別資料庫的開發,不同的資料庫採用不同的方言實現(dialect).dialect在datasource.xml中配置。dorado在這些方言中針對不同的資料庫提供了各種不同的分頁查詢技術。
datasource.xml中配置**如下:
30000
30000
org.hsqldb.jdbcdriver
jdbc:hsqldb:file:d:/dorado5/sample/data/hsqldb/doradosample
com.bstek.dorado.data.db.dialect.hsqldbdialectsa0
0000
對於未提供方言實現的資料庫,我們可以直接繼承com.bstek.dorado.data.db.dialect.defaultdialect,或則想更改方言預設分頁實現機制的我們可以繼承預設的方言實現類,實現擴充套件類的getpagingsql方法,方法申明如下:
public string getpagingsql(string sql, int pagesize, int pageindex) ;
參考範例(mysql3):
customdataset,marmotdataset等都是被動的接受外部分頁之後的資料展示到客戶端,並且還要告訴dataset的總頁數(pagecount)資訊,我們看如下的**:
session session = hibernateutils.opensession();
tryfinally
注意以上的**中,在dorado的dataset發出分頁數居請求時,我們都可以通過dataset的getpageindex()獲得當前請求的頁資訊,以及通過getpagesize()獲取dataset請求的每頁記錄數資訊。後台的邏輯層**可以通過這兩個引數查詢出相關的資料並儲存到dataset中,另外乙個很重要的工作不要忘,要設定dataset的pagecount屬性,通知dataset一共有多少頁的查詢結果。dataset的fromdo方法參考:vo開發with dorado dataset的思考
由於筆者所在公司的客戶所開發的專案一般都為大資料量的專案,因此在框架設計中就已經實現了分頁處理,並且還有更多的優化措施,例如快取處理機制等等。就不一一而言了。當然有時候也會遇上對分頁處理沒有概念的客戶,需要引導。也會遇到沒有分頁處理功能的框架,則可以做一定的重構加以解決。
(完)
分頁技術之PageDataSource類
之前給大家介紹了分頁技術之gridview控制項,今天給大家介紹另外一種分頁技術,採用pagedatasource類 repeater控制項來實現。前台只需要拖出乙個repeater控制項來繫結要顯示資料即可。後台 的實現具體步驟如下 第一步 連線資料庫獲取要顯示的內容 連線資料庫及將資料封裝到乙個...
分頁技術之GridView控制項
5455 5657 5859 view code gridview container.parent.parent pageindex 1獲取當前控制項顯示的頁面數 gridview container.parent.parent pagecount獲取當前控制項總的頁面數 causesvalida...
sql 分頁 後台分頁技術
select stunumber,stuname,case when stumath 90then 優 when stumath 80then 良 when stumath 70then 中 else 差 end as 數學成績 from tbstudent 第一種用法 case語句就是構造乙個新的...