实现的分页主要有两种,一种是客户端分页(假分页),另一种是服务器端分页,所谓客户端分页就是用一条SQL语句select * from table,将所有记录都取出来,然后再客户端知道了是第几页后用rs.absulte(pagesize*currentPage)定位到某一条记录,从而实现分页。服务器端分页是指将要显示的页码发送到服务器端,服务器端计算取出的记录是从哪一条到哪一条,然后构造特定的SQL语句,譬如MYSQL可以用LIMIT实现从哪一条记录到哪一条记录,ACCESS和MSSQL可以用TOP实现去除前多少条,然后再嵌套一个TOP实现取出特定条数的记录.一般采用服务器端分页,因为客户端分页每次都得查询整个数据库,效率较低。

下面这个例子 是假分页的例子:

 
  1. <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %> 
  2. <%@ page import="java.sql.*"%>    
  3. <%@ page import="javax.sql.*"%>    
  4. <%@ page import="javax.naming.*"%>  
  5. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
  6. <html> 
  7. <head> 
  8.  
  9. <title>无标题文档</title> 
  10. </head> 
  11.  
  12. <body> 
  13.  
  14. <
  15. //变量声明 
  16.  
  17. java.sql.Statement sqlStmt;//SQL语句对象 
  18. java.sql.ResultSet sqlRst;//结果集对象 
  19.  
  20. java.lang.String strCon;//数据库连接字符串 
  21. java.lang.String strSQL;//SQL语句 
  22. int intPageSize;//一页显示的记录数 
  23. int intRowCount;//记录总数 
  24. int intPageCount;//总页数 
  25. int intPage;//待显示页码 
  26. java.lang.String strPage; 
  27. int i; 
  28. //设置一页显示的记录数 
  29. intPageSize=2
  30. //取得待显示页码 
  31. strPage=request.getParameter("page"); 
  32. if(strPage==null){//表明在QueryString中没有page这一个参数,此时显示第一页数据 
  33. intPage=1
  34. else{//将字符串转换成整型 
  35. intPage=java.lang.Integer.parseInt(strPage); 
  36. //if(intPage<1)intPage=1
  37.  
  38.  
  39. InitialContext ctx=new InitialContext();    
  40.  
  41. DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql");    
  42.  
  43. Connection conn = ds.getConnection();    
  44. //创建一个可以滚动的只读的SQL语句对象 
  45. sqlStmt=conn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY); 
  46. //准备SQL语句 
  47. strSQL="select * from publishers"
  48. //执行SQL语句并获取结果集 
  49. sqlRst=sqlStmt.executeQuery(strSQL); 
  50. //获取记录总数 
  51. sqlRst.last(); 
  52. intRowCount=sqlRst.getRow(); 
  53. //记算总页数 
  54. intPageCount=(intRowCount+intPageSize-1)/intPageSize; 
  55. //调整待显示的页码 
  56. //if(intPage>intPageCount) 
  57.     //intPage=intPageCount
  58. %> 
  59.  
  60. <html> 
  61. <head> 
  62. <meta http-equiv="Content-Type" content="text/html;charset=gb2312"> 
  63. <title>JSP数据库操作例程-数据分页显示-JDBC3.0</title> 
  64. </head> 
  65. <body> 
  66. <table border="1" cellspacing="0" cellpadding="0"> 
  67. <tr> 
  68. <th>出版商ID</th> 
  69. <th>出版商名称</th> 
  70. </tr> 
  71. <
  72. if(intPageCount>0){ 
  73. //将记录指针定位到待显示页的第一条记录上 
  74. sqlRst.absolute((intPage-1)*intPageSize+1); 
  75. //显示数据 
  76. i=0
  77. while(i<intPageSize&&!sqlRst.isAfterLast()){ 
  78. %> 
  79. <tr> 
  80. <td><%=sqlRst.getString(1)%></td> 
  81. <td><%=sqlRst.getString(2)%></td> 
  82. </tr> 
  83. <
  84. sqlRst.next(); 
  85. i++; 
  86. %> 
  87. </table> 
  88. <br> 
  89. <%=intPage%>页&nbsp;&nbsp;共<%=intPageCount%>页&nbsp;&nbsp; 
  90. <%if(intPage<intPageCount){%><a href="PageIndex.jsp?page=<%=intPage+1%>">下一页</a><%}%> 
  91. &nbsp;&nbsp; 
  92. <%if(intPage>1){%><a href="PageIndex.jsp?page=<%=intPage-1%>">上一页</a><%}%> 
  93. </body> 
  94. </html> 
  95. <
  96. //关闭结果集 
  97. sqlRst.close(); 
  98. //关闭SQL语句对象 
  99. sqlStmt.close(); 
  100. //关闭数据库 
  101. conn.close(); 
  102. %> 
  103. </body> 
  104. </html> 

其中数据库创建脚本为:

 
  1. drop database demo if exists; 
  2.  
  3. create database demo; 
  4.  
  5. use demo; 
  6.  
  7. create table publishers( 
  8.     Pub_ID int primary key auto_increment, 
  9.     Pub_Name varchar(20) 
  10. ); 
  11.  
  12. insert into publishers values(1,'张三'); 
  13. insert into publishers values(2,'李四'); 
  14. insert into publishers values(3,'王五'); 
  15. insert into publishers values(4,'赵六'); 
  16. insert into publishers values(5,'梦琪'); 
  17. insert into publishers values(6,'嘉嘉'); 

然后配置数据库连接池:

打开tomcat 根目录下的 conf/context.xml 文件,在<Context>...</Context>中输入:

 
  1. <Resource name="jdbc/mysql"   
  2.        auth="Container"   
  3.            
  4.        type="javax.sql.DataSource"   
  5.        driverClassName="com.mysql.jdbc.Driver"   
  6.        url="jdbc:mysql://localhost:3306/demo"   
  7.        username="root"   
  8.        password="123456"   
  9.        maxActive="100"   
  10.        maxIdle="30"   
  11.        maxWait="10000" />   

打开 web.xml 在<web-app>...</web-app>中加入如下代码:

 
  1. <resource-ref>   
  2.     <description>DB Connection</description>   
  3.     <res-ref-name>jdbc/mysqlx</res-ref-name>   
  4.     <res-type>javax.sql.DataSource</res-type>   
  5.     <res-auth>Container</res-auth>   
  6.   </resource-ref>   

数据库连接池 配置完毕!访问页面即可。

数据分页是经常用到的一个功能,我们可以使用hibernate 包装好的方法(我还不会)

数据分页关键就是四个变量。

总行数(通过ResultSet获得),总页数(计算得到),
当前页(通过 上一页 下一页 传递过来),每页显示的行数 intPageSize(一般指定好了)。

然后根据传递过来的要显示的页数,将ResultSet指针定位到那页的第一个元素,进行循环遍历,直到正好显示了intPageSize行,或者到了查询结果的末尾。