分页显示是针对数据库所进行的操作,分页技术主要有3种
- 1、使用游标定位,丢弃不属于页面的数据
这是最简单的分页显示实现技术,在每个页面查询得到所有的数据行,使用游标定位到结果集,读取现实数据,这种操作浪费大量内存资源,适用于数据量较少的查询 - 2、使用缓存结果集,一次查询所有数据
将查询结果存在Httpsession或状态bean中,翻页的时候从缓存中取出一页显示,可以节省数据库连接资源,但用户有可能看到的是过期数据,并且如果数据量非常大时第一次遍历查询会需要很多时间 - 3、使用数据库提供的定位集的SQL语句,返回特定行的数据
在用户的分页查询请求中,将获取的查询请求的行范围作为参数,生成SQL语句,然后每一次请求获得数据库连接对象执行SQL语句,返回查询结果,最后释放所有的数据库访问资源
分页显示的JavaBean实现
1、SQL Sever数据库的分页查询语句
从数据库表中的第m条记录开始取n条记录,利用top关键字进行查询,如果既有top又有order by,从排序好的结果中选择
select * from (
select top n*from(
select top(m+n-1)*from 表名称 order by 主键 desc) t1) t2 order by 主键 asc
2、Oracle数据库的分页语句
可以使用rownum来限制结果集的大小和起始位置,从数据库表中的第m条记录开始查询n条记录
select * from (
select rownum r,t1.* from 表名称 t1 where rownum < m+n) t2
where t2.r >= 10
3、MySQL数据库的分页语句
从数据库表中的第m条记录开始查询n条记录
select * from 表名称 limit m-1,m
以MySQL数据库为例,介绍一个通用的分页显示类,任何用到分页显示的页面都可以调用这个类,新建splitPage.java
package jsp.test;
import java.sql.*;
import java.util.*;
public class splitPage {
//定义数据库连接对象和结果集对象
private Connection con = null;
private Statement stmt = null;
private ResultSet rs = null;
private ResultSetMetaData rsmd = null;
//定义SQL查询语句
private String sqlStr;
//总记录数目
private int rowCount = 0;
//所分的逻辑页数
private int pageCount = 0;
//每页显示的记录数目
private int pageSize = 0;
//设置参考值
public void setCon(Connection con){
this.con = con;
if(this.con == null){
System.out.println("failure to get a connection");
}
else{
System.out.println("success to get a connection");
}
}
//初始化,获取数据表中的信息
public void initialize(String sqlStr,int pageSize,int ipage){
int irows = pageSize*(ipage-1);
this.sqlStr = sqlStr;
this.pageSize = pageSize;
try{
stmt = this.con.createStatement();
rs = stmt.executeQuery(this.sqlStr);
if(rs != null){
rs.last();
this.rowCount = rs.getRow();
rs.first();
this.pageCount = (this.rowCount - 1)/this.pageSize + 1;
}
this.sqlStr = sqlStr+" limit " + irows + ","+pageSize;
stmt = this.con.createStatement();
rs = stmt.executeQuery(this.sqlStr);
rsmd = rs.getMetaData();
}
catch (SQLException e) {
System.out.println(e.toString());
// TODO: handle exception
}
}
//将显示结果存到Vector集合类中
public Vector getPage(){
Vector vData = new Vector();
try{
if(rs != null){
while(rs.next())
{
String[] sData = new String[6];
for(int j=0;j<rsmd.getColumnCount();j++){
sData[j] = rs.getString(j+1);
}
vData.addElement(sData);
}
}
rs.close();
stmt.close();
}
catch (SQLException e) {
// TODO: handle exception
System.out.println(e.toString());
}
return vData;
}
//获得页面总数
public int getPageCount(){
return this.pageCount;
}
//获取表中记录总数
public int getRowCount(){
return this.rowCount;
}
}
然后新建word_list_javabean.jsp
<%@ page language="java" contentType="text/html;charset=gbk"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="jsp.test.*" %>
<jsp:useBean id="pages" scope="page" class="jsp.test.splitPage"/>
<%!
//每页显示的记录数
int pageSize = 3;
String sqlStr = "";
//当前页
int showPage = 1;
String userName = "root";
String userPassword="123456";
//数据库的url
String url="jdbc:mysql://localhost:3306/ch10?useUnicode=true&characterEncoding = gb2312";
//定义连接对象
Connection dbcon;
%>
<%
try{
//加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//获得数据库连接对象
dbcon = DriverManager.getConnection(url,userName,userPassword);
}
catch(SQLException ex){
System.out.println(ex.toString());
}
catch(ClassNotFoundException ex){
System.out.println(ex.toString());
}
//给page中参数con赋值
pages.setCon(dbcon);
sqlStr = "select * from words order by WordsId";
//查询数据表
String strPage = null;
//获取目的界面
strPage = request.getParameter("showPage");
if(strPage == null){
showPage = 1;
}
else{
try{
showPage=Integer.parseInt(strPage);
}
catch(NumberFormatException e){
showPage = 1;
}
if(showPage<1){
showPage=1;
}
}
pages.initialize(sqlStr,pageSize,showPage);
//获取要显示的命令集
Vector vData = pages.getPage();
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gbk">
<title>分页显示</title>
</head>
<body bgcolor="#fff" text="#00000">
<h1 align = center>留言本</h1>
<div align = center>
<table border="1" cellspacing="0" cellpadding="0" width="80%">
<tr>
<th width="20%">编号</th>
<th width="50%">留言标题</th>
<th width="30%">留言时间</th>
</tr>
<%
for(int i = 0;i <vData.size();i++){
//显示数据
String[] sData=(String[])vData.get(i);
%>
<tr>
<td><%=sData[0]%></td>
<td align=left><%=sData[1] %></td>
<td align=left>
<%
//显示留言时间,省去时间串中的“.”后面的字符
String str_WordsTime = sData[3];
if(str_WordsTime.indexOf(".")>-1)
{
str_WordsTime=str_WordsTime.substring(0,str_WordsTime.indexOf("."));
}
out.println(str_WordsTime);
%>
</td>
</tr>
<%
} %>
</table>
<form action="word_list_javabean.jsp" method="get" target="_self">
共<font color = red><%=pages.getRowCount()%></font>条
<%=pageSize%>条/页
第<font color = red><%=showPage%></font>页/共
<font color = red><%=pages.getPageCount()%></font>页
<a href="word_list_javabean.jsp?showPage=1"target="_self">[首页]</a>
<%
//判断“上一页”链接是否要显示
if(showPage>1){
%>
<a
href="word_list_javabean.jsp?showPage
=<%=showPage-1%>"target="_self">[上一页]
</a>
<%
}else{
%>
[上一页]
<%
}
//判断下一页链接是否要显示
if(showPage<pages.getPageCount())
{
%>
<a
href="word_list_javabean.jsp?showPage=<%=showPage+1 %>"
target="_self">[下一页]</a>
<%
}else{
%>
[下一页]
<%
}
%>
<a href="word_list_javabean.jsp?showPage=<%=pages.getPageCount()%>"
target="_self">[尾页]</a>
转到
<select name = "showPage">
<%
for(int x = 1;x <= pages.getPageCount();x++){
%>
<option value="<%=x %>"<%if(showPage==x)
out.println("selected");%>>
<%=x %></option>
<%
}
%>
</select>
页
<input type="submit" name="go" value="提交"/>
</form>
<%
//关闭数据库连接
dbcon.close();
%>
</div>
</body>
</html>
word_list_javabean.jsp页面将SQL查询语句和每页要显示的信息数量传递给分类显示类中的方法,然后获得当前页面所要显示的数据的集合,最后将这些数据显示到页面上
最后来看一下运行效果