關於分頁的從新思考

哭啊,剛纔點錯了,本來就寫好了,強烈建議增加自動保存功能!!!!!!!!!!!!!!

 封裝類的初始化程序如:

    public synchronized void init(String sql1, String sql2, int ps, String cp) ...{
        setCountSqlStr(sql1);
        setQuerySqlStr(sql2);
        conn 
= DatabaseBean.getConnection();
        
this.pagesize = getPageSize(ps); // 設置每頁顯示條數
        this.totalcounts = getTotalCounts(); // 設置總條數
        this.totalpages = getTotalPages(); // 取得總頁數
        this.currentpage = getCurrentPage(cp); // 取得當前頁
    }

sql可能是這樣:

sql1 = "select count(*) from table";
sql2 
= "select * from table";

在jsp頁面代碼如下:

            rowNum= PageList.getCurrentPageSize();
            
int firstRowNum=PageList.getFirstRowNum();
            
try
            
...{
                
for (int i = 0; i < rowNum; i++)
                
...{
                    
int num = firstRowNum+i+1;
                    rs.next();
                    rs.getString(
1);
                    rs.getString(
2);
                    rs.getString(
3);
                    rs.getString(
4);
                }

            }
catch(Exception e)...{
                
            }
finally...{
                PageList.destory();
            }

這樣的做法是這樣的:將所有記錄的信息都保存在ResultSet中,然後在頁面上通過循環控制某條記錄是否顯示在頁面上。這樣的弊端就是將所有記錄的信息都查詢到內存中,如果記錄集很大的話,勢必影響性能。

最近看了別人bbs系統中對於分頁的實現,也是jsp版本的,原理如下:

    int pageSize = 50;
    int currentPage;
    int startNum = (pageSize-1)*currentPage+1;
    int endNum = pageSize*currentPage;
    public String getList()
    ...{
        Connection    conn    = null;
        ResultSet    rs        = null;
        PreparedStatement    stmt    = null;
        conn = DatabaseBean.getConnection(); 
        String s = "";
        StringBuffer sb = new StringBuffer("");
        try...{
            String strSQL = "select id from (select id,rownum rn from logManage order by id asc) where rowNum between ? and ? ";
            stmt = conn.prepareStatement(strSQL);
            stmt.setInt(1,startNum);
     stmt.setInt(2,endNum);
            rs = stmt.executeQuery();
            while(rs != null && rs.next())
            ...{
                sb.append(id);
                sb.append(",");
            }
            rs.close();
            rs = null;
        }catch(Exception e)...{
        }finally...{
            try...{
                if(conn != null)
                    conn.close();
            }catch(Exception ex)...{}
        }
        s = sb.substring(0,sb.length()-1);
        return s;
    }

這樣做的道理是,將當前也要顯示的記錄的id號先查詢出來,然後在jsp頁面中的sql可以這樣寫:

String strSQL = "select * from table where id in (上面函數得到的s) order by id asc";

這樣保證了查詢的結果集都是當前頁面的一個結果集,因爲每頁所顯示的記錄數都很有限,所以即使數據量很大也是沒有關係。

因爲對於緩存的處理還沒有什麼概念,所以不在本文的思考範圍內。

這只是個人在學習過程中的一些個人思考,有錯的地方請指出,聯繫我:[email protected]

發佈了7 篇原創文章 · 獲贊 0 · 訪問量 3383
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章