接触Java技术以来,项目中实现分页功能一直以来是一大纠结点。近日终归算是下定决心研究一下其中的原理了喽~~~
本次主要研究分页功能实现原理,所以没有使用任何框架技术,通过简单的Servlet、jsp连接MySQL数据库来实现。
一、准备工作:
1. 在MySQL数据库中创建数据表,并添加足够分页的数据。
2. 使用MyEclipse创建JavaWeb项目。
3. 创建实体类、工具类、DAO、Service、Servlet等,这写常规东西在这里均省略掉。
二、分析、实现分页功能:
1. 通过查询MySQL数据库实现分页的sql语句为:select * from 表名 limit 起始行 , 每页显示行数。
2. 页面显示页面信息包括:总页数、当前页数;
页面显示可操作内容包括:首页、尾页、上一页、下一页的跳转,以及输入页码,提交后跳转到指定页。
3. 实现分页功能所必须的几个重要参数:
* pageSize // 每页所显示的数据条数 --- 根据情况自行定义
* totalRow // 数据表中记录数据的总行数 --- 通过查询数据表获得
* totalPage //分页后的总页数,即数据表中数据共可以分多少页 --- 通过计算获得
* currentPage //当前页码 --- 根据判断,并计算而获得
* rowNum //每页起始行在数据表中的行数
4. 分析以上参数的获取方式:
(1) pageSize,每页所显示的数据条数,这个是根据自己项目情况自己设定的。
(2) totalRow,数据表中记录数据的总行数,可以通过“SELECT COUNT(*) FROM 表名”进行查询。
(3) totalPage,分页后的总页数,通过“totalRow/pageSize”计算获得;
总页数的计算结果有两种情况:
① 总数据分页后正好为整页:
totalPage = totalRow/pageSize;
② 总数据分页后不是整页:
totalPage = totalRow/pageSize+1;
(4) currentPage,当前页码,情况较为复杂,需分两种情况:
第一页的内容是通过点击查询链接,直接获取的;而从第二页开始,后面各页内容均是通过点击自身页面的翻页链接获取的,currentPage的值可以通过链接传输参数,从页面传递给后台。所以该值需要通过判断来确定:
① 当访问第一页时,设定currentPage = 1;
② 当访问第二页之后时,currentPage的值可以通过request.getParameter("currentPage"),从页面获取,对应的页面代码为:
">上一页
">下一页
对应后台的判断代码如下:
String page= request.getParameter("page"); // 从页面接收参数page
if(page == null || page.trim() == 0{ // 当没有接收到page参数时,即访问第一页时查询链接并没有传入参数page
page = "1"; // 设定page的值为1
}
int currentPage = Integer.parseInt(page); // 将String类型的page参数转换为int类型的currentPage
if(currentPage < 1){ // 若当前页数小于1(在第一页时点击上一页,这里的值会为0、-1、-2......)
currentPage = 1 // 设定currentPage的值为1
}
if(currentPage > totalPage){ // 若当前页数大于总页数(在最后一页点击下一页,这里的值会为totalPage+1......)
currentPage = totalPage; // 设定currentPage的值为总页数
}
(5) rowNum,每页起始行在数据表中的行数,其值可通过如下公式进行计算获得:
int rowNum = (currentPage - 1) * pageSize;
5. 分页功能实现过程:
6. 点击链接或按钮查询“首页”、“尾页”、指定页数据:
① “首页”链接实现:
首页
② “尾页”链接实现:
">尾页
③ 指定页数据查询:
页面代码:
调转到页
js代码:
三、附上其他
常见数据库分页查询语句
1.oracle数据库分页
select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=startrow
2.DB2数据库分页
Select * from (select rownumber() over() as rc,a.* from (select * from 表名 order by列名) as a) where rc between startrow and endrow
3.SQL Server 2000数据库分页
Select top pagesize * from 表名 where 列名 not in(select top pagesize*page 列名 from 表名 order by列名) order by列名
4.SQL Server 2005数据库分页
Select * from (select 列名,row_number() over(order by 列名1) as 别名from 表名) as t where t.列名1>=startrow and t.列名1<=endrow
5.MySQL数据库分页
Select * from 表名 limit startrow,pagesize
(Pagesize为每页显示的记录条数)
6.PostgreSQL数据库分页
Select * from 表名 limit pagesize,offset startrow
(Pagesize为每页显示的记录条数)