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

分页查询实现

 
阅读更多

在查询列表时我们常常会用到分页,分页的好处就是减少数据交换,每次查询一定数量减少数据库压力等等。

按实现形式分前台分页和服务器分页:

前台分页就是一次查询出所有记录,在页面中用js进行虚拟分页,这种形式在数据量较小时优势比较明显,一次加载就不必再访问服务器了,但当数据量较大时会对页面造成压力,传输速度也会大幅下降。

服务器分页就是每次请求相同数量记录,按一定规则排序,每次取一定序号直接的数据。例如,我想查询班级学生列表,这个列表按学号排序,当查看第一页时查询1-10号学生,第二页时11-21号学生以此类推。这样分页的好处就是每次查询的返回时间是固定的,但每次都需要访问服务器与数据库,这种分页常用于大数据量查询。

下面我们主要说说服务器分页。

 jsp分页代码:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<tfoot>
	<tr>
		<td colspan="7" align="center">
			<div class="page">
				<span style="padding:0; margin:0;width:290px; line-height:27px;text-align:right; float:left;">共<font color="#FF6600">${COUNT }</font>条记录</span>
				<span style="padding:0; margin:0;width:290px; text-align:left;line-height:27px;float:right;padding-left:10px;">第<span id="current">${CURRENT_PAGE}</span><span id="pageSize">${PAGE_SIZE}</span>页</span>
				<span style="padding:0; margin:0;line-height:27px;float:right;">到<input name="CURRENT_PAGE" type="text"  size="3" id="currentPage" style="margin-left:5px;margin-right:5px;"/>页</span>
				<c:choose>
					<c:when test="${CURRENT_PAGE >1}">
						<a href="${REQUEST_PATH}?CURRENT_PAGE=1" class="first" title="第一页"></a>
					</c:when>
					<c:otherwise>
						<a href="javascript:;" class="first" title="第一页"></a>
					</c:otherwise>
				</c:choose>
				<c:choose>
					<c:when test="${CURRENT_PAGE >1}">
						<a href="${REQUEST_PATH}?CURRENT_PAGE=${CURRENT_PAGE -1}" class="pre" title="上一页"></a>
					</c:when>
					<c:otherwise>
						<a href="javascript:;" class="pre" title="上一页"></a>
					</c:otherwise>
				</c:choose>
				<c:choose>
					<c:when test="${CURRENT_PAGE < PAGE_SIZE}">
						<a href="${REQUEST_PATH}?CURRENT_PAGE=${CURRENT_PAGE +1}" class="next" title="下一页"></a>
					</c:when>
					<c:otherwise>
						<a href="javascript:;" class="next" title="下一页"></a>
					</c:otherwise>
				</c:choose>
				<c:choose>
					<c:when test="${CURRENT_PAGE<PAGE_SIZE}">
						<a href="${REQUEST_PATH}?CURRENT_PAGE=${PAGE_SIZE}" class="last" title="末页"></a>
					</c:when>
					<c:otherwise>
						<a href="javascript:;" class="last" title="末页"></a>
					</c:otherwise>
				</c:choose>
			</div>
		</td>
	</tr>
</tfoot>
<script type="text/javascript">
	$(function(){
		var curIpt = $('#currentPage'),curVal = $('#current').text(),totalVal = $('#pageSize').text(),
			curPage = function(){
				var curIptVal = Number($.trim(curIpt.val())),reg = /^[1-9]\d*$/;
				if(!reg.test(curIptVal)){
					window.location.href = path + "/queryContactInPages?CURRENT_PAGE=" + curVal ;
					return false;
				}
				if(curIptVal > totalVal){
					window.location.href = path + "/queryContactInPages?CURRENT_PAGE=" + totalVal ;
					return false;
				}
				window.location.href = path + "/queryContactInPages?CURRENT_PAGE=" + curIptVal ;
			};
		curIpt.keydown(function(e){
			if(e.which == 13){
				curPage();
			}
		});
	});
</script>

 

我们看到这个页面有上一页下一页等按钮,点击请求${REQUEST_PATH}这个地址,这个路径就是一个公共的请求路径,因为这个分页是会复用的,所以这个path可以根据不同页面设置不同的请求。请求默认只有一个参数CURRENT_PAGE(当前页码),这个当前页面传几就跳转到第几页,注意这里是从1开始的,而不是0.后面也可以增加其他参数,如查询条件等。

当请求传递到action或servlet后,对分页数据进行一定的处理:

			Page page = new Page();
			int currPage = 0;
			// 当前页数
			String currentPage = request.getParameter(Constants.CURRENT_PAGE);
			// 部门代码
			if (StringUtils.hasText(currentPage))
				currPage = Integer.parseInt(currentPage) - 1;
			List results = 查询学生列表(Page.getStartOfPage(currPage + 1), Page.DEFAULT_PAGE_SIZE);
			int resultsCount = 查询学生列表总记录数();
			// 设置总记录
			page.setTotalCount(resultsCount);
			request.setAttribute(Constants.RESULT_LIST, results);
			// 分页数据项
			request.setAttribute(Constants.CURRENT_PAGE, currPage + 1);
			request.setAttribute(Constants.PAGE_SIZE, page.getTotalPageCount());
			request.setAttribute(Constants.COUNT, page.getTotalCount());
			request.setAttribute(Constants.REQUEST_PATH, request.getRequestURI());

 处理流程是,先取出当前页,如果有值并且大于0,就说明不是初始查询,注意这里的当前页是从0开始的,后面会对页面传过来的值进行加减1的处理。

然后根据条件查询相应列表和总记录数并放置在request中传回页面.

下面是Page.java的代码:

public static int DEFAULT_PAGE_SIZE = 10;// 默认每页显示数
	
	public static int MAX_PAGE_SIZE=Integer.MAX_VALUE;//最大记录数

	private int pageSize = DEFAULT_PAGE_SIZE; // 每页的记录数

	private int start; // 起始记录

	private int totalCount; // 总记录数

	private int currentPage; // 当前页

	/**
	 * 取总记录数.
	 */
	public int getTotalCount() {
		return this.totalCount;
	}

	/**
	 * 取总页数.
	 */
	public int getTotalPageCount() {
		if (totalCount % pageSize == 0) {
			if (totalCount == 0)
				return 1;
			else
				return totalCount / pageSize;
		} else
			return totalCount / pageSize + 1;
	}

	/**
	 * 取每页数据容量.
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 取该页当前页码,页码从1开始.
	 */
	public int getCurrentPageNo() {
		return start / pageSize + 1;
	}

	/**
	 * 该页是否有下一页.
	 */
	public boolean hasNextPage() {
		return this.getCurrentPageNo() < this.getTotalPageCount() - 1;
	}

	/**
	 * 该页是否有上一页.
	 */
	public boolean hasPreviousPage() {
		return this.getCurrentPageNo() > 1;
	}

	/**
	 * 获取任一页第一条数据在数据集的位置,每页条数使用默认值.
	 * 
	 * @see #getStartOfPage(int,int)
	 */
	public static int getStartOfPage(int pageNo) {
		return getStartOfPage(pageNo, DEFAULT_PAGE_SIZE);
	}

	/**
	 * 获取任一页第一条数据在数据集的位置.
	 * 
	 * @param pageNo
	 *            从1开始的页号
	 * @param pageSize
	 *            每页记录条数
	 * @return 该页第一条数据
	 */
	public static int getStartOfPage(int pageNo, int pageSize) {
		return (pageNo - 1) * pageSize;
	}

	public int getNextPageNo() {
		return getCurrentPageNo() + 1;
	}

	public int getPreviousPageNo() {
		return getCurrentPageNo() - 1;
	}

	public boolean getHasNextPage() {
		return this.getCurrentPageNo() < this.getTotalPageCount();
	}

	public boolean getHasPreviousPage() {
		return this.getCurrentPageNo() > 1;
	}

	/**
	 * @return the start
	 */
	public int getStart() {
		return start;
	}

	/**
	 * @param start
	 *            the start to set
	 */
	public void setStart(int start) {
		this.start = start;
	}

	/**
	 * @return the currentPage
	 */
	public int getCurrentPage() {
		return currentPage;
	}

	/**
	 * @param currentPage
	 *            the currentPage to set
	 */
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

	/**
	 * @param pageSize
	 *            the pageSize to set
	 */
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * @param totalCount
	 *            the totalCount to set
	 */
	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}

 里面含有计算总数和当前页码等。

2
0
分享到:
评论

相关推荐

    hbase分页查询实现.pdf

    HBase分页查询实现 HBase作为一个NoSQL数据库,具有高性能、高可扩展性和高可靠性等特点,但是在查询方面却存在一些限制,例如不支持分页查询。这就使得开发者需要自己实现分页查询功能。本文将讲解如何使用Java...

    hbase分页查询实现[归类].pdf

    HBase分页查询实现 HBase是一种基于分布式的NoSQL数据库,它提供了高效的数据存储和检索能力。然而,HBase本身不支持分页查询,这使得开发者需要自己实现分页功能。本文将讲解如何使用Java语言实现HBase的分页查询...

    MyBatis Plus 的多表联接、分页查询实现方法,源码加sql

    MyBatis Plus 的多表联接、分页查询实现方法 http://localhost/common/getAllQuestionByPage/1/10 多表关联、分页查询接口 http://localhost/common/getAllQuestionWithStudentByPage/1/10 多表关联、分页带参数查询...

    Spring Data JPA带条件分页查询实现原理

    Spring Data JPA带条件分页查询实现原理 Spring Data JPA是Java持久化API(Java Persistence API)的一个实现,提供了一个简洁的方式来访问和操作数据库。在实际开发中,我们经常需要实现条件分页查询,以满足不同...

    Hibernate分页查询原理解读

    #### 三、Hibernate分页查询实现原理 ##### 3.1 使用SQL LIMIT实现分页 对于支持LIMIT关键字的数据库(例如MySQL),Hibernate会通过特定的方言(Dialect)来生成包含LIMIT关键字的SQL语句。具体实现如下: ```...

    hibernate实现分页查询

    #### 三、Hibernate 分页查询实现步骤 ##### 3.1 创建Session实例 在Hibernate中,所有的持久化操作都需要在一个`Session`实例的控制下进行。因此,第一步是打开一个`Session`实例。 ```java Session session = ...

    分页显示实现过程.docx

    在这个实现过程中,我们将讲解如何定义变量、计算页数、实现分页查询和显示结果。 一、定义变量 在实现分页显示时,我们需要定义四个变量: 1. pageSize:定义一页显示多少条记录。 2. pageNow:定义当前显示第几...

    jdbc+serlvet分页查询代码

    **分页查询实现** 在实际的分页查询中,通常需要维护页码和每页记录数。Servlet可以接收这两个参数,通过HTTP请求传递给后端的JDBC代码。分页查询的实现步骤可能包括: 1. **计算偏移量**:根据当前页码和每页记录...

    基于springmvc实现分页查询

    本篇文章将详细探讨如何基于Spring MVC实现分页查询,这对于任何处理大量数据的Web应用都是至关重要的。 首先,理解分页的基本概念。分页是将大型数据集划分为较小、更易管理的部分,以提高用户体验并减少服务器...

    基于SSH架构的分页查询标签的研究与实现

    然而,传统的分页查询实现方式往往存在代码冗余、可维护性差等问题。本文介绍了一种基于SSH(Struts + Spring + Hibernate)架构的分页查询解决方案,通过利用JSP自定义标签技术和Hibernate Query Language (HQL),...

    java自定义分页标签实现带条件的分页查询

    本话题主要探讨如何使用自定义的Java分页标签来实现带条件的分页查询,这将帮助开发者更好地控制和优化数据检索。 首先,我们需要了解分页的基本原理。分页查询是通过限制数据库查询返回的结果数量,每次只获取一...

    使用JSP实现查询分页

    4. **分页查询**:使用`ResultSet rs = test.query("select * from student");`执行查询,并利用`absolute`方法定位到当前页的第一条记录。 5. **展示数据**:通过循环遍历`ResultSet`,将数据展示在`&lt;tr&gt;`和`&lt;td&gt;`...

    SQLite 查询所有 分页查询 查询个数

    在处理大量数据时,为了提高效率并避免一次性加载所有数据导致性能下降,通常会采用分页查询的方式来获取数据。下面我们将详细探讨SQLite中的查询所有、分页查询以及查询个数的相关知识点。 1. 查询所有数据: 在...

    实现分页查询(上)

    本篇文章将深入探讨分页查询的概念、实现原理以及常见方法,以帮助开发者构建更加高效、用户友好的应用程序。 一、分页查询的概念 分页查询是指在处理大量数据时,将其分为多个小块(页),每次只加载一部分数据到...

    JavaWeb实现分页查询案例

    本案例通过原生的PageBean实现分页查询,采用JDBC(Java Database Connectivity)进行数据库操作,Servlet作为控制层处理请求,JSP(JavaServer Pages)用于展示数据。以下将详细解释这个案例中的关键知识点。 首先...

    Struts2实现分页查询

    用Struts2+mysql实现的简单信息录入,分页查询

    使用MybatisPlus+SpringMBVC完成的CUID以及分页查询实现Demo

    使用MyBatisPlus的逆向工程自动生成Mapper接口,xml文件,service接口,service实现以及controller并整合Spring框架完成单表CUID和分页操作,代码讲解请参看:...

    mybatis分页查询例子 idea实现

    在这个过程中,PageHelper会自动拦截SQL语句,添加上分页的相关条件,从而实现分页查询。此外,PageInfo对象包含了当前页的数据列表、总页数、总记录数等信息,方便我们在前端展示分页效果。 为了更好地理解这个...

Global site tag (gtag.js) - Google Analytics