1.有一段時間一直用的hibernate進行頁面的分頁功能,很簡單,後來一次突然是使用Jdbc進行查詢分頁,我第一反應是使用subList這個方法來取list的子集,但是遇到要讀取三千條資料進行分頁或者更多的時候,這樣就會失去效率,後來使用oracel中的rownum實作了
2.首先看我們的目标資料(測試資料有點少)
(具體jdbc連接配接資料庫參考上篇部落格,這裡不再累述,這裡還有一個Page分頁類)
//查找全部結果集sql
String sql="select t.* from yz_test_tree t";
//查詢結果集總量sql
String countSql = "select count(0) from ("+sql+")";
//開始執行第二個sql,設定結果集總條數
ps = conn.prepareStatement(countSql);
res = ps.executeQuery();
while (res.next()) {
page.setTotalCount(res.getInt("COUNT(0)"));
}
//執行第一個sql,查詢需要的結果集
這裡會有從前台傳過來的分頁參數(在Page中):
currentPage,目前頁(這裡預設,表示第一頁)
pageSize,每頁顯示條數(這裡預設)
//目前傳回的資料從第(+1)條開始,這裡是0表示從第一條到第十條
int startPage = page.getCurrentPage*page.getPageSize();
String endSql = pagingByOracle(sql,startPage,page.getPageSize());
//執行endSql就是1-10條資料,我們需要的
ps = conn.prepareStatement(endSql);
res = ps.executeQuery();
while(res.next()){
//疊代出res的結果集傳回到前台就可以了
}
//下面寫實作分頁工具類pagingByOracle
public String pagingByOracel(String sql,int startPage,int pageSize){
//目前頁最大值
int maxPage = startPage+pageSize;
String endSql = "select * from ("+
"select t.*,rownum row_ from (" +sql + ") t"+
" where rownum<="+maxPage+
") where row_>"+startPage;
return endSql;
}
//在這個編輯器拼裝sql很麻煩,可能會存在小問題,我用oracle測一遍
3.結果
這裡就得到了第一頁,-條資料
//rownum排序始終從1開始,是以,在設定開始資料值得時候,
要先把rownum查出來,在進行比較選擇
4.至于前台怎麼分頁,我使用的是jquery.pagination.js這個插件。下面就貼一下大概的代碼,不具體介紹了。
<div id="pa" class="pagination"></div>
<script>
//生成分頁工具條
$("#pa").pagination(
${page.totalCount}, //結果總數
{
//目前頁,0表示第一頁
current_page: ${page.currentPage},
//每頁顯示資料多少
items_per_page: ${page.pageSize},
//回調函數
callback: 為翻頁調用次函數
});
</script>
5.分頁就這樣做完了,具體這個分頁工具要導入對應的js和css,還有一些參數的設定就根據自己的需求來,可以全看api之類的介紹。