Java数据分页的设计及实现
概述
数据分页,对于一个Web程序而言,是不可或缺的一个基础功能。当数据量很小很小的时候,比如只有只有二三十笔,不提供数据分页功能或许还是可以接受的;当数据量达到五十笔、八十笔的时候,如果还不提供分页功能,会显得有些差强人意了;当数据量达到上百、上千甚至上万笔的时候,如果再不提供分页功能,我想没有哪个用户是能够接受得了的了。
解决方案
数据分页,主要有两种解决方案:一是在数据库端进行分页查询;二是一次性将数据全部抓取到客户端,由客户端进行分页处理。这两种方案各有利弊,这里就不多赘述。通常使用第一种解决方案比较多,我这里也选择第一种方案,并以Mysql数据库为例,为大家讲解我的设计。
在数据库端进行分页查询,只需要使用Mysql数据库中自带的limit关键字即可实现,我需要的做的只是需要计算出数据偏移量,以及每次获取记录的笔数。
数据偏移量 = (页码 - 1) * 每页数据笔数
举例说明,假设我们每页显示20笔记录,第1页的偏移量就是(1-1)*20=0,即从第1笔记录开始,连续读取20笔记录;第2页偏移量就是(2-1)*20=20,即从第21笔记录开始,连续读取20笔记录...以此类推。
数据库的查询搞定了,下面就开始思考Java代码的设计。本文的代码设计是在上一篇博文《Java Spring MVC分层设计》的基础进行构建的。
代码交互时序图
代码设计
最初的构想是这样的,定义一个接口IPagination,用来保存存分页信息和数据。
- package com.emerson.etao.utils;
- import java.util.List;
- /**
- * 数据分页接口
- *
- * @author Chris Mao(Zibing)
- *
- */
- public interface IPagination<T> {
- /**
- * 每页显示的数据记录数
- */
- public static final int PAGE_SIZE = 20;
- /**
- * 设置当前页面索引值
- *
- * @param pageIndex
- */
- public void setCurrentPage(int pageIndex);
- /**
- * 设置总行数,并计算出分页数
- *
- * @param totalRows
- */
- public void setTotalRows(int totalRows);
- /**
- * 当前页面索索值
- *
- * @return int
- */
- public int getCurrentPage();
- /**
- * 总行数
- *
- * @return int
- */
- public int getTotalRows();