分页显示是针对数据库所进行的操作,分页技术主要有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查询语句和每页要显示的信息数量传递给分类显示类中的方法,然后获得当前页面所要显示的数据的集合,最后将这些数据显示到页面上

最后来看一下运行效果

jsp 分页查询mysql数据库流程图 jsp实现分页显示数据_jsp分页显示