在很多论谈上都有这个例子的。我也只是引用别人的而以。<%@ 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();
%>  

解决方案 »

  1.   

    我原来就是用的楼上的方法做的。不过是分成了几个类--访问数据库是一个公共类。其实就是利用resultset类的last方法和absolute方法来定位,取得需要显示的一页的记录,以减轻对网络的压力。不过这两个方法都需要jdbc2.0才支持,以前的版本不支持。同时,如果访问的是虚表,也不能直接定位--会报错。这时候就只有通过循环来做,会增加主机的负担,不过还是减轻了网络压力。主要还是要看实际情况,如果网络状况良好,就可以将整个结果集取到本地来处理,就不会影响主机的处理速度。如果网络压力是主要考虑的因素,则只有在主机那儿做了。
      

  2.   

    sun1979song(十步杀一人) 能不能说说你是如何实现每次只是拿十条记录的
      

  3.   

    sun1979song(十步杀一人) 能否说说你是如何实现每次只是拿十条的呢?
      

  4.   

    djinzaghi(java) 你这样做的话如果我数据库里面有几万条数据,那么开始要话很多时间来查询.有没有其他方法?
      

  5.   

    用sql语句来完成分页是最高效的
      

  6.   

    select * from table limit 0,30;
    ???????????
      

  7.   

    limit 0,30?这是什么语句?
      

  8.   

    简单方法如下:
    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(页数*每页记录数)条记录,父查询则对余下的记录进行降序排列
      

  9.   

    用PreparedStatement是否会提高性能?能否说说PreparedStatement与Statement的性能区别?
    呵呵,很感谢大家,这个周末结帐.大家努力.
      

  10.   

    TO:西门吹雪
    select * from table limit 0,30;
    ???????????
     是表示 从第0条记录开始选择30条 呵呵
      

  11.   

    <%@ 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
      

  12.   

    limit 0,30只能在mysql在用吧!
      

  13.   


    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 
          where rownum <= "+rs_fist+") 
    where rno >= "+rs_last+"
    )"
      

  14.   

    大数据量的时候
    结果集很大
    滚动纪录效率很低
    所以用上面的方法要好些
    (参考了若水三千的sql例程)
     cqxhhe@2002 CQU <[email protected]>