`
bdk82924
  • 浏览: 565305 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

JDBC分页工具类

 
阅读更多

转自:http://xdwangiflytek.iteye.com/blog/1358080

 

c、 JDBC分页,通过Statementstatement.setMaxRow(endIndex)resultSet.absoulte(beginIndex)取得当前页范围内的记录。此种方式的性能依赖于厂商对JDBC规范的实现。这种方式的通用性是最好的,性能也不错,完全与数据库平台无关了。

 

 

---

不知道大家做项目做到最后有什么感觉没有,其实大家做来做去就是做一个列表加上分页和多条件的查询(http://xdwangiflytek.iteye.com/blog/1358261),只是不同的项目业务流程不一样而已,所以今天我想说说这里的分页。

1、 大家需要了解的是为什么我们需要分页?

因为当数据量太大时,会影响查询和传输的性能,并且我们从用户角度来考虑的话,如果让用户一次性看到成千上万条记录那用户也会疯掉的。

2、 对我们来说有哪些可实现的分页技术?

a、 存储过程分页,即在数据库中创建一个存储过程,传入SQL和页码获取当前页的记录,这个需要大家对存储过程有比较好的认识(我这块不行),当然这个从性能上来说是最好的,但是不能跨数据库平台。

b、 使用数据库专有SQL语句进行分页(OraclerownumMSSQLtopMySqllimit等),性能也很好,但是还是不能跨数据库(其实真实项目中没那么多项目要求都跨数据库)。

c、 JDBC分页,通过Statementstatement.setMaxRow(endIndex)resultSet.absoulte(beginIndex)取得当前页范围内的记录。此种方式的性能依赖于厂商对JDBC规范的实现。这种方式的通用性是最好的,性能也不错,完全与数据库平台无关了。

d、 根据数据库类型自动生成数据库专有特性的sql语句,其实说白了也就是Hibernate的实现方式,这个自己也写过一个,其实就是根据数据库类型生成不同的数据库SQL专有语句而已。

 

下面我们需要写一个分页工具类,在写之前我们需要弄明白分页的原理。为了能够取得指定页码所对应的记录,我们是不是需要两个关键的参数:总记录数和每页的记录数;

每页的记录数我们可以设置一个默认值,10152025都无所谓,根据实际需求。

总记录数就没办法了,需要额外从数据库中利用Count函数取了,通过这两个参数我们是不是可以计算出总页数。同时我们也可以判断用户传过来的页码是否有效(小于第一页OR超出最后一页),然后我们再根据页码和每页记录数是不是就可以计算出当前页的的开始条数和终止条数了。

 

下面我们就需要来看看分页的工具类了

Java代码 复制代码 收藏代码
  1. package com.iflytek.page;   
  2.   
  3. /**  
  4.  * 分页工具类  
  5.  *   
  6.  * @author xudongwang 2012-1-19  
  7.  *   
  8.  *         Email:xdwangiflytek@gmail.com  
  9.  */  
  10. public class Page {   
  11.   
  12.     /**  
  13.      * 总记录数  
  14.      */  
  15.     private int totalRow;   
  16.   
  17.     /**  
  18.      * 每页记录数  
  19.      */  
  20.     private int pageSize = 10;   
  21.   
  22.     /**  
  23.      * 当前页码  
  24.      */  
  25.     private int currentCount;   
  26.   
  27.     /**  
  28.      * 总页数  
  29.      */  
  30.     private int total;   
  31.   
  32.     /**  
  33.      * 起始记录下标  
  34.      */  
  35.     private int beginIndex;   
  36.   
  37.     /**  
  38.      * 截止记录下标  
  39.      */  
  40.     private int endIndex;   
  41.   
  42.     /**  
  43.      * 构造方法,使用总记录数,当前页码  
  44.      *   
  45.      * @param totalRow  
  46.      *            总记录数  
  47.      * @param currentCount  
  48.      *            当前页面,从1开始  
  49.      */  
  50.     public Page(int totalRow, int currentCount) {   
  51.         this.totalRow = totalRow;   
  52.         this.currentCount = currentCount;   
  53.         calculate();   
  54.     }   
  55.   
  56.     /**  
  57.      * 构造方法 ,利用总记录数,当前页面  
  58.      *   
  59.      * @param totalRow  
  60.      *            总记录数  
  61.      * @param currentCount  
  62.      *            当前页面  
  63.      * @param pageSize  
  64.      *            默认10条  
  65.      */  
  66.     public Page(int totalRow, int currentCount, int pageSize) {   
  67.         this.totalRow = totalRow;   
  68.         this.currentCount = currentCount;   
  69.         this.pageSize = pageSize;   
  70.         calculate();   
  71.     }   
  72.   
  73.     private void calculate() {   
  74.         total = totalRow / pageSize + ((totalRow % pageSize) > 0 ? 1 : 0);   
  75.   
  76.         if (currentCount > total) {   
  77.             currentCount = total;   
  78.         } else if (currentCount < 1) {   
  79.             currentCount = 1;   
  80.         }   
  81.   
  82.         beginIndex = (currentCount - 1) * pageSize;   
  83.         endIndex = beginIndex + pageSize;   
  84.         if (endIndex > totalRow) {   
  85.             endIndex = totalRow;   
  86.         }   
  87.     }   
  88.   
  89.     public int getTotalRow() {   
  90.         return totalRow;   
  91.     }   
  92.   
  93.     public int getPageSize() {   
  94.         return pageSize;   
  95.     }   
  96.   
  97.     public int getCurrentCount() {   
  98.         return currentCount;   
  99.     }   
  100.   
  101.     public int getTotal() {   
  102.         return total;   
  103.     }   
  104.   
  105.     public int getBeginIndex() {   
  106.         return beginIndex;   
  107.     }   
  108.   
  109.     public int getEndIndex() {   
  110.         return endIndex;   
  111.     }   
  112.   
  113. }  
package com.iflytek.page;

/**
 * 分页工具类
 * 
 * @author xudongwang 2012-1-19
 * 
 *         Email:xdwangiflytek@gmail.com
 */
public class Page {

	/**
	 * 总记录数
	 */
	private int totalRow;

	/**
	 * 每页记录数
	 */
	private int pageSize = 10;

	/**
	 * 当前页码
	 */
	private int currentCount;

	/**
	 * 总页数
	 */
	private int total;

	/**
	 * 起始记录下标
	 */
	private int beginIndex;

	/**
	 * 截止记录下标
	 */
	private int endIndex;

	/**
	 * 构造方法,使用总记录数,当前页码
	 * 
	 * @param totalRow
	 *            总记录数
	 * @param currentCount
	 *            当前页面,从1开始
	 */
	public Page(int totalRow, int currentCount) {
		this.totalRow = totalRow;
		this.currentCount = currentCount;
		calculate();
	}

	/**
	 * 构造方法 ,利用总记录数,当前页面
	 * 
	 * @param totalRow
	 *            总记录数
	 * @param currentCount
	 *            当前页面
	 * @param pageSize
	 *            默认10条
	 */
	public Page(int totalRow, int currentCount, int pageSize) {
		this.totalRow = totalRow;
		this.currentCount = currentCount;
		this.pageSize = pageSize;
		calculate();
	}

	private void calculate() {
		total = totalRow / pageSize + ((totalRow % pageSize) > 0 ? 1 : 0);

		if (currentCount > total) {
			currentCount = total;
		} else if (currentCount < 1) {
			currentCount = 1;
		}

		beginIndex = (currentCount - 1) * pageSize;
		endIndex = beginIndex + pageSize;
		if (endIndex > totalRow) {
			endIndex = totalRow;
		}
	}

	public int getTotalRow() {
		return totalRow;
	}

	public int getPageSize() {
		return pageSize;
	}

	public int getCurrentCount() {
		return currentCount;
	}

	public int getTotal() {
		return total;
	}

	public int getBeginIndex() {
		return beginIndex;
	}

	public int getEndIndex() {
		return endIndex;
	}

}

 继续

在后台获取前台传进来的页码 //从页面取得页码

Java代码 复制代码 收藏代码
  1. int currentPage = 1;     
  2. try {     
  3.     currentPage = Integer.parseInt(request.getParameter("currentPage"));     
  4. catch (Exception ex) {}     
  5.      
  6. //取得总记录数,创建Page对象     
  7. int totalRow = studentDao.getAllStudents();//通过select count 取得总记录数     
  8. Page page = new Page(totalRow, currentPage);     
  9. studentDao.list(page);    
    int currentPage = 1;  
    try {  
    	currentPage = Integer.parseInt(request.getParameter("currentPage"));  
    } catch (Exception ex) {}  
      
    //取得总记录数,创建Page对象  
    int totalRow = studentDao.getAllStudents();//通过select count 取得总记录数  
    Page page = new Page(totalRow, currentPage);  
    studentDao.list(page);  

 

数据访问层,StduentDao.java

Java代码 复制代码 收藏代码
  1. public List<Stduent> getStudentsByPage(Page page) {     
  2.         List<Stduent> students = new ArrayList<Stduent>();     
  3.         try {     
  4.             String sql = "SELECT id,name,email FROM tbl_stduent";     
  5.             Connection conn = null;     
  6.             try {     
  7.                 conn = DbUtil.getConnection();     
  8.                 Statement statement = conn.createStatement();     
  9.                 statement.setMaxRows(page.getEndIndex());//关键代码,设置最大记录数为当前页记录的截止下标     
  10.                 ResultSet resultSet = statement.executeQuery(sql);     
  11.                 if (page.getBeginIndex() > 0) {     
  12.                     resultSet.absolute(page.getBeginIndex());//关键代码,直接移动游标为当前页起始记录处     
  13.                 }     
  14.                 while (resultSet.next()) {     
  15.                     Stduent student = new Student();     
  16.                     ……     
  17.                     students.add(student);     
  18.                 }     
  19.                 resultSet.close();     
  20.                 statement.close();     
  21.             } finally {     
  22.                 if (conn != null) {     
  23.                     conn.close();     
  24.                 }     
  25.             }     
  26.         } catch (SQLException e) {     
  27.             e.printStackTrace();     
  28.         }     
  29.         return students;     
  30.     }    
public List<Stduent> getStudentsByPage(Page page) {  
        List<Stduent> students = new ArrayList<Stduent>();  
        try {  
            String sql = "SELECT id,name,email FROM tbl_stduent";  
            Connection conn = null;  
            try {  
                conn = DbUtil.getConnection();  
                Statement statement = conn.createStatement();  
                statement.setMaxRows(page.getEndIndex());//关键代码,设置最大记录数为当前页记录的截止下标  
                ResultSet resultSet = statement.executeQuery(sql);  
                if (page.getBeginIndex() > 0) {  
                	resultSet.absolute(page.getBeginIndex());//关键代码,直接移动游标为当前页起始记录处  
                }  
                while (resultSet.next()) {  
                    Stduent student = new Student();  
                    ……  
                    students.add(student);  
                }  
                resultSet.close();  
                statement.close();  
            } finally {  
                if (conn != null) {  
                    conn.close();  
                }  
            }  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
        return students;  
    }  

 其实仔细想想JDBC分页的性能与页码有关即与statement.setMaxRows有效,越往后翻,性能越差,因为越往后一次性查询的记录数就多,但是我们从用户的角度来看不会有用户会牛逼的一页一页翻到第n页去,一般都是根据条件来缩小查询范围。所以折中的办法就是将记录数设大一点,另外就是限制用户翻页的范围,其实这些性能的前提都是在数据量非常大的情况下而言的,一般数据量少的话,基本上都可以忽略不计的。

分享到:
评论

相关推荐

    Java jdbc分页工具类

    java jdbc 分页工具类,以及返回集合数据的封装, private int limit = 10;//每页的个数 /** * 当前页 */ private int page; // /** * 总行数 */ private int totalRows; // /** * 总页数 */ private ...

    原创强大的jdbc数据库操作工具类

    原创强大的jdbc数据库操作工具类: 1.获取数据源 2.设置数据源 3.获取数据库连接 4.执行insert/delete语句,一个参数列表 public static boolean excute(String sql, List args) 5.执行insert/delete语句,多个参数...

    jdbc分页查询源码

    在Java开发中,JDBC(Java Database ...总的来说,JDBC分页查询是Java数据库操作中的常见需求,通过合理设计和优化,可以有效提升应用的性能和用户体验。给定的源码应当提供了具体的实现细节,供开发者参考学习。

    jdbc经典工具类

    1. **JDBC工具类**:JDBC工具类通常封装了数据库连接、预编译SQL语句、执行SQL、关闭资源等常见操作,以减少重复代码,提升开发效率。`connJdbcUtil`可能是一个实现了这些功能的Java类。 2. **数据库连接配置**:...

    java jdbc 分页

    对于给定的"bk_page"文件,这可能是一个包含分页工具类或者示例代码的压缩包,可以用于直接导入项目并使用。具体实现细节需要查看源代码以了解更多信息,如分页查询是否考虑了性能优化(如预编译SQL,使用存储过程等...

    jdbc分页自动映射类,绝对原创

    在Java开发中,JDBC(Java ...总之,这个原创的JDBC分页自动映射类是数据库操作的一个实用工具,通过封装和自动化处理,简化了开发流程,提升了开发效率。在使用时,确保遵循作者的版权声明,尊重原创者的劳动成果。

    Pager(通过的分页工具类)

    标题中的“Pager(通过的分页工具类)”显然指的是一个用于实现分页功能的Java类。在这个类中,开发者通常会封装分页操作的相关逻辑,以便在各种场景下复用。现在我们来详细探讨一下分页的基本概念、设计原则以及...

    分页工具类

    这里提到的"分页工具类"是一个专门为实现数据库查询分页功能而设计的自定义组件。下面我们将详细探讨这个分页工具类的可能实现和其关键组成部分。 首先,`PageManager.java`可能是整个分页操作的核心类,它通常会...

    JAVA_JDBC面向对象分页(初步设计二之oracle)

    总结来说,面向对象的Java JDBC分页查询涉及到创建Page类来存储分页信息,构造Oracle兼容的SQL语句,以及使用PreparedStatement执行查询。在实际开发中,我们还需要关注性能优化、异常处理和代码的可维护性,确保...

    jdbc操作数据库分页

    在Java编程中,JDBC(Java Database ...总结来说,JDBC分页主要是通过构造带有LIMIT和OFFSET的SQL查询来实现的,结合数据库连接、预编译的SQL语句和结果集的处理,可以在Java应用程序中优雅地完成数据库分页操作。

    Java实现的分页工具类

    本篇文章将详细探讨如何使用Java实现一个分页工具类,以及在实际应用中如何运用这个工具。 首先,分页的基本概念是通过指定每页显示的数据量(每页记录数,即pageSize)和当前页数(pageNumber),从数据库中获取...

    JDBC数据库操作工具类

    7. **分页查询**:为了实现分页功能,工具类通常需要接受页码和每页大小作为参数,构造带有LIMIT和OFFSET子句的SQL语句。 8. **异常处理**:工具类应该捕获并处理JDBC相关的异常,如SQLException,以便向调用者提供...

    SpringMVC+JDBC:分页示例

    在IT行业中,SpringMVC和JDBC是两个非常重要的组件...此外,随着NoSQL数据库的普及和ORM框架的流行,如Hibernate和MyBatis,开发者在处理数据库操作时有了更多选择,但JDBC作为基础,仍然是理解和解决问题的重要工具。

    jdbc工具类

    基于jdbc的封装,轻量级映射,自带连接池,无第三方依赖。支持多数据源,配置简单,支持注解sql查询,自带分页查询。

    jsp+jdbc+servlet分页带增删查改

    在这个"jsp+jdbc+servlet分页带增删查改"项目中,开发者使用了MVC(Model-View-Controller)架构模式,实现了对数据的CRUD(Create, Read, Update, Delete)操作,并提供了分页功能。** 1. **JSP(JavaServer Pages...

    SpringJdbcTemplate封装工具类

    这个封装工具类的出现是为了提供一种更简洁、易于使用的接口来执行SQL操作,减轻开发者处理数据库连接、事务管理以及异常处理的负担。下面我们将深入探讨SpringJdbcTemplate的相关知识点。 1. **SpringJdbcTemplate...

    六、Java持久化基础-基于JDBC轻量级分页工具集

    总的来说,通过自定义的JDBC分页工具集,开发者可以简化数据库操作,提高代码的可读性和可维护性,同时减少重复的分页逻辑。在给定的JavaJDBC项目中,我们可以深入研究源码,了解具体的实现细节,并将其应用到自己的...

    JSP,用于分页显示的两个工具类

    在给定的资源中,包含的"PaginationSupport.java"和"PageDao.java"两个工具类,正是为了实现这种功能而设计的。 PaginationSupport.java是分页支持类,通常会包含以下关键知识点: 1. **参数设置**:此类可能包含...

    关于Hibernate分页类和jdbc的sql分页完美融合

    本主题将探讨如何在Hibernate分页类和JDBC的SQL分页方法之间实现完美的融合,以提高性能并提供更好的用户体验。 首先,让我们了解一下Hibernate的分页功能。Hibernate提供了一种方便的方式来处理分页查询,通过...

Global site tag (gtag.js) - Google Analytics