mysql, oracle 直接支持分页查询,sql server 2000不行。可以看看hibernate 的dialet中的源代码。

解决方案 »

  1.   

    用数据库支持选择从多少条到多少条的,
    oracle, db2, postgres等都支持的
      

  2.   

    有位高手给我一个程序,挺好的,就是可以创建一个可以滚动的只读的SQL语句对象, 我还没用过,共享大家看一看,每次只连一次数据库
    <%@ page contentType="text/html;charset=gb2312" %>
    <%request.setCharacterEncoding("gb2312");%>
    <%@ page import="java.sql.*"%>
    <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>  <%  
    //变量声明  
    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:@//192.168.0.203:1521/ora10g.net";  //连接数据库  
    sqlCon = java.sql.DriverManager.getConnection(strCon,"test","test");  //创建一个可以滚动的只读的SQL语句对象  
    sqlStmt = sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);  //准备SQL语句  
    strSQL = "select * from km_movie_list_tbl"; //执行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.getInt(1)%></td>  
    <td><%=com.kamun.movie.UtilsBean.GBToUn(sqlRst.getString(2))%></td>  
    </tr>  
    <%  
    sqlRst.next();  
    i++;  
    }  
    }  
    %>  </table>  第<%=intPage%>页  共<%=intPageCount%>页  <%if(intPage<intPageCount){%><a href="file:///E|/Documents%20and%20Settings/administrator/&#26700;&#38754;/jdbc20-oracle.jsp?page=<%=intPage+1%>">下一页</a><%}%>  <%if(intPage>1){%><a href="file:///E|/Documents%20and%20Settings/administrator/&#26700;&#38754;/jdbc20-oracle.jsp?page=<%=intPage-1%>">上一页</a><%}%>  </body>  
    </html>  <%  
    //关闭结果集  
    sqlRst.close();  //关闭SQL语句对象  
    sqlStmt.close();  //关闭数据库  
    sqlCon.close();  
    %> 
      

  3.   

    用ROWNUM,LIMIT等方法获得指定数量的结果集都会降低查询速度,而且如果想知道总记录数还要另外做COUNT操作(多一次数据库操作)。还有没有更好的招?3x!
      

  4.   

    我写的一个分页类:
    http://blog.csdn.net/lcllcl987
    很简单,不过也没实现你说的功能
      

  5.   

    要分页的话,查询效率肯定是要降低的,只要每次不把所有记录都读出来就行了,可以自己写类、标签来实现,但是要求数据库支持分页查询语句,比如Oracle或者Mysql。如果不支持分页查询语句可以用Hibernate。
      

  6.   

    oracle支持翻页查询,给一个查询的例子(显示第20到第30条记录):select mytable.jhbh,my_rownum from (select rownum as my_rownum ,jhbh from (select jhbh from jh_ndacjh order by jhbh) where rownum <= 30) mytable where my_rownum >20 注意: rownum as my_rownum 一定要,否则查不出来.因为rownum是oracle自己的关键字,内外嵌套的时候,如果没有别名,会混淆. 在web翻页时,此语句可实现翻页功能的优化
      

  7.   

    用存储过程可以解决sqlserver的分页问题,速度超级快。具体代码到网上找就行了,海了去了。
      

  8.   

    每次取一部分,然后把当前页最后一条数据位置保存,点下一页的时候就从下一条数据开始读取,这样的方法即使再大也不会影响的:)----------------------------------------------------------------
    取出来放到VECTOR还是ARRAYLIST里面?
      

  9.   

    sql server 采用存储过程吧,,例子N多...支持分页的数据库就好吧..
      

  10.   

    可以去看一下hibernate的自动分页程序还是每页每页的取数据效率相对高一点
      

  11.   

    我用hibernate实现,它有两个方法支持分页:
    query.setFirstResult();
    query.setMaxResults();先从request参数里计算出记录段,
    然后我将结果封装到自定义的 PageResult Bean中,
    里面包含了分页信息,很好用。
    不过多了一次的查询数据总量的语句,
    但查到的结果是当前页的,
    不象上面程序那样
    //准备SQL语句  
    strSQL = "select * from km_movie_list_tbl"; 这样耗资源太厉害了,不可取。
      

  12.   

    同意dreamsky15(云飞扬) (,有空就学hibernate
      

  13.   

    我在用rs.last()大数据量查询时报内存溢出错误,数据量在5000000左右
    请问rs.last()十分浪费内存吗?
      

  14.   

    如果 sql server 2000,我以前是写一个存储过程 形成一个临时表,增加一个自动增长的id 然后查询id在某区间的数据,这样的从数据只返回一页数据。mysql oracle, db2, postgres都支持从第几条到第几条,也是一样都是在数据库端返回一页数据如果想提高查询速度
    1.最好调用存储过程,因为经过预编译,比执行查询语句要快
    2.建立索引,提高检索速度
    3.优化数据存储形式对海量数据oracl里有好多优化手段的
      

  15.   

    一个建议,不知道管不管用:    首先查出记录总数,做成分页,然后每次取出一千条记录,如果记录超出一千条,首先决断游标目前指向的是哪个一千条,然后再查出该一千条数据(一般来说,每次都跳一千条记录的情况比较少,所以该方法适合大众化访问的情况,本方法用到游标,不适合SQL Server).当然,该方法治标不治本,因为数据如果总是在一千条外跳动时,本方法根本起不了一点作用最有效的办法是建立一数据存储池,优先在数据库服务器将常用的数据加载到内存中,再供读取调用,这对服务器内存有较高要求,我们只满足最常用的查询情况,当然顾及不到机率极少的批量浏览.