討論如何高效實現分頁。
-----------------------------------------------------------------------------------------
在大量數據記錄的情況下,實現分頁功能如何做查詢速度最快???歡迎高手討論,一定給分。 ?
--------------------------------------------------------------- ?
?
每次查詢的時候只根據每頁顯示的個數,比如10,每次就只查10條記錄,其他的只要統計出來就行。 ?
下一次翻頁,再查下10條,剩下的還只是個統計數。 ?
--------------------------------------------------------------- ?
?
滾東記錄 ?
--------------------------------------------------------------- ?
?
在很多論談上都有這個例子的。我也只是引用別人的而以。 ?
?
?
?
<%@ ?page ?contentType="text/html;charset=8859_1" ?%> ?
<% ?
//變量聲明 ?
java.sql.Connection ?sqlCon; ?//數據庫連接對象 ?
java.sql.Statement ?sqlStmt; ?//SQL語句對象 ?
java.sql.ResultSet ?sqlRst; ?//結果集對象 ?
java.lang.String ?strCon; ?//數據庫連接字符串 ?
java.lang.String ?strSQL; ?//SQL語句 ?
int ?intPageSize; ?//一頁顯示的記錄數 ?
int ?intRowCount; ?//記錄總數 ?
int ?intPageCount; ?//總頁數 ?
int ?intPage; ?//待顯示頁碼 ?
java.lang.String ?strPage; ?
int ?i; ?
//設置一頁顯示的記錄數 ?
intPageSize ?= ?2; ?
//取得待顯示頁碼 ?
strPage ?= ?request.getParameter("page"); ?
if(strPage==null){//表明在QueryString中沒有page這一個參數,此時顯示第一頁數據 ?
intPage ?= ?1; ?
} ?
else{//將字符串轉換成整型 ?
intPage ?= ?java.lang.Integer.parseInt(strPage); ?
if(intPage<1) ?intPage ?= ?1; ?
} ?
//裝載JDBC驅動程序 ?
java.sql.DriverManager.registerDriver(new ?oracle.jdbc.driver.OracleDriver()); ?
//設置數據庫連接字符串 ?
strCon ?= ?"jdbc:oracle:thin:@linux:1521:ora4cweb"; ?
//連接數據庫 ?
sqlCon ?= ?java.sql.DriverManager.getConnection(strCon,"hzq","hzq"); ?
//創建一個可以滾動的只讀的SQL語句對象 ?
sqlStmt ?= ?sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY); ?
//準備SQL語句 ?
strSQL ?= ?"select ?name,age ?from ?test"; ?
//執行SQL語句并獲取結果集 ?
sqlRst ?= ?sqlStmt.executeQuery(strSQL); ?
//獲取記錄總數 ?
sqlRst.last(); ?
intRowCount ?= ?sqlRst.getRow(); ?
//記算總頁數 ?
intPageCount ?= ?(intRowCount+intPageSize-1) ?/ ?intPageSize; ?
//調整待顯示的頁碼 ?
if(intPage>intPageCount) ?intPage ?= ?intPageCount; ?
%> ?
<html> ?
<head> ?
<meta ?http-equiv="Content-Type" ?content="text/html; ?charset=gb2312"> ?
<title>JSP數據庫操作例程 ?- ?數據分頁顯示 ?- ?JDBC ?2.0 ?- ?Oracle</title> ?
</head> ?
<body> ?
<table ?border="1" ?cellspacing="0" ?cellpadding="0"> ?
<tr> ?
<th>姓名</th> ?
<th>年齡</th> ?
</tr> ?
<% ?
if(intPageCount>0){ ?
//將記錄指針定位到待顯示頁的第一條記錄上 ?
sqlRst.absolute((intPage-1) ?* ?intPageSize ?+ ?1); ?
//顯示數據 ?
i ?= ?0; ?
while(i<intPageSize ?&& ?!sqlRst.isAfterLast()){ ?
%> ?
<tr> ?
<td><%=sqlRst.getString(1)%></td><td><%=sqlRst.getString(2)%></td> ?
</tr> ?
<% ?
sqlRst.next(); ?
i++; ?
} ?
} ?
%> ?
</table> ?
第<%=intPage%>頁 共<%=intPageCount%>頁 <%if(intPage<intPageCount){%><a ?href="jdbc20-oracle.jsp?page=<%=intPage+1%>">下一頁</a><%}%> <%if(intPage>1){%><a ?href="jdbc20-oracle.jsp?page=<%=intPage-1%>">上一頁</a><%}%> ?
</body> ?
</html> ?
<% ?
//關閉結果集 ?
sqlRst.close(); ?
//關閉SQL語句對象 ?
sqlStmt.close(); ?
//關閉數據庫 ?
sqlCon.close(); ?
%> ? ? ?
?
--------------------------------------------------------------- ?
?
簡單方法如下: ?
int ?curpage=1;//當前頁 ?
int ?page_record=20;//每頁顯示的記錄數 ?
//顯示第1000頁的記錄,用下面的方法 ?
curpage=1000; ?
rs.executeQuery("select ?top ?"+page_record+" ?* ?from ?tablename ?where ?id ?not ?in ?(select ?top ?"+(curpage*page_record)+" ?id ?from ?tablename ?order ?by ?id ?desc) ?order ?by ?id ?desc"); ?
本查詢語句得到的是所要顯示的1000頁的20條記錄,大致思路為—— ?
子查詢排除前999*20(頁數*每頁記錄數)條記錄,父查詢則對余下的記錄進行降序排列 ?
--------------------------------------------------------------- ?
?
<%@ ?page ?contentType="text/html;charset=8859_1" ?%> ?
<% ?
//變量聲明 ?
java.sql.Connection ?sqlCon; ?//數據庫連接對象 ?
java.sql.Statement ?sqlStmt; ?//SQL語句對象 ?
java.sql.ResultSet ?sqlRst; ?//結果集對象 ?
java.lang.String ?strCon; ?//數據庫連接字符串 ?
java.lang.String ?strSQL; ?//SQL語句 ?
int ?intPageSize; ?//一頁顯示的記錄數 ?
int ?intRowCount; ?//記錄總數 ?
int ?intPageCount; ?//總頁數 ?
int ?intPage; ?//待顯示頁碼 ?
java.lang.String ?strPage; ?
int ?i; ?
//設置一頁顯示的記錄數 ?
intPageSize ?= ?25; ?
//取得待顯示頁碼 ?
strPage ?= ?request.getParameter("page"); ?
if(strPage==null){//表明在QueryString中沒有page這一個參數,此時顯示第一頁數據 ?
intPage ?= ?1; ?
} ?
else{//將字符串轉換成整型 ?
intPage ?= ?java.lang.Integer.parseInt(strPage); ?
if(intPage<1) ?intPage ?= ?1; ?
} ?
//裝載JDBC驅動程序 ?
?
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); ?
//java.sql.DriverManager.registerDriver(new ?oracle.jdbc.driver.OracleDriver()); ?
//設置數據庫連接字符串 ?
strCon ?= ?"jdbc:odbc:test"; ?
//連接數據庫 ?
sqlCon ?= ?java.sql.DriverManager.getConnection(strCon,"ApsuiteUser","uwerinfo"); ?
//創建一個可以滾動的只讀的SQL語句對象 ?
?
//sqlStmt=sqlCon.createStatement(); ?
sqlStmt ?= ?sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY); ?
//準備SQL語句 ?
strSQL ?= ?"select ?lsh,files ?from ?t_sys"; ?
//執行SQL語句并獲取結果集 ?
sqlRst ?= ?sqlStmt.executeQuery(strSQL); ?
//獲取記錄總數 ?
sqlRst.last(); ?
intRowCount ?= ?sqlRst.getRow(); ?
?
//記算總頁數 ?
intPageCount ?= ?(intRowCount+intPageSize-1) ?/ ?intPageSize; ?
?
//調整待顯示的頁碼 ?
if(intPage>intPageCount) ?intPage ?= ?intPageCount; ?
%> ?
<html> ?
<head> ?
<meta ?http-equiv="Content-Type" ?content="text/html; ?charset=gb2312"> ?
<title>JSP數據庫操作例程 ?- ?數據分頁顯示 ?- ?JDBC ?2.0 ?- ?Oracle</title> ?
</head> ?
<body> ?
<table ?border="1" ?cellspacing="0" ?cellpadding="0"> ?
<tr> ?
<th>姓名</th> ?
<th>年齡</th> ?
</tr> ?
<% ?
if(intPageCount>0){ ?
//將記錄指針定位到待顯示頁的第一條記錄上 ?
sqlRst.absolute((intPage-1) ?* ?intPageSize ?+ ?1); ?
//顯示數據 ?
i ?= ?0; ?
while(i<intPageSize ?&& ?!sqlRst.isAfterLast()){ ?
%> ?
<tr> ?
<td><%=sqlRst.getString(1)%></td> ?
<td><%=sqlRst.getString(2)%></td> ?
</tr> ?
<% ?
sqlRst.next(); ?
i++; ?
} ?
} ?
%> ?
</table> ?
第<%=intPage%>頁 共<%=intPageCount%>頁 <%if(intPage<intPageCount){%><a ?href="dbtest.jsp?page=<%=intPage+1%>">下一頁</a><%}%> <%if(intPage>1){%><a ?href="dbtest.jsp?page=<%=intPage-1%>">上一頁</a><%}%> ?
</body> ?
</html> ?
<% ?
//關閉結果集 ?
sqlRst.close(); ?
//關閉SQL語句對象 ?
sqlStmt.close(); ?
//關閉數據庫 ?
sqlCon.close(); ?
%> ? ?
?
public ?class ?pageControl ?
{ ?
?? ?? ?? ??public ?int ?curpage ?; ? ?
?? ?? ?? ??public ?int ?maxpage ?; ? ?
?? ?? ?? ??public ?int ?maxrowcount ?; ? ?
?? ?? ?? ??public ?int ?rowsperpage ?; ? ?
?? ?? ?? ?? ?
?? ?? ?? ?? ?
?? ?? ?? ?? ?? ?? ?? ??public ?void ?calMaxPage() ? ?
?? ?? ?? ?? ? ? ?{ ? ? ? ?? ?? ?? ?? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if ?(this.maxrowcount ?% ?this.rowsperpage==0) ?
?? ?? ?? ?? ?? ?? ?? ??{ ?
?? ?? ?? ?? ?? ?? ?? ??this.maxpage ?= ?this.maxrowcount/this.rowsperpage; ?
?? ?? ?? ?? ?? ?? ?? ??} ?
?? ?? ?? ?? ?? ?? ?? ??else ?
?? ?? ?? ?? ?? ?? ?? ??{ ?
?? ?? ?? ??this.maxpage ?= ?this.maxrowcount/this.rowsperpage ?+ ?1; ?? ?? ?? ?? ?? ?? ?? ?? ?
?? ?? ?? ?? ?? ?? ?? ??} ?
?? ?? ?? ??} ?
?? ?? ?? ??} ?
jsp中: ?
pageControl ?pageCtl=new ?pageControl(); ?
? ? ? ? ? ? ? ?pageCtl.rowsperpage=10;//每頁顯示的行數 ?
? ? ? ? ? ? ? ?int ?pageNo=1; ?
?
? ? ? ? ? ? ? ?if ?(request.getParameter("page")!=null) ? ?
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??{ ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?pageNo=Integer.parseInt(request.getParameter("page")); ?
? ? ? ? ? ? ? ? ? ? ? ?} ?
?
? ? ? ? ? ? ? ?pageCtl.curpage=pageNo;//當前頁 ?
? ? ? ?pageCtl.maxrowcount=從數據庫中取得的要顯示出來的記錄數 ?
? ? ? ? ?pageCtl.calMaxPage();//調用方法 ?
?<%if(pageCtl.curpage==1){ ?out.print(" ?首頁 ?上一頁"); ? ? ?}else{ ? ?%> ?
? ? ? ?<A ?HREF="<%=global_usermanage%>?flag=<%=flag%>&userid1=<%=userid1%>">首頁</A> ?<A ?HREF="<%=global_usermanage%>?page=<%=pageCtl.curpage-1%>&flag=<%=flag%>&userid1=<%=userid1%>">上一頁</A> ?
? ? ? ?<%}%> ?
? ? ? ?<%if(pageCtl.curpage==pageCtl.maxpage){ ?out.print("下一頁 ?尾頁"); ? ? ?}else{ ? ?%> ?
? ? ? ?<A ?HREF="<%=global_usermanage%>?page=<%=pageCtl.curpage+1%>&flag=<%=flag%>&userid1=<%=userid1%>">下一頁</A> ?<A ?HREF="<%=global_usermanage%>?page=<%=pageCtl.maxpage%>&flag=<%=flag%>&userid1=<%=userid1%>">尾頁</A> ?
? ? ? ?<%}%> ?
? ? ? ?每頁<%=pageCtl.rowsperpage%>行 ?共<%=pageCtl.maxrowcount%>行 ?第<%=pageCtl.curpage%>頁 ?
? ? ? ?共<%=pageCtl.maxpage%>頁 ?
//over ?
?
?
?
--------------------------------------------------------------- ?
?
?
Oracle中: ?
采用 ?top ?n ?方法 ?
select ?* ? ?
? ?from ?(select ?item_code, ?rownum ?rno ?
? ? ? ? ? ? ? ? ? ?from ?epd_item_master ?
? ? ? ? ? ? ? ? ?where ?rownum ?<= ?10041 ?
? ? ? ? ? ? ? ? ?order ?by ?item_code) ?
?where ?rno ?>= ?10020; ?
?
可取出 ?10020-10041條紀錄 ?
?
程序使用時課改寫一下(我在bean中實現,效果很好,十幾萬條紀錄的表,查詢速度很快) ?
" ?
select ?* ?
from ?(select ?HXH_TNAME.*, ?rownum ?rno ? ?
? ? ? ? ? ?from ?("+SQLstr+") ?HXH_TNAME ? ?
返回目錄