分页问题(80分)

  • 主题发起人 主题发起人 shisam
  • 开始时间 开始时间
S

shisam

Unregistered / Unconfirmed
GUEST, unregistred user!
tomcat4.0.1+oracle 8i+jsp+win2k
有没有好的分页方法。
请各位大哥踊跃发言...
 
给你一个例子:
JSP数据库操作例程 - 数据分页显示 - JDBC 2.0 - Oracle
发布日期:2002-1-17  发 布 者:51jsp.net  

<%@ page contentType="text/html;charset=8859_1"%>
<%java.lang.String strPage ;int 我;intPageSize =2;strPage = request.getParameter("page");intPage =1;}intPage = java.lang.Integer.parseInt(strPage);如果( 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 charset="gb2312">
<meta http-equiv="Content-Type" ontent="text/html;charset=gb2312">
<title>
JSP数据库操作例程 - 数据分页显示 - JDBC 2.0 - Oracle
</title>
</head>
<body>
<table border="1" ellspacing="0" ellpadding="0">
<tr>
<th>
姓名
</th>
<th>
年龄
</th>
</tr>
<%
if(intPageCount>
0){
//将记录指针定位到待显示页的第一条记录上
sqlRst.absolute((intPage-1) * intPageSize + 1);
//显示数据
i = 0;
while(i
<intPageSize&amp;&amp;!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();
%>

 
to fpsky:
你的这种方法我已经知道了,还有没有其它的方法?
假如我的查询结果有50000条记录,这种方法返回的数据集太大,
消耗资源太多。
 
一次性读出,数据转为数组。
 
to snjat:
如果数据集有20000条记录,同时有几个用户在访问,
这样做不是太消耗资源?
 
你的数据本就太大,资源肯定消耗。
我们通常是加个条件WHERE。
 
to shisam:
变一下sql语句: select top 10 name,age from test
 
oracle支持用rownum来限制结果集的。
看看这篇文章:
http://www.dev-club.com/club/bbs/showEssence.asp?id=2661&amp;page=1
 
oracle的分页要用rownum来实现,不过也不太好用,一般要嵌套一层查询,
也许可以不嵌套吧,反正我这里是嵌套一层做的。
select * from
(select rownum as row_num,col1,col2,col3,...
from aTable
where ...
)
where row_num>10 and row_num<=20 //这里的数字就要靠你自己算了。
rownum是oracle的一个隐含的列,在每一个查询中都会加入的。
 
rownum只是可以用小于,不能用大于啊。。
痛苦的事情,除非自己用SQL语句写分页,运行在服务器端,按分页的要求只传所需要的当
前页的数据,减少网络的拥塞!
 
rownum是物理编 号,是按记录入库时的先后顺序排序的。
用到ORDER BY 就会有问题了。
试试RANK()吧
SELECT table_name from
{select rank() over (order by table_anme desc) rank1,tabl_name from user_tables
order by table_name desc) ss
where ss.rank1<=15 and ss.rank1<=100 oreder by trable_name
只用于ORACLE815以上版本。
 
mikegong
所以要嵌套一层查询。
 
多人接受答案了。
 
后退
顶部