快速上手Mybatis的pagehelper分页插件(详细)



在平时的项目中一个导航栏往往要涉及到有多少页前一页后一页,是否是第一页最后一页,这时候如果不用分页插件往往要用稍微复杂的方法,或者可能要发送一个以上的请求来完成

但是pagehelper完美地解决了只需要一次就能获取到所有的信息

1.引入依赖

 <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.1.8</version>
    </dependency>

2.在mybatis主配置文件中配置插件

   <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>

3.运行selectall语句

package org.example.Test;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.example.bean.Emp;
import org.example.mapper.EmpMapper;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class TestPage {

    @Test
    public void  testPage() throws IOException {

        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");


        SqlSessionFactory sql = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sql.openSession(true);
//        true自动处理事务

        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        //为接下来仅仅一条的mybatis要运行的查询语句添加limit分页语句
        PageHelper.startPage(2,2);
        List<Emp> allEmp = mapper.getAllEmp();
        System.out.println(allEmp);
}}
结果如下
DEBUG 08-06 10:54:22,707 Cache Hit Ratio [SQL_CACHE]: 0.0  (LoggingCache.java:60) 
DEBUG 08-06 10:54:22,746 Cache Hit Ratio [org.example.mapper.EmpMapper]: 0.0  (LoggingCache.java:60) 



                                先是查询一共有多少条数据
DEBUG 08-06 10:54:22,756 ==>  Preparing: SELECT count(0) FROM emp   (BaseJdbcLogger.java:143) 
DEBUG 08-06 10:54:22,791 ==> Parameters:   (BaseJdbcLogger.java:143) 
DEBUG 08-06 10:54:22,814 <==      Total: 1  (BaseJdbcLogger.java:143) 
DEBUG 08-06 10:54:22,818 Cache Hit Ratio [org.example.mapper.EmpMapper]: 0.0  (LoggingCache.java:60) 



                            再用我们传进的参数查询指定数据
DEBUG 08-06 10:54:22,819 ==>  Preparing: select eid, ename, age, sex from emp LIMIT ?, ?   (BaseJdbcLogger.java:143) 
DEBUG 08-06 10:54:22,819 ==> Parameters: 2(Integer), 2(Integer)  (BaseJdbcLogger.java:143) 
DEBUG 08-06 10:54:22,823 <==      Total: 2  (BaseJdbcLogger.java:143) 



                            再通过这些数据计算出下列分页属性

Page{count=true, pageNum=2, pageSize=2, startRow=2, endRow=4, total=9, pages=5, 
reasonable=false, pageSizeZero=false}[Emp{eid=5, ename='刘五', age=12, sex='男', 
dept=null}, Emp{eid=6, ename='李四', age=12, sex='男', dept=null}]

可以看出分页插件仅仅就做了两个步骤一个先是自动发送一条查询总数的sql语句和拦截我们要查询的sql语句后面加上limit语句完成自动分页

这时候细心的小伙伴就会问  PageHelper.startPage(2,2);的作用范围是多少,这个我上面也写了但是我这还是说一下仅仅只是下面一条最近sql语句,跟大部分注解的作用范围差不多。

可能这时候会有一点问题list集合并没有相应的get方法来操作page里面的属性所以这时候就要用到

 PageInfo<Emp> pageInfo=new PageInfo<>(list);

 

package org.example.Test;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.example.bean.Emp;
import org.example.mapper.EmpMapper;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class TestPage {

    @Test
    public void  testPage() throws IOException {

        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");


        SqlSessionFactory sql = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sql.openSession(true);
//        true自动处理事务

        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        //为接下来仅仅一条的mybatis要运行的查询语句添加limit分页语句
        PageHelper.startPage(2,2);
        List<Emp> allEmp = mapper.getAllEmp();
        System.out.println(allEmp);


        PageInfo<Emp> pageInfo=new PageInfo<>(allEmp);
       //装饰list集合使得分页数据更为详细、
         System.out.println(pageInfo);
}}

 

Page{count=true, pageNum=2, pageSize=2, startRow=2, endRow=4, 
total=9, pages=5, reasonable=false, pageSizeZero=false}
[Emp{eid=5, ename='刘五', age=12, sex='男', dept=null}, 
Emp{eid=6, ename='李四', age=12, sex='男', dept=null}]



PageInfo{pageNum=2, pageSize=2, size=2, startRow=3, endRow=4, total=9, pages=5, 
list=Page{count=true, pageNum=2, pageSize=2, startRow=2, endRow=4, total=9, pages=5, 
reasonable=false, pageSizeZero=false}[Emp{eid=5, ename='刘五', age=12, sex='男', dept=null}, 
Emp{eid=6, ename='李四', age=12, sex='男', dept=null}], prePage=1, nextPage=3, 
isFirstPage=false, isLastPage=false, hasPreviousPage=true, hasNextPage=true, 
navigatePages=8, navigateFirstPage=1, navigateLastPage=5, navigatepageNums=[1, 2, 3, 4, 5]}

可以看出装饰完的list集合明显有了更加详细的数据

也有了对应的get方法来取值

最后就以所有属性所代表的的意思的注解来结束

//当前页的页数
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;


//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集里面包含当前查询结果的状态
private List<T> list;

//第一页的页数
private int firstPage;
//前一页的页数
private int prePage;
//下一页的页数
private int nextPage;
//最后一页的页数
private int lastPage;

//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;

如有帮助点赞收藏

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页