CSDN博客

img panzi667

讨论如何高效实现分页。

发表于2004/10/18 11:16:00  1440人阅读

分类: 数据库 jsp

在大量数据记录的情况下,实现分页功能如何做查询速度最快???欢迎高手讨论,一定给分。  
---------------------------------------------------------------  
 
每次查询的时候只根据每页显示的个数,比如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%>页&nbsp;&nbsp;共<%=intPageCount%>页&nbsp;&nbsp;<%if(intPage<intPageCount){%><a  href="jdbc20-oracle.jsp?page=<%=intPage+1%>">下一页</a><%}%>&nbsp;&nbsp;<%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%>页&nbsp;&nbsp;共<%=intPageCount%>页&nbsp;&nbsp;<%if(intPage<intPageCount){%><a  href="dbtest.jsp?page=<%=intPage+1%>">下一页</a><%}%>&nbsp;&nbsp;<%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    
阅读全文
0 0

相关文章推荐

img
取 消
img