使用SQL语句实现 大型结果集 的分页(测试).
一般使用JSP处理结果集的分页时,都是返回一个“可滚动”的ResultSet,然后在JSP中进行遍历。而如果返回的ResultSet是巨型的,EP:返回的记录条数有1万条----这时,更好的方法就是采用Iterator模式 来进行分页的管理。

有没有更直接的方式?
用google搜了一通,发现几篇比较有意思的文章,都是讲 ASP+数据库存储过程 实现大数据量的分页。既然ASP能实现,JSP也应该能!结合了其它的一些资料,发现只要组织好你的SQL查询语句,就能非常轻松的对大型结果集进行简单、有效的分页。

使用SQL分页的一个问题就是“记录条数、页码、页数”的计算-为了解决了这个问题,我使用了select count(*) .. 这样做的结果就是每次分页就要对数据库进行2次查询操作,不过,为了实现“简单”分页操作,也值了!

在这里,为了说明运作原理,我没有对处理逻辑进行封装,直接在HTML中嵌入JAVA代码,显得有点乱,各位看官将就一下 :)

主要就是对SQL查询语句的包装,为了实现分页,每种数据库的实现方式不同,我使用的是 SQL Server2000,就使用了 top 来限制返回记录的条数- 而Mysql有limit- Oracle及其它数据库亦有相对应的函数。

代码:sql.jsp


<%@page contentType="text/html;charset=gb2312"%>
<%@page import=
"com.panabia.db.SQLFactory"%>
<%@page import=
"java.sql.*"%>

<html><link rel=stylesheet href=/images/css.css>
<body>
<font size=6 face=arial>SQL语句分页测试程式[SQL Server 2000]</font>
<hr>
<%
String topage=request.getParameter(
"topage");
int currentpage=1;
int totalpage=0;
if(topage!=null&&!topage.equals(
"")){
try{
currentpage=Integer.parseInt(topage);
}
catch(NumberFormatException e){currentpage=1;}
}

Connection con=null;
Statement sql=null;
ResultSet rs=null;
SQLFactory SQL=new SQLFactory();

try{
con=SQL.gainConnection();
sql=con.createStatement();
rs=sql.executeQuery(
"select count(id) from users");
if(rs.next()){
totalpage=rs.getInt(1);
}
}
catch(SQLException e){
e.printStackTrace();
}
finally{
SQL.releaseConnection(rs,null,sql,con);
}
%>
<font class=normal>共有 <b><%=totalpage%></b> 条记录,
分为 <b><%=totalpage%6==0?totalpage/6:totalpage/6+1%> </b>页,
目前显示第 <b><%=currentpage%></b> 页.</font>

<hr color=#eeeeee>
<%
String s=
"select top 6 * from users where id not in(select top "+
6*(currentpage-1)+
" id from users order by id) order by id";
try{
con=SQL.gainConnection();
sql=con.createStatement();
rs=sql.executeQuery(s);
while(rs.next()){
%>
<font class=big>

<%=rs.getInt(1)%>--<%=rs.getString(2)%>--<%=rs.getString(3)%></font>

<%
}
}
catch(SQLException e){}
finally{
SQL.releaseConnection(rs,null,sql,con);
}
%>
<hr>
<a class=slink href=
"sql.jsp?topage=<%=1%>"><首 页></a>
<a class=slink href=
"sql.jsp?topage=<%=currentpage-1%>"><上一页></a>
<a class=slink href=
"sql.jsp?topage=<%=currentpage+1%>"><下一页></a>

<a class=slink href=
"sql.jsp?topage=<%=totalpage%6==0?totalpage/6:totalpage/6+1%>"><尾 页></a>
</body>
</html>


meiking   2004-11-22 17:31:23 评论:3   阅读:3046   引用:0
思路不错 @2010-01-08 16:40:11  mr.xue
看明白了,哈,谢谢啦
不清楚 @2007-10-20 11:44:58  李
com.panabia.db.SQLFactory
怎么正确使用
test [code] @2004-11-22 17:35:52  meiking
还以为可以用[code=java]java code[/code]或者[code=C]C code[/code]呢!

发表评论>>

署名发表(评论可管理,不必输入下面的姓名)

姓名:

主题:

内容: 最少15个,最长1000个字符

验证码: (如不清楚,请刷新)

谢智的个人博客 @CSS by self