分页功能 demo 演示:
分页查询参数类:
PageUtil.java
public class PageUtil extends LinkedHashMap<String, Object> {
//当前页码
private int page;
//每页条数
private int limit;
public PageUtil(Map<String, Object> params) {
this.putAll(params);
//分页参数
this.page = Integer.parseInt(params.get("page").toString());
this.limit = Integer.parseInt(params.get("limit").toString());
this.put("start", (page - 1) * limit);
this.put("page", page);
this.put("limit", limit);
}
//省略 get,set方法
@Override
public String toString() {
return "PageUtil{" +
"page=" + page +
", limit=" + limit +
'}';
}
}
分页工具类:
PageResult.java
public class PageResult implements Serializable {
//总记录数
private int totalCount;
//每页记录数
private int pageSize;
//总页数
private int totalPage;
//当前页数
private int currPage;
//列表数据
private List<?> list;
/**
* 分页
* @param list 列表数据
* @param totalCount 总记录数
* @param pageSize 每页记录数
* @param currPage 当前页数
*/
public PageResult(List<?> list, int totalCount, int pageSize, int currPage) {
this.list = list;
this.totalCount = totalCount;
this.pageSize = pageSize;
this.currPage = currPage;
this.totalPage = (int)Math.ceil((double)totalCount/pageSize);
}
//省略 get,set 方法
}
Dao 层:
MySQL 自带分页查询语句: select * from user limit [start],[limit]
,start 表示从第几条数据开始查,limit表示每页查几条数据。例如:查询 user 表中第30-40条的数据,那么查询语句就是 : select * from user limit 30,10
;再比如每页放置10条查询出来的数据,查第四页,那么就相当于是从第30条数据查起,到第40条止,查询语句和上面是一样的。这样就很好解释 PageUtil.java 中构造函数中的 start,page 和 limit 了,对于后端取值来说最重要的是 当前页码 和 每页条数。
光有分页语句还不够,为了前端分页区展示还要将数据总量或者总页数返回给前端,数据总量是必不可少的,因为总页数可以计算出来,即数据总量除以每页条数,数据总量的获取方式:select count(*) from user
。
以最常见的用户表为例进行查询,需要查询的有 分页后的用户列表 和 用户总数 两个方面:
AdminUserDao:
public interface AdminUserDao {
/**
* 根据参数查询用户列表
*
* @param param
* @return
*/
List<AdminUser> findAdminUsers(Map param);
/**
* 查询用户总数
*
* @param param
* @return
*/
int getTotalAdminUser(Map param);
}
AdminUserDao.xml:
//查询分页后的用户列表
<select id="findAdminUsers" parameterType="Map" resultMap="AdminUserResult">
select id,user_name,create_time from tb_admin_user
where is_deleted=0
order by id desc
<if test="start!=null and limit!=null">
limit #{start},#{limit}
</if>
</select>
//查询用户总数
<select id="getTotalAdminUser" parameterType="Map" resultType="int">
select count(*) from tb_admin_user
where is_deleted=0
</select>
Service 层:
@Override
public PageResult getAdminUserPage(PageUtil pageUtil) {
//当前页码中的数据列表
List<AdminUser> users = adminUserDao.findAdminUsers(pageUtil);
//数据总条数 用于计算分页数据
int total = adminUserDao.getTotalAdminUser(pageUtil);
//分页信息封装
PageResult pageResult = new PageResult(users, total, pageUtil.getLimit(), pageUtil.getPage());
return pageResult;
}
Controller 层:
@RequestMapping(value = "/list", method = RequestMethod.GET)
public Result list(@RequestParam Map<String, Object> params) {
//检查参数
if (StringUtils.isEmpty(params.get("page")) || StringUtils.isEmpty(params.get("limit"))) {
return ResultGenerator.genErrorResult(Constants.RESULT_CODE_PARAM_ERROR, "参数异常!");
}
//查询列表数据
PageUtil pageUtil = new PageUtil(params);
return ResultGenerator.genSuccessResult(adminUserService.getAdminUserPage(pageUtil));
}
启动项目,浏览器输入:http://127.0.0.1:8080/list?page=1&limit=2
查询结果。
在实际使用中,一般每页返回的数据条数都是固定不变的,可以直接写死
Dao 层:
List<Blog> selectBlogList(PageQueryUtil pageQueryUtil);
int getTotalBlog();
Mapper:
<select id="selectBlogList" parameterType="Map" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from blog
where is_deleted=0
order by blog_id desc
<if test="start!=null and limit!=null">
limit #{start},#{limit}
</if>
</select>
<select id="getTotalBlog" parameterType="Map" resultType="int">
select count(*) from blog
where is_deleted=0
</select>
Service 层:
@Override
public PageResult getBlogResult(int page) {
Map<String,Object> params = new HashMap<>();
params.put("page",page);
params.put("limit",5);
PageQueryUtil pageUtil = new PageQueryUtil(params);
List<Blog> blogList = blogMapper.selectBlogList(pageUtil);
int total = blogMapper.getTotalBlog();
PageResult result = new PageResult(blogList,total,pageUtil.getLimit(),pageUtil.getPage());
return result;
}
Controller 层:
@ResponseBody
@GetMapping({"/page/{pageNum}"})
public Result page(@PathVariable("pageNum") int pageNum) {
PageResult blogPageResult = blogService.getBlogResult(pageNum);
return ResultGenerator.getSucessResult(blogPageResult);
}