`

JDBC分页

    博客分类:
  • Java
阅读更多

 

不知道大家做项目做到最后有什么感觉没有,其实大家做来做去就是做一个列表加上分页和多条件的查询(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超出最后一页),然后我们再根据页码和每页记录数是不是就可以计算出当前页的的开始条数和终止条数了。

 

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

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;
	}

}

 继续

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

    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

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页去,一般都是根据条件来缩小查询范围。所以折中的办法就是将记录数设大一点,另外就是限制用户翻页的范围,其实这些性能的前提都是在数据量非常大的情况下而言的,一般数据量少的话,基本上都可以忽略不计的。

 

 

4
0
分享到:
评论
1 楼 满手都是炸 2013-05-06  
最后的数据层访问 没看明白

相关推荐

    JDBC分页查询(MySQL的)

    jdbc分页查询,利用mysql的limit实现分页查询。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

    jdbc分页查询源码

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

    jdbc分页实例sqlserver2000

    标题中的“jdbc分页实例sqlserver2000”指的是使用Java Database Connectivity (JDBC) API来实现数据库分页查询的示例,特别是在SQL Server 2000这个特定的数据库管理系统上。JDBC是Java中用于与各种类型数据库交互...

    jsp jdbc分页原代码

    **JSP与JDBC分页实现详解** 在Java Web开发中,数据的分页展示是一项常见且重要的功能,尤其在处理大量数据时,分页能够有效地提高用户体验,避免一次性加载过多数据导致页面响应慢。本篇文章将围绕"JSP与JDBC分页...

    jdbc 分页 sql语句

    ### JDBC分页SQL语句详解 #### 一、引言 在数据库操作中,分页查询是非常常见且重要的一个功能。对于大型应用而言,一次性加载大量数据不仅会消耗过多资源,还可能导致用户体验下降。因此,合理地进行分页处理显得...

    JavaWeb+JSP+Servlet+JDBC分页查询和查询后分页界面优化最终版

    在JavaWeb开发中,"JavaWeb+JSP+Servlet+JDBC分页查询和查询后分页界面优化"是一个常见的需求,特别是在构建大型的、数据密集型的学生管理系统中。这个主题涵盖了许多关键知识点,让我们逐一深入探讨。 首先,...

    java基于原生的MySql的JDBC分页组件

    本篇将详细介绍如何基于原生的MySQL JDBC实现一个简单的分页组件,这对于初学者理解数据库操作和分页原理非常有帮助。 1. **JDBC基础**: JDBC是Java访问数据库的标准接口,它提供了连接数据库、执行SQL语句、处理...

    java jdbc 分页

    Java JDBC分页是一种在Java应用程序中实现数据库查询结果分页显示的技术。JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如连接数据库、发送SQL语句以及...

    JavaWeb+JSP+Servlet+JDBC分页查询和查询后分页

    项目主体结构是dao+db+filter+pojo+servlet, 使用技术Servlet转发,代码中有注释帮助学者理解,数据库为MySQL资源...实现的数据库内容分页,查询分页,对初学者难点是根据get请求的中的url地址进行查询后的分页效果。

    jdbc分页demo

    在这个"jdbc分页demo"中,主要涵盖了JDBC连接数据库、预编译SQL、执行查询、处理结果集以及在JSP页面上展示数据等步骤。通过这个例子,开发者可以了解如何在实际项目中实现基于JDBC的分页查询,提升Web应用的性能和...

    分页大全(含JDBC分页 struts分页)

    这里我们将深入探讨“分页大全”,包括JDBC分页、Struts分页以及分页标签的使用。 首先,让我们了解什么是分页。在网页或应用中,分页是指将大量数据分割成若干小部分,每次只加载一部分,用户可以逐页浏览,而不是...

    oracle-jdbc分页实现(只需传入sql语句即可实现分页)

    Oracle JDBC分页实现是数据库操作中的一个重要环节,尤其是在处理大量数据时,为了提高用户体验和系统性能,分页查询显得尤为重要。Oracle数据库提供了多种方法来实现分页查询,其中包括使用ROWNUM伪列、游标...

    java jdbc 分页例子

    Java JDBC 分页查询是数据库操作中的常见需求,用于在大量数据中实现高效的页面导航。...这个例子对于初学者理解JDBC分页查询和数据源管理非常有帮助,同时也提醒我们在实际开发中应关注代码的可扩展性和复用性。

    Jdbc分页方法

    jdbc数据库通用分页方法,用时只须传值即可

    Java JDBC分页工具包

    一个用于支持JDBC分页的工具包,提供了一些封装好的JDBC操作方法,方便开发人员进行开发,提供了此工具包的API文档

    高性能jdbc分页处理

    高性能jdbc分页处理,使用PreparedStatement方式

    Java jdbc分页工具类

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

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

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

    JDBC分页 absolute实现

    "JDBC分页 absolute实现" 主要指的是使用`Statement`或`PreparedStatement`对象的`absolute()`方法来实现数据库查询的分页功能。 在传统的SQL查询中,分页通常通过`LIMIT`和`OFFSET`子句来实现,但这在大型数据集上...

Global site tag (gtag.js) - Google Analytics