- 分页的工具类一直都不会写,没有理解里面几个属性的意思,趁这个时间看了一下别人写的分页工具类,然后自己也模仿写了一个分页的工具类,虽然有很多已经封装好了的分页工具,pagehelp什么的,但是如果不能用那个呢,还是要自己动手写一个分页工具类的。
这里是原博主的链接 - 虽然现在有很多好用的框架,对分页进行支持,很简单的就把分页的效果做出来,但是如果手动实现分页效果又如何呢?
- (1)分页的思路
首先我们得知道写分页代码时的思路,保持思路清晰,有步骤的进行,才能行云如水。先来看看分页的效果
这就是一个分页导航,其中能得到的数据有
totalRecord:总共员工数,数据库中总的记录数,这里有55条
totalPage:总页数,11页
pageSize:每页显示的记录数,这里可以看到每页显示5条
pageNum:当前页为第几页,比如图中就为第9页,因为9是没有超链接的,
start:总共能显示5页,让用户进行点击,7为起始页
end:11为能显示的尾页,也就是,如果用户点击第8页,那么start就为6,end就为10,每次都只有5页共点击查询。
每次能够得到对应页数所需要的5条数据,等等这些数据都要在jsp中显示出来,也就是说,每次都要从后台拿那么多数据过来进行显示,所以我们就想办法把这些数据封装在一个javabean当中,每次后台都将查询到的数据放入javabean对象中,我们只需要将该对象存入request作用域,然后在jsp页面中从域中获取需要的数据即可。
(2)创建PageBean存放数据
总共需要8个属性pageNum、pageSize、totalRecord、totalPage、startIndex、list、start、end,
pageNum、pageSize、totalRecord:通过构造方法就能得到。pageNum请求页面提交过来的参数,pageSize是自己设置的,totalRecord是查询数据库得到的
totalPage、startIndex、start、end是通过内部算法得出,
list需要通过查询数据库在通过set方式得到。
注意:该类使用泛型是为了不仅仅在这个项目中使用,在别的项目中也同样可以使用
PageBean.java 分页工具类
package com.onlinesearch.utils;
import java.util.List;
/**
* 尝试写公共的分页工具
* @author Mr.zhou
*/
public class PageBean<T> {
// 已知数据
private int pageNum; // 当前页的数据
private int pageSize; // 每页显示的数据
private int totalRecord; // 总的记录条数,通过查询数据得到
// 需要计算的数据
private int totalPage; // 总页数,通过pageSzie/totalRecord得到
// 开始索引,也就是我们在数据库中要从第几行数据开始拿,有了startIndex和pageSize
// 就知道了limit语句的两个数据,就能拿到每页能显示的数据了
private int startIndex;
// 将每页需要显示的数据放在list集合中
private List<T> list;
//分页显示的页数,比如页面显示的是1,2,3,4,5页,start就为1,end就为5,这个也是需要算过来的
private int start;
private int end;
// 通过pageNum,pageSize,totalRecord可以获取totalRecord和startIndex
// 通过构造方法初始化这些属性
public PageBean(int pageNum, int pageSize, int totalRecord) {
this.pageNum = pageNum;
this.pageSize = pageSize;
this.totalRecord = totalRecord;
// 计算totalPage总页数
if (totalRecord/pageSize == 0) {
// 如果整除了,正好每页显示pageSize条数据,
this.totalPage = totalRecord/pageSize;
}else {
// 如果不整除,需要另外添加一页来显示多余的数据
this.totalPage = totalRecord/pageSize + 1;
}
//计算开始索引 公式就是(第几页-1)* 每页需要显示的数据
this.startIndex = (pageNum-1)*pageSize;
this.start = 1;
this.end = 5;
// 显示页数的算法
// 显示5页
// 如果总页数小于5条
if (totalPage <= 5) {
// 那么end就是总页数的值了
this.end = this.totalPage;
}else {
// 如果总页数大于5条,那么就要根据当前页来判断start和end为多少了
this.start = pageNum -2;
this.end = pageNum + 2;
if (start < 0) {
// 如果当前页是第一页,或者第二页,就不按照这个规则了
this.start = 1;
this.end = 5;
}
if (end > this.totalPage) {
// 如果当前页是倒数第二页或者倒数第一页,同样页不按照这个规则了
this.end = totalPage;
this.start = end - 5;
}
}
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalRecord() {
return totalRecord;
}
public void setTotalRecord(int totalRecord) {
this.totalRecord = totalRecord;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getStartIndex() {
return startIndex;
}
public void setStartIndex(int startIndex) {
this.startIndex = startIndex;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
}
User.java 实体类
package com.onlinesearch.pojo;
import lombok.Data;
/**
* @author Mr.zhou
*/
@Data
public class User {
private String id;
private String name;
private String age;
private String sex;
private String idCard;
}
先写一个mapper接口
UserMapper.java
package com.onlinesearch.mapper;
import com.onlinesearch.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface UserMapper {
/**
* 获取全部用户
* @return
*/
List<User> findAllUser();
/**
* 分页获取用户数据
* @param startIndex
* @param pageSize
* @return
*/
List<User> findAll(@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);
}
UserMapper.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.onlinesearch.mapper.UserMapper">
<resultMap id="UserResultEntity" type="com.onlinesearch.pojo.User">
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="sex" property="sex"/>
<result column="idcard" property="idCard"/>
</resultMap>
<select id="findAll" resultMap="UserResultEntity">
select id,name,age,sex,idcard from tb_user limit #{startIndex},#{pageSize}
</select>
<select id="findAllUser" resultType="com.onlinesearch.pojo.User">
select id,name,age,sex,idcard from tb_user
</select>
</mapper>
UserService.java 接口
package com.onlinesearch.service;
import com.onlinesearch.utils.PageBean;
import com.onlinesearch.pojo.User;
/**
* @author Mr.zhou
*/
public interface UserService {
/**
* 获取每页的用户数据
* @param pageNum
* @param pageSize
* @return
*/
PageBean<User> findAllUserWithPage(int pageNum, int pageSize);
}
UserServiceImpl.java 实现类
package com.onlinesearch.service.impl;
import com.onlinesearch.utils.PageBean;
import com.onlinesearch.service.UserService;
import com.onlinesearch.pojo.User;
import com.onlinesearch.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author Mr.zhou
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired(required = false)
private UserMapper userMapper;
@Override
public PageBean<User> findAllUserWithPage(int pageNum,int pageSize) {
// 在这里就要将PageBean里面的数据创建好(初始化好)然后将对象返回回去
// 先从数据库中获取所有用户的全部数量,获得totalRecord
List<User> allUser = userMapper.findAllUser();
int totalRecord = allUser.size();
// 有了三个初始工具,就能够创建PageBean对象了
PageBean<User> pageBean = new PageBean<>(pageNum,pageSize,totalRecord);
// 获取PageBean对象中的startIndex (从数据库中的第几行开始拿)
int startIndex = pageBean.getStartIndex();
// 有了startIndex和pageSize,就可以拿到每页的数据了
pageBean.setList(userMapper.findAll(startIndex,pageSize));
return pageBean;
}
}
UserController.java 控制层
package com.onlinesearch.controller;
import com.onlinesearch.utils.PageBean;
import com.onlinesearch.service.UserService;
import com.onlinesearch.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
@RequestMapping("test")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/test")
public PageBean<User> test() {
// 第一个参数是前端传过来的,表示第几页,第二个参数表示每页显示几条数据也可以从前端传过来
// 只需要三个参数就可以实现分页了,总数(后端获得),第几页(前端传过来),每页的数量(前端传过来,也可以写死)
PageBean<User> allUserWithPage = userService.findAllUserWithPage(2,5);
// 可以返回json,也可以返回视图,将数据放到request中都行
return allUserWithPage;
}
}
最后结果: