分页功能 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);
}