天天看點

基于oracle的分頁功能(jdbc實作)

1.有一段時間一直用的hibernate進行頁面的分頁功能,很簡單,後來一次突然是使用Jdbc進行查詢分頁,我第一反應是使用subList這個方法來取list的子集,但是遇到要讀取三千條資料進行分頁或者更多的時候,這樣就會失去效率,後來使用oracel中的rownum實作了

2.首先看我們的目标資料(測試資料有點少)

基于oracle的分頁功能(jdbc實作)
(具體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.結果

基于oracle的分頁功能(jdbc實作)
這裡就得到了第一頁,-條資料
//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之類的介紹。