隨筆-72  評論-63  文章-0  trackbacks-0

          對于分頁,主要思想無非兩種,一是從數據庫取出所有記錄后進行分頁,另一種思路是在取出數據的同時進行分頁,然后在頁面顯示,昨晚查了不少資料,對目前流行的分頁方式總結了下。
          個人覺得寫的比較好的兩篇文章:
          http://www.matrix.org.cn/thread.shtml?topicId=40818&forumId=23
          http://forum.javaeye.com/viewtopic.php?t=6298(java視線對這個問題討論的比較深入,受益匪淺)
          本人目前有個項目要用到Spring的JdbcTemplate,順帶搜了點關于其分頁的實現方法:

          ??????????????????????????????????????????? 用Spring的JdbcTemplate實現分頁功能
          最近使用了spring中的JdbcTemplate實現數據庫的查詢和插入操作,發現spring的JdbcTemplate 不象HibernateTemplate那么好,已經實現了分頁功能。所以要自己實現,使用getJdbcTemplate().queryForList(string sql)得到的結果集是所有的。
            
            如果你的查詢有10000條記錄,或者更多,速度肯定慢了,當然你可以通過resultset中的游標控制查詢的起始和結束。我這里用的是Oracle數據庫,使用偽列ROWNUM來實現分頁。我的分頁代碼如下:
            
            
          ????package com.deity.ranking.util;import java.util.List;
            import org.springframework.jdbc.core.JdbcTemplate;
            import org.springframework.jdbc.core.support.JdbcDaoSupport;
            /** * 分頁函數 * * @author allenpan */public class Pagination extends JdbcDaoSupport{
            public static final int NUMBERS_PER_PAGE = 10;
            //一頁顯示的記錄數
            private int numPerPage;
            //記錄總數
            private int totalRows;
            //總頁數
            private int totalPages;
            //當前頁碼
            private int currentPage;
            //起始行數
            private int startIndex;
            //結束行數
            private int lastIndex;
            //結果集存放List
            private List resultList;
            //JdbcTemplate jTemplate
            private JdbcTemplate jTemplate;
            /**
            * 每頁顯示10條記錄的構造函數,使用該函數必須先給Pagination設置currentPage,jTemplate初值
            * @param sql oracle語句
            */
            public Pagination(String sql){
            if(jTemplate == null){
            throw new IllegalArgumentException("com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. ");
            }else if(sql.equals("")){
            throw new IllegalArgumentException("com.deity.ranking.util.Pagination.sql is empty,please initial it first. ");
            }
            new Pagination(sql,currentPage,NUMBERS_PER_PAGE,jTemplate);
            }
            /**分頁構造函數
            * @param sql 根據傳入的sql語句得到一些基本分頁信息
            * @param currentPage 當前頁
            * @param numPerPage 每頁記錄數
            * @param jTemplate JdbcTemplate實例
            */
            public Pagination(String sql,int currentPage,int numPerPage,JdbcTemplate jTemplate){
            if(jTemplate == null){
            throw new IllegalArgumentException("com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. ");
            }else if(sql == null || sql.equals("")){
            throw new IllegalArgumentException("com.deity.ranking.util.Pagination.sql is empty,please initial it first. ");
            }
            //設置每頁顯示記錄數
            setNumPerPage(numPerPage);
            //設置要顯示的頁數
            setCurrentPage(currentPage);
            //計算總記錄數
            StringBuffer totalSQL = new StringBuffer(" SELECT count(*) FROM ( ");
            totalSQL.append(sql);
            totalSQL.append(" ) totalTable ");
            //給JdbcTemplate賦值
            setJdbcTemplate(jTemplate);
            //總記錄數
            setTotalRows(getJdbcTemplate().queryForInt(totalSQL.toString()));
            //計算總頁數
            setTotalPages();
            //計算起始行數
            setStartIndex();
            //計算結束行數
            setLastIndex();
            System.out.println("lastIndex="+lastIndex);//////////////////
            //構造oracle數據庫的分頁語句
            StringBuffer paginationSQL = new StringBuffer(" SELECT * FROM ( ");
            paginationSQL.append(" SELECT temp.* ,ROWNUM num FROM ( ");
            paginationSQL.append(sql);
            paginationSQL.append(" ) temp where ROWNUM <= " + lastIndex);
            paginationSQL.append(" ) WHERE num > " + startIndex);
            //裝入結果集
            setResultList(getJdbcTemplate().queryForList(paginationSQL.toString()));
            }
            /**
            * @param args
            */
            public static void main(String[] args) {
            // TODO Auto-generated method stub    }
            public int getCurrentPage() {
            return currentPage;
            }
            public void setCurrentPage(int currentPage) {
            this.currentPage = currentPage;
            }
            public int getNumPerPage() {
            return numPerPage;
            }
            public void setNumPerPage(int numPerPage) {
            this.numPerPage = numPerPage;
            }
            public List getResultList() {
            return resultList;    }
            public void setResultList(List resultList) {
            this.resultList = resultList;
            }
            public int getTotalPages() {
            return totalPages;
            }
            //計算總頁數
            public void setTotalPages() {
            if(totalRows % numPerPage == 0){
            this.totalPages = totalRows / numPerPage;
            }else{
            this.totalPages = (totalRows / numPerPage) + 1;
            }
            }
            public int getTotalRows() {
            return totalRows;
            }
            public void setTotalRows(int totalRows) {
            this.totalRows = totalRows;
            }
            public int getStartIndex() {
            return startIndex;
            }
            public void setStartIndex() {
            this.startIndex = (currentPage - 1) * numPerPage;
            }
            public int getLastIndex() {
            return lastIndex;
            }
            public JdbcTemplate getJTemplate() {
            return jTemplate;
            }
            public void setJTemplate(JdbcTemplate template) {
            jTemplate = template;
            }
            //計算結束時候的索引
            public void setLastIndex() {
            System.out.println("totalRows="+totalRows);///////////
            System.out.println("numPerPage="+numPerPage);///////////
            if( totalRows < numPerPage){
            this.lastIndex = totalRows;
            }else if((totalRows % numPerPage == 0) || (totalRows % numPerPage != 0 && currentPage < totalPages)){
            this.lastIndex = currentPage * numPerPage;
            }else if(totalRows % numPerPage != 0 && currentPage == totalPages){//最后一頁
            this.lastIndex = totalRows ;
            }
            }}在我的業務邏輯代碼中:
            /**
            * find season ranking list from DC
            * @param areaId 選手區域id
            * @param rankDate 賽季
            * @param category 類別
            * @param characterName 角色名
            * @return List
            */
            public List findSeasonRankingList(Long areaId, int rankYear,int rankMonth,
            Long categoryId,String characterName) {
            //SQL語句
            StringBuffer sql = new StringBuffer(" SELECT C.USERID userid,D.POSNAME posname,C.GAMEID gameid,C.AMOUNT amount,C.RANK rank FROM ");
            //表            sql.append(" (SELECT B.USERID USERID,");
            sql.append(" B.POSID POSID,");
            sql.append(" A.DISTRICT_CODE DISTRICTCODE,");
            sql.append(" A.GAMEID GAMEID,");
            sql.append(" AMOUNT AMOUNT,");
            sql.append(" RANK RANK ");
            sql.append(" FROM TB_FS_RANK A ");
            sql.append(" LEFT JOIN TB_CHARACTER_INFO B ");
            sql.append(" ON A.DISTRICT_CODE = B.DISTRICT_CODE ");
            sql.append(" AND A.GAMEID = B.GAMEID ");
            //附加條件
            if(areaId != null && areaId.intValue() != 0){
            sql.append(" and A.DISTRICT_CODE = " + areaId.intValue());
            }
            if( rankYear > 1970 && rankMonth > 0){
            //hql.append(" and sas.id.dt >= to_date('" + rankYear + "-" + rankMonth + "-01 00:00:00'," + "YYYY-MM-DD HH24:MI:SS");
            //hql.append(" and sas.id.dt <= to_date('" + rankYear + "-" + rankMonth + "-" + TimeTool.findMaxDateInMonth(rankYear,rankMonth) + " 23:59:59'," + "YYYY-MM-DD HH24:MI:SS");
            sql.append(" and A.DT = fn_time_convert(to_date('" + rankYear + "-" + rankMonth + "'," + "'YYYY-MM')) ");
            }
            if(categoryId != null && categoryId.intValue() != 0){
            sql.append(" and A.CID = " + categoryId.intValue());
            }
            if(characterName != null && !characterName.trim().equals("")){
            sql.append(" and A.GAMEID = '" + characterName.trim()+"' ");
            }
            sql.append(" ORDER BY RANK ASC) C ");
            sql.append(" LEFT JOIN TB_FS_POSITION D ");
            sql.append(" ON C.POSID = D.POSID ");
            sql.append(" ORDER BY C.RANK ");
            System.out.println("hql="+sql.toString());////////////////
            //使用自己的分頁程序控制結果集
            Pagination pageInfo = new Pagination(sql.toString(),1,10,getJdbcTemplate());
            return pageInfo.getResultList();
            //return getJdbcTemplate().queryForList(sql.toString());
            }?
          非常簡單但有使用的分頁條件判斷語句。

          if ($page <= 1) {
          ??????????? $page_str .= "[首頁][上一頁]";
          ??????? } else {
          ??????????? $page_str .= "[<a href=$PHP_SELF?module=$module&page=1>首頁</a>][<a href=$PHP_SELF?module=$module&page=".($page-1).">上一頁</a>]";
          ??????? }
          ??????? if ($page >= $page_total) {
          ??????????? $page_str .= "[下一頁][尾頁]";
          ??????? } else {
          ??????????? $page_str .= "[<a href=$PHP_SELF?module=$module&page=".($page+1).">下一頁</a>][<a href=$PHP_SELF?module=$module&page=$page_total>尾頁</a>]";
          ??????? }
          嘿嘿,時候不早了,順帶推薦首歌給各位夜貓:http://61.156.33.18/yy/男歌手/光良/第一次/我想去個地方.mp3
          posted on 2006-05-03 03:35 船長 閱讀(7847) 評論(4)  編輯  收藏

          評論:
          # re: spring分頁匯總 2008-04-27 20:18 | 惠萬鵬
          船長,我看了很多spring 分頁的博客,就您的不錯。對我有不少的啟發和幫助。謝謝。  回復  更多評論
            
          # re: spring分頁匯總 2008-04-27 20:36 | 惠萬鵬
          不過,在真實項目如此用法的較少。
          查找多條記錄我通常如下定義接口:
          public ResSel select(ReqSel rs){
          return null
          }
          分頁專門有一個PageBar,沒放在DAO之中。  回復  更多評論
            
          # re: spring分頁匯總 2010-04-01 09:56 | JACKYRONG
          hi,能否發個完整代碼給我參考下呢?  回復  更多評論
            
          # re: spring分頁匯總[未登錄] 2012-03-20 15:08 | 123
          陪陪  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 阳山县| 镇康县| 莎车县| 清徐县| 云林县| 永定县| 达州市| 永州市| 沐川县| 资阳市| 贞丰县| 金塔县| 宿松县| 酒泉市| 萨嘎县| 西华县| 平湖市| 兴城市| 仁怀市| 彭泽县| 临夏县| 石门县| 廊坊市| 会昌县| 乌苏市| 正镶白旗| 墨玉县| 当涂县| 积石山| 兴城市| 湖北省| 布尔津县| 洛宁县| 湖南省| 万州区| 高陵县| 奇台县| 岑巩县| 简阳市| 嘉禾县| 平和县|