飞艳小屋

程序--人生--哲学___________________欢迎艳儿的加入

BlogJava 首页 新随笔 联系 聚合 管理
  52 Posts :: 175 Stories :: 107 Comments :: 0 Trackbacks
  • 讨论如何高效实现分页。
  • -----------------------------------------------------------------------------------------

    在大量数据记录的情况下,实现分页功能如何做查询速度最快???欢迎高手讨论,一定给分。  
    ---------------------------------------------------------------  
     
    每次查询的时候只根据每页显示的个数,比如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    


    返回目录
  • posted on 2006-08-07 13:10 天外飞仙 阅读(268) 评论(0)  编辑  收藏 所属分类: Oracle

    只有注册用户登录后才能发表评论。


    网站导航: