实现的分页主要有两种,一种是客户端分页(假分页),另一种是服务器端分页,所谓客户端分页就是用一条SQL语句select * from table,将所有记录都取出来,然后再客户端知道了是第几页后用rs.absulte(pagesize*currentPage)定位到某一条记录,从而实现分页。服务器端分页是指将要显示的页码发送到服务器端,服务器端计算取出的记录是从哪一条到哪一条,然后构造特定的SQL语句,譬如MYSQL可以用LIMIT实现从哪一条记录到哪一条记录,ACCESS和MSSQL可以用TOP实现去除前多少条,然后再嵌套一个TOP实现取出特定条数的记录.一般采用服务器端分页,因为客户端分页每次都得查询整个数据库,效率较低。
下面这个例子 是假分页的例子:
- <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
- <%@ page import="java.sql.*"%>
- <%@ page import="javax.sql.*"%>
- <%@ page import="javax.naming.*"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <title>无标题文档</title>
- </head>
- <body>
- <%
- //变量声明
- 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;
- }
- InitialContext ctx=new InitialContext();
- DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql");
- Connection conn = ds.getConnection();
- //创建一个可以滚动的只读的SQL语句对象
- sqlStmt=conn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);
- //准备SQL语句
- strSQL="select * from publishers";
- //执行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数据库操作例程-数据分页显示-JDBC3.0</title>
- </head>
- <body>
- <table border="1" cellspacing="0" cellpadding="0">
- <tr>
- <th>出版商ID</th>
- <th>出版商名称</th>
- </tr>
- <%
- if(intPageCount>0){
- //将记录指针定位到待显示页的第一条记录上
- sqlRst.absolute((intPage-1)*intPageSize+1);
- //显示数据
- i=0;
- while(i<intPageSize&&!sqlRst.isAfterLast()){
- %>
- <tr>
- <td><%=sqlRst.getString(1)%></td>
- <td><%=sqlRst.getString(2)%></td>
- </tr>
- <%
- sqlRst.next();
- i++;
- }
- }
- %>
- </table>
- <br>
- 第<%=intPage%>页 共<%=intPageCount%>页
- <%if(intPage<intPageCount){%><a href="PageIndex.jsp?page=<%=intPage+1%>">下一页</a><%}%>
-
- <%if(intPage>1){%><a href="PageIndex.jsp?page=<%=intPage-1%>">上一页</a><%}%>
- </body>
- </html>
- <%
- //关闭结果集
- sqlRst.close();
- //关闭SQL语句对象
- sqlStmt.close();
- //关闭数据库
- conn.close();
- %>
- </body>
- </html>
其中数据库创建脚本为:
- drop database demo if exists;
- create database demo;
- use demo;
- create table publishers(
- Pub_ID int primary key auto_increment,
- Pub_Name varchar(20)
- );
- insert into publishers values(1,'张三');
- insert into publishers values(2,'李四');
- insert into publishers values(3,'王五');
- insert into publishers values(4,'赵六');
- insert into publishers values(5,'梦琪');
- insert into publishers values(6,'嘉嘉');
然后配置数据库连接池:
打开tomcat 根目录下的 conf/context.xml 文件,在<Context>...</Context>中输入:
- <Resource name="jdbc/mysql"
- auth="Container"
- type="javax.sql.DataSource"
- driverClassName="com.mysql.jdbc.Driver"
- url="jdbc:mysql://localhost:3306/demo"
- username="root"
- password="123456"
- maxActive="100"
- maxIdle="30"
- maxWait="10000" />
打开 web.xml 在<web-app>...</web-app>中加入如下代码:
- <resource-ref>
- <description>DB Connection</description>
- <res-ref-name>jdbc/mysqlx</res-ref-name>
- <res-type>javax.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
- </resource-ref>
数据库连接池 配置完毕!访问页面即可。
数据分页是经常用到的一个功能,我们可以使用hibernate 包装好的方法(我还不会)
数据分页关键就是四个变量。
总行数(通过ResultSet获得),总页数(计算得到), 当前页(通过 上一页 下一页 传递过来),每页显示的行数 intPageSize(一般指定好了)。然后根据传递过来的要显示的页数,将ResultSet指针定位到那页的第一个元素,进行循环遍历,直到正好显示了intPageSize行,或者到了查询结果的末尾。