前言
虽然说现在目前很多主流的辅助框架可以帮我们完成分页,比如说后端的
pageHelper
、或者前端的Layui
可以帮我们完成进行分页。 但是有必要的时候我们需要去了解原生分页的步骤过程充实自己的内功。
原生分页的实现
一、MySQL分页公式:limit [起始偏移],[显示数量]
- 起始偏移从0开始,当只有一个参数时表示显示多少条数据。
- 使用场景 MySQL分页查询:
select * from table limit current,pageSize
MySQL分页公式:limit (起始偏移-1)* 显示数量,显示数量
二、用于展示的UI分页
- 配置一个泛型的分页工具用于保存数据。
- 页面可以通过EL表达式进行获取设置查询。
计算总页数的公式方式:
-
通过if判断计算
/* totalRecord -- 表示为总记录数 pageSize -- 表示为页面显示条数 totalPage -- 表示为页面的总页数 */ if(totalRecord % pageSize == 0){ totalPage = totalRecord / pageSize; }else{ tatalPage = totalRecord / pageSize + 1; }
-
通过Math方法进行计算
// ceil()表示向上取整,如果结果为整则取结果;相对的方法是floor() // 结果值为浮点类型,因此需要强制转换。 int totalPage = (int) Math.ceil(totalRecord/pageSize)
-
通过公式进行计算
this.totalPage = (totalRecord-1) / pageSize + 1;
泛型分页类如下(复制可以直接使用)
/**
* @author Unruly
* @version 2019-02-10 16:53
*/
public class PageTools<T> {
/** 页码:参数需要通过请求传入 */
private Integer pageNum;
/** 数据总数:通过sql查询 */
private Integer dataTotal;
/** 显示页数:参数需要通过请求传入 */
private Integer pageSize;
/** 集合:通过sql查询,查询推荐排序 */
private List<T> pages;
/** 总页数:已经计算直接通过EL使用即可 */
private Integer pageTotal;
/** 首页:已经计算直接通过EL使用即可 */
private Integer firstPage;
/** 尾页:已经计算直接通过EL使用即可 */
private Integer lastPage;
/** 上一页:已经计算直接通过EL使用即可 */
private Integer prevPage;
/** 下一页:已经计算直接通过EL使用即可 */
private Integer nextPage;
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getDataTotal() {
return dataTotal;
}
public void setDataTotal(Integer dataTotal) {
this.dataTotal = dataTotal;
}
public void setPageTotal(Integer pageTotal) {
this.pageTotal = pageTotal;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public void setFirstPage(Integer firstPage) {
this.firstPage = firstPage;
}
/**
* 计算总页数的方法
* @return 总页数
*/
public Integer getPageTotal() {
return (dataTotal-1)/pageSize+1;
}
/**
* 计算首页的方法
* @return 返回首页
*/
public Integer getFirstPage() {
this.firstPage = 1;
return firstPage;
}
/**
* 计算尾页的方法
* @return 返回尾页
*/
public Integer getLastPage() {
this.lastPage = this.getPageTotal();
return lastPage;
}
/**
* 计算上一页的方法
* @return 返回上一页页码
*/
public Integer getPrevPage() {
this.prevPage = this.pageNum - 1;
if (this.prevPage < 1) {
this.prevPage = 1;
}
return prevPage;
}
/**
* 计算下一页的方法
* @return 返回下一页页码
*/
public Integer getNextPage() {
this.nextPage = this.pageNum + 1;
if (this.nextPage > this.getPageTotal()) {
this.nextPage = this.getPageTotal();
}
return nextPage;
}
public void setLastPage(Integer lastPage) {
this.lastPage = lastPage;
}
public void setPrevPage(Integer prevPage) {
this.prevPage = prevPage;
}
public void setNextPage(Integer nextPage) {
this.nextPage = nextPage;
}
public List<T> getPages() {
return pages;
}
public void setPages(List<T> pages) {
this.pages = pages;
}
}
MyBatis语法
<!-- MyBatis语句,有条件和无条件的不同 -->
<select id="selectCount" resultType="int">
select count(1) from invitation
<where>
<if test="title != null and title != ''">
title = #{title}
</if>
</where>
</select>
<!--MyBatis语句,有条件和无条件的不同 -->
<select id="select" resultMap="AllColumnMap">
SELECT * from invitation
<where>
<if test="pojo.title != null and pojo.title!=''">AND title = #{pojo.title}</if>
</where>
order by createDate desc
<if test="pageNum != null and pageSize != null">
limit #{pageNum},#{pageSize}
</if>
</select>
控制处理分页回显
-
控制处理:将所有访问的数据存入model中,就相当于存入一次请求中
@RequestMapping("/goindexMypage.html") public String goindexMypage(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "5") int pageSize, @RequestParam(required = false) String title, Model model) { // 查询总数,通过有条件和无条件确定 int dataTotal = invitation.selectCount(title); Invitation in = new Invitation(); in.setTitle(title); // 查询集合 List<Invitation> listInvitation = invitation.select(in, pageNum, pageSize); // 设置分页类 页码,页数,数据总数,集合 PageTools<Invitation> pageTool = new PageTools<Invitation>(); pageTool.setPageNum(pageNum); pageTool.setPageSize(pageSize); pageTool.setDataTotal(dataTotal); pageTool.setPages(listInvitation); // 添加到请求中 model.addAttribute("list",pageTool); model.addAttribute("title", title); return "index2"; }
-
数据回显 :通过EL表达式进行取值回显,第一次没有条件默认显示全部
<tr> <td><span>第${list.pageNum}/${list.pageTotal}页</span></td> <td colspan="4" align="right"> <a href="goindexMypage.html?pageNum=${list.firstPage}&title=${title}"> 首页 </a> <a href="goindexMypage.html?pageNum=${list.prevPage}&title=${title}"> 上一页 </a> <a href="goindexMypage.html?pageNum=${list.nextPage}&title=${title}"> 下一页 </a> <a href="goindexMypage.html?pageNum=${list.lastPage}&title=${title}"> 尾页 </a> </td> </tr>