`

[摘]通用的分页,可以参考点

阅读更多
一个新的Pageable接口及其实现
  首先,我们需要提供一个与java.sql.ResultSet向下兼容的接口,把它命名为Pageable,接口定义如下:
java 代码
  1. public interface Pageable extends java.sql.ResultSet{    
  2. /**返回总页数   
  3. */    
  4. int getPageCount();    
  5. /**返回当前页的记录条数   
  6. */    
  7. int getPageRowsCount();    
  8. /**返回分页大小   
  9. */    
  10. int getPageSize();    
  11. /**转到指定页   
  12. */    
  13. void gotoPage(int page) ;    
  14. /**设置分页大小   
  15. */    
  16. void setPageSize(int pageSize);    
  17. /**返回总记录行数   
  18. */    
  19. int getRowsCount();    
  20. /**   
  21. * 转到当前页的第一条记录   
  22. * @exception java.sql.SQLException 异常说明。   
  23. */    
  24. void pageFirst() throws java.sql.SQLException;    
  25. /**   
  26. * 转到当前页的最后一条记录   
  27. * @exception java.sql.SQLException 异常说明。   
  28. */    
  29. void pageLast() throws java.sql.SQLException;    
  30. /**返回当前页号   
  31. */    
  32. int getCurPage();    
  33. }    
  这是一个对java.sql.ResultSet进行了扩展的接口,主要是增加了对分页的支持,如设置分页大小,跳转到某一页,返回总页数等等。

  接着,我们需要实现这个接口,由于这个接口继承自ResultSet,并且它的大部分功能也都和ResultSet原有功能相同,所以这里使用了一个简单的Decorator模式。
java 代码
  1.   PageableResultSet2的类声明和成员声明如下:    
  2. public class PageableResultSet2 implements Pageable {    
  3. protected java.sql.ResultSet rs=null;    
  4. protected int rowsCount;    
  5. protected int pageSize;    
  6. protected int curPage;    
  7. protected String command = "";    
  8. }   

  可以看到,在PageableResultSet2中,包含了一个ResultSet的实例(这个实例只是实现了ResultSet接口,事实上它是由各个数据库厂商分别实现的),并且把所有由ResultSet继承来的方法都直接转发给该实例来处理。
java 代码
  1. PageableResultSet2中继承自ResultSet的主要方法:    
  2. //……    
  3. public boolean next() throws SQLException {    
  4. return rs.next();    
  5. }    
  6. //……    
  7. public String getString(String columnName) throws SQLException {    
  8. try {    
  9. return rs.getString(columnName);    
  10. }    
  11. catch (SQLException e) {//这里是为了增加一些出错信息的内容便于调试    
  12. throw new SQLException (e.toString()+" columnName="    
  13. +columnName+" SQL="+this.getCommand());    
  14. }    
  15. }    
  16. //……    
  
  只有在Pageable接口中新增的方法才需要自己的写方法处理。
java 代码
  1. /**方法注释可参考Pageable.java   
  2. */    
  3. public int getCurPage() {    
  4. return curPage;    
  5. }    
  6. public int getPageCount() {    
  7. if(rowsCount==0return 0;    
  8. if(pageSize==0return 1;    
  9. //calculate PageCount    
  10. double tmpD=(double)rowsCount/pageSize;    
  11. int tmpI=(int)tmpD;    
  12. if(tmpD>tmpI) tmpI++;    
  13. return tmpI;    
  14. }    
  15. public int getPageRowsCount() {    
  16. if(pageSize==0return rowsCount;    
  17. if(getRowsCount()==0return 0;    
  18. if(curPage!=getPageCount()) return pageSize;    
  19. return rowsCount-(getPageCount()-1)*pageSize;    
  20. }    
  21. public int getPageSize() {    
  22. return pageSize;    
  23. }    
  24. public int getRowsCount() {    
  25. return rowsCount;    
  26. }    
  27. public void gotoPage(int page) {    
  28. if (rs == null)    
  29. return;    
  30. if (page < 1)    
  31. page = 1;    
  32. if (page > getPageCount())    
  33. page = getPageCount();    
  34. int row = (page - 1) * pageSize + 1;    
  35. try {    
  36. rs.absolute(row);    
  37. curPage = page;    
  38. }    
  39. catch (java.sql.SQLException e) {    
  40. }    
  41. }    
  42. public void pageFirst() throws java.sql.SQLException {    
  43. int row=(curPage-1)*pageSize+1;    
  44. rs.absolute(row);    
  45. }    
  46. public void pageLast() throws java.sql.SQLException {    
  47. int row=(curPage-1)*pageSize+getPageRowsCount();    
  48. rs.absolute(row);    
  49. }    
  50. public void setPageSize(int pageSize) {    
  51. if(pageSize>=0){    
  52. this.pageSize=pageSize;    
  53. curPage=1;    
  54. }    
  55. }    
  56.   PageableResultSet2的构造方法:    
  57. public PageableResultSet2(java.sql.ResultSet rs) throws java.sql.SQLException {    
  58. if(rs==nullthrow new SQLException("given ResultSet is NULL","user");    
  59.   
  60. rs.last();    
  61. rowsCount=rs.getRow();    
  62. rs.beforeFirst();    
  63.   
  64. this.rs=rs;    
  65. }    
  这里只是简单的取得一个总记录数,并将记录游标移回初始位置(before first),同时将参数中的ResultSet赋给成员变量。
Pageable的使用方法
  因为Pageable接口继承自ResultSet,所以在使用方法上与ResultSet一致,尤其是在不需要分页功能的时候,可以直接当成ResultSet使用。而在需要分页时,只需要简单的setPageSize, gotoPage,即可。
java 代码
  1. PreparedStatement pstmt=null;    
  2. Pageable rs=null;    
  3. ……//构造SQL,并准备一个pstmt.    
  4. rs=new PageableResultSet2(pstmt.executeQuery());//构造一个Pageable    
  5. rs.setPageSize(20);//每页20个记录    
  6. rs.gotoPage(2);//跳转到第2页    
  7. for(int i=0; i<rs.getPageRowsCount(); i++){//循环处理    
  8. int id=rs.getInt(“ID”);    
  9. ……//继续处理    
  10. }    


总结
  一个好的基础类应该是便于使用,并且具备足够的可移植性,同时要保证其功能的完善。在上面的实现中,我们从java.sql.ResultSet接口继承出Pageable,并实现了它。这就保证了在使用中与JDBC原有操作的一致性,同时对原有功能没有缩减。
  同时它也是易于使用的,因为封装了一切必要的操作,所以在你的代码中唯一显得"难看"和"不舒服"的地方就是需要自己去构造一个PageableResultSet2。不过只要你愿意,这也是可以解决的。
  当然它也有具有充分的可移植性,当你将数据库由Oracle变为Mysql或者SQLServer的时候,你仍然可以使用这些分页的代码。它在使用中(或者说在移植的过程中)唯一的限制就是你必须要使用一个支持JDBC2的驱动(现在明白为什么我把类命名为PageableResultSet2了吧。:P),不过,好在JDBC2已经成为标准了,绝大多数的数据库(如Oracle, Mysql, SQLServer)都有自己的或者第三方提供的JDBC2的驱动。
  OK,这个分页的实现是否对你的编程有帮助呢?仔细看看,其实真正自己写的代码并不多的,大部分都只是简单的转发操作。一个合适的模式应用可以帮你很大忙。
 
分享到:
评论

相关推荐

    通用分页js

    ### 通用分页JS知识点详解 #### 一、概述 在Web开发中,分页是一项常见且重要的功能,尤其在处理大量数据时更是必不可少。本文将深入解析一个名为“通用分页JS”的脚本,该脚本适用于JSP环境中,能够帮助开发者...

    java通用分页源码

    这个“java通用分页”源码应该包含了上述部分或全部知识点的实现,对于学习者来说,可以通过阅读源码了解具体的实现细节,比如如何构建分页SQL,如何封装Page对象,以及如何与数据库交互。同时,也可以借此机会学习...

    小贤PHP通用分页程序 v1.0.rar

    我在一些PHP论坛上经常看到不少PHP初学者对于PHP分页很头痛,所以我就...分页功能给分离出来给广大PHP初学者做为参考或者使用。 程序的优点:可用于伪静态、静态和动态分页用,采用DIV CSS设计,兼容各常用浏览器;

    JSP后台通用分页

    在这个场景中,`JSP后台通用分页` 涉及到以下几个关键知识点: 1. **数据库查询**:首先,我们需要从数据库中查询数据。在分页中,我们不是一次性获取所有记录,而是根据当前页数和每页显示的记录数来确定查询范围...

    ASP 通用分页代码包括搜索条件

    这个"ASP 通用分页代码包括搜索条件"指的是一个能够实现分页并同时支持搜索条件的ASP代码示例。 分页的基本原理是通过查询数据库,每次只获取一部分数据(通常是一页的数据量),然后在网页上展示。这需要考虑的...

    wap通用分页开发(字数/文章)

    综上所述,这个WAP通用分页开发的示例不仅展示了如何使用JSP技术构建动态WAP页面,还涉及到了WAP技术的基础知识、数据库操作以及用户交互设计等多个方面。这对于理解和实现类似的移动应用具有一定的参考价值。

    小贤PHP通用分页程序 v1.0

    的分页功能给分离出来给广大PHP初学者做为参考或者使用。 程序的演示效果您可以登录到淘宝网寻宝客(http://www.xunbaoke.com)上操作体验,寻宝客网站所有 的分页都是使用本程序来实现的。 程序的优点:可用于伪...

    小贤PHP通用分页程序.rar

    分页功能给分离出来给广大PHP初学者做为参考或者使用。 程序的演示效果您可以登录到寻宝客( target="_blank"&gt;http://www.xunbaoke.com)上操作体验,寻宝客网站所有的分页都是使用本程序来 实现的。 程序的优点:...

    java web 分页 设计

    本篇文章将介绍一个适用于Java Web项目的通用分页模块,该模块主要面向对Java感兴趣的开发者。通过以下几部分详细介绍如何实现这一功能: 1. **分页基础概念** 2. **分页参数解析** 3. **分页逻辑处理** 4. **前端...

    WinForm中的分页控件

    本项目提供了一个通用的WinForm分页控件的Demo,供开发者学习和参考。下面我们将深入探讨WinForm分页控件的关键知识点及其在实际开发中的应用。 首先,理解分页的基本概念是至关重要的。分页是一种数据管理策略,它...

    24种分页样式,漂亮,通用

    下面将详细阐述这些分页样式的相关知识点: 1. **设计多样性**:24种样式展示了各种设计风格,包括简约、现代、扁平化、复古等,以满足不同网站和用户群体的需求。设计多样性可以提升网站的整体视觉吸引力,使用户...

    ibatis struts2 spring3 mybatis 分页 crud 完整代码

    通过这个项目,开发者不仅可以学习到如何集成Ibatis、Struts2和Spring3,还能了解到如何在这些框架下实现分页和基本的CRUD操作,这对于构建大型企业级应用具有重要的参考价值。同时,这种实践性的学习方式有助于加深...

    经典struts2分页方法 JAVA_WEB必备分页 源码

    Struts2是一个非常流行的Java Web框架,用于构建可维护性和扩展性良好的企业级应用程序。...在给定的压缩包文件中,"common"可能包含了实现这些功能的通用组件或代码示例,可以作为学习和参考的资源。

    .NET自定义分页控件,支持WebForm及MVC(含C#源码)

    总的来说,这个自定义分页控件提供了一个通用且可扩展的解决方案,允许开发者在.NET Web应用程序中轻松实现分页功能。通过分析源码和使用说明,我们可以学习到如何设计和实现这样的控件,以及如何将其集成到实际项目...

    struts与jdbc的分页

    Struts 是一个开源的Java Web框架,由Apache软件基金会维护,它主要负责处理MVC(Model-View-Controller)架构中的Controller部分。...同时,这也可以作为一个参考示例,帮助你在自己的项目中改进和完善分页的实现。

    存储过程之jQuery分页源码

    开发人员可以参考"51aspx源码必读.txt"学习如何将存储过程与jQuery分页源码结合,通过"DBUtility"中的函数调用存储过程,实现数据的分页加载,同时利用"Northwind.sln"中的项目结构和代码作为参考,优化自己的应用...

    Bootstrap Paginator+PageHelper实现分页效果

    - PageHelper是一个基于Mybatis的通用分页插件,它可以在查询数据库时自动进行分页操作,极大地简化了后端分页逻辑的实现。 2. 实现分页效果的步骤: - 首先在项目中添加PageHelper的Maven依赖,这是集成...

    mysqlser 和mysql两种版本的分页java代码

    在实际项目中,我们可能会封装一个通用的分页查询方法,接受表名、查询条件、排序字段等参数,返回分页结果。`derrick_page`这个文件可能包含了这样的示例代码,可以作为学习和参考的模板。 总结起来,本话题主要...

    JSP MySQL真分页.rar

    HOHO~~其实我的代码有很多不足,例如:是不是可以做成通用的分页?也可以把DBlink()中的conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiuzhou","root","123456");用的连接参数写在xml中生成一个...

    archive_ PHP+mysql数据库分页类万能版附源码及数据库下载 v2 [江西新余电信].zip.zip

    7. **通用性**:一个“万能版”的分页类应该具备良好的适应性,能够处理不同类型的查询,支持多种数据库操作,并且可以方便地配置和扩展。 8. **版本更新**:"v2"可能带来的改进可能包括性能优化、错误修复、增加新...

Global site tag (gtag.js) - Google Analytics