MyBatis -- paging and paging plug-in pagehelper


There are several ways to realize the paging of the mybatis framework. The simplest is to use the native sql keyword limit. The other is to use the interceptor to splice sql to achieve the same functions as limit. The other is to use the PageHelper. Here, take MySQL as an example to explain these two common implementation methods.

No matter which implementation method is used, we can no longer use List for the returned results. We need a custom object Pager:

package com.macay.entity;

import java.util.List;

 * @ClassName: Pager,Paging object
 * @Description:
 * @Author: Macay
 * @Date: 2021/9/22 11:58 afternoon
public class Pager<T> {
    private int page;//Paging start page
    private int size;//Records per page
    private List<T> rows;//Collection of records returned
    private long total;//Total records

    public int getPage() {
        return page;

    public void setPage(int page) { = page;

    public int getSize() {
        return size;

    public void setSize(int size) {
        this.size = size;

    public List<T> getRows() {
        return rows;

    public void setRows(List<T> rows) {
        this.rows = rows;

    public long getTotal() {
        return total;

    public void setTotal(long total) { = total;

    public String toString() {
        return "Pager{" +
                "page=" + page +
                ", size=" + size +
                ", rows=" + rows +
                ", total=" + total +

1, Normal paging using limit

The core of using limit paging is SQL, which can be easily implemented without any plug-ins or tools. We splice this SQL in the mapper file:

SELECT * from user limit startIndex,pageSize 

startIndex: the starting position of paging, starting from 0;
pageSize: number of queries;


List<Student> getStudentByPage(Map<String, Object> params);
long getCount();

mapper file:

<select id="getStudentByPage" resultType="com.macay.entity.Student">
    select * from student limit #{startIndex}, #{pageSize}
<select id="getCount" resultType="long">
    select count(*) from student

Test class:

public void testGetStudentByPage() {
    Pager<Student> studnentByPage = getStudnentByPage(2, 5);
private Pager<Student> getStudnentByPage(int page, int size) {
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    StudentDao mapper = sqlSession.getMapper(StudentDao.class);
    Map<String, Object> params = new HashMap<>();
    params.put("startIndex", (page-1)*size);
    params.put("pageSize", size);
    List<Student> students = mapper.getStudentByPage(params);
    Pager<Student> studentPager = new Pager<>();
    return studentPager;

The test results are as follows:

2, Implementation using Mybatis paging interceptor

Using the Mybatis paging interceptor, we don't need to write paging query statements in the Mapper configuration file. We just need to write non paging query statements. Then, through the paging interceptor, we intercept the ordinary sql that needs paging query, replace the ordinary sql with paging sql, and skillfully realize paging query.

There is no in-depth explanation here. For details, you can search the explanation on the Internet:

3, Using the paging plug-in pagehelper

This plug-in supports many database versions, as follows:

The github address is as follows:

In fact, the PageHelper method is also a third-party implementation of the second way to use the Interceptor interceptor. It internally helps us realize the functions of the Interceptor. The basic steps are as follows:

1. Introducing maven dependency
2. Add plugin configuration

Configure the PageHelper plug-in in the mybatis core configuration file (note the target directory):

<!--stay<environments>Before joining-->
    <plugin interceptor="com.github.pagehelper.PageInterceptor"/>

Note: since version 4.0.0, you can automatically identify the database. You don't need to specify the database

3. PageHelper object

The PageHelper.startPage static method is called before query.
Call the PageHelper.startPage static method before you need to paging the MyBatis query method.
The first MyBatis query method after this method will be paged.

The interfaces are as follows:

List<Student> getStudentByPageHelper();

mapper file:

<select id="getStudentByPageHelper" resultType="com.macay.entity.Student">
    select * from student

Test class:

public void getStudentByPageHelper() {
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    StudentDao mapper = sqlSession.getMapper(StudentDao.class);
    PageHelper.startPage(2, 5);
    List<Student> students = mapper.getStudentByPageHelper();

As shown in the figure, the query results in the second page of data, with 5 entries per page.

Not only that, we can also get other parameters related to paging:

public void getStudentByPageHelper() {
    // Integrated paging assistant plug-in to test paging
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    StudentDao mapper = sqlSession.getMapper(StudentDao.class);
    // Set paging related parameters current page + number of items displayed per page
    PageHelper.startPage(2, 5);
    List<Student> students = mapper.getStudentByPageHelper();
    // System.out.println(students);
    //Get paging related parameters
    PageInfo<Student> pageInfo = new PageInfo<>(students);
    System.out.println("Current page:"+pageInfo.getPageNum());
    System.out.println("Number of items displayed per page:"+pageInfo.getPageSize());
    System.out.println("Total number of pieces:"+pageInfo.getTotal());
    System.out.println("Total pages:"+pageInfo.getPages());
    System.out.println("previous page:"+pageInfo.getPrePage());
    System.out.println("Next page:"+pageInfo.getNextPage());
    System.out.println("First page:"+pageInfo.isIsFirstPage());
    System.out.println("Is this the last page:"+pageInfo.isIsLastPage());

The results are as follows:

Tags: MySQL SQL Java

Posted by s-mack on Thu, 23 Sep 2021 18:43:13 +0530