Mybatis中的分页插件

Posted 孤狼灬笑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis中的分页插件相关的知识,希望对你有一定的参考价值。

目录

一.为什么要使用分页插件?

二.分页常用标签

三.分页插件的使用

        1.在mybatis的pom中添加分页插件依赖

        2.在mybatis-config.xml中创建分页插件

3.在test文件中进行查询操作的时候,开启分页功能

       PageInfo<>()

        PageHelper.startPage();

总结:


一.为什么要使用分页插件?

  • 不必再利用Web中的link来获取刷新下一页 
  • 分页插件可以通过标签显示各种page信息
  • 分页插件可以帮助我们更好的获取page信息
  • 上一页和下一页和首页和尾页都能够轻松的获取到

二.分页常用标签

limit (index,pageSize)
pageSize:每页显示的条数
pageNum:每页的页码
index:当前页的起始索引,index=(pageNum-1)*pageSize
count:总记录数
totalpage:总页数
totalPage:count/pageSize
if(count%pageSize !=0)
​​​​​​​totalpage +=1;

举例
pageSize=4,pageNum=1,index=0 limit (0,4)
pageSize=4,pageNum=3,index=8 limit (8,4)
pageSize=4,pageNum=6,index=20 limit (20,4)

三.分页插件的使用

1.在mybatis的pom中添加分页插件依赖

<dependency>
<groupId>com.github.pagehelper</groupId>  
<artifactId>pagehelper</artifactId>
<version>5.2.0</version> //版本号
</dependency>

2.在mybatis-config.xml中创建分页插件

<plugins>
<!--分页插件-->
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

3.在test文件中进行查询操作的时候,开启分页功能

操作如下:

1.查询操作

   @Test
    public void selectPageTest() 
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);//获取映射方法
        Page<Object> objects = PageHelper.startPage(1, 6);       //创建分页插件对象
        List<Emp> list = mapper.selectByExample(null);           //查询对象
        list.forEach(System.out::println);
        System.out.println(objects);
    

2. 查询结果如下

//查询打印查询的信息信息
Pagecount=true,pageNum=1,pageSize=6,startRow=0,endRow=6,total=9,
pages=2,reasonable=false,pageSizeZero=false
[EmpempId=3, empName='罗日彬', age=20, gender='男', deptId=1, 
EmpempId=4, empName='赵层', age=20, gender='男', deptId=2, 
EmpempId=5, empName='孙众', age=20, gender='男', deptId=3, 
EmpempId=6, empName='成求2', age=20, gender='男', deptId=null, 
EmpempId=7, empName='成求3', age=20, gender='男', deptId=null, 
EmpempId=8, empName='成求4', age=20, gender='男', deptId=null]

 3.使用     PageInfo<Emp> pageInfo = new PageInfo<Emp>(list, 1)

显示上一页和下一页,以及自己所处的那一页,更方便作者使用

@Test
    public void selectPageTest() 
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Page<Object> objects = PageHelper.startPage(1, 6);
        List<Emp> list = mapper.selectByExample(null);
//        list.forEach(System.out::println);
//        System.out.println(objects);
        PageInfo<Emp> pageInfo = new PageInfo<Emp>(list, 1);
        System.out.println(pageInfo);
    

4.查询结果如下

PageInfopageNum=1,pageSize=6,size=6,startRow=1,endRow=6,total=9,pages=2,
list=Pagecount=true, pageNum=1, pageSize=6, startRow=0, endRow=6, total=9,pages=2,reasonable=false, pageSizeZero=false
[ EmpempId=3, empName='罗日彬', age=20, gender='男',deptId=1,
  EmpempId=4, empName='赵层', age=20, gender='男', deptId=2,
  EmpempId=5,empName='孙众', age=20, gender='男', deptId=3,
  EmpempId=6, empName='成求2',age=20,gender='男', deptId=null, 
  EmpempId=7, empName='成求3', age=20, gender='男', deptId=null,
  EmpempId=8, empName='成求4', age=20, gender='男', deptId=null ]
prePage=0,nextPage=2,isFirstPage=true,isLastPage=false,
hasPreviousPage=false,hasNextPage=true,
navigatePages=1,navigateFirstPage=1,
navigateLastPage=1, navigatepageNums=[1]

最终显示信息为:

pageNum:当前页的页码
pageSize:每页显示的条数
size:当前页显示的真实条数
total:总记录数
pages:总页数
prePage:上一页的页码
nextPage:下一页的页码
isFirstPage/isLastPage:是否为第一页/最后一页
hasPreviousPage/hasNextPage:是否存在上一页/下一页
navigatePages:导航分页的页码数
navigatepageNums:导航分页的页码,[1,2,3,4,5]

 

总结:

  • 根据分页插件能更好的获取到页面的信息
  • 根据分页插件能减少web中的link操作,就避免的跳转的麻烦
  • 使用分页插件功能,获取页面信息更加的准确

Mybatis 的分页插件 PageHelper

 

我用的版本是PageHelper-4.1.1Mybatis-3.3.0
PageHelper 依赖于 jsqlparser-0.9.4.jar
 
使用方法:
1、根据Mybatis的版本下载对应版本的PageHelper ( Mybatis最低版本不能低于3.3 )
2、在Mybatis的配置文件 Mybatis-Configu.xml中配置PageHelper插件,配置示例:
   plugins插件的配置在 settings之后 在environments之前
   settings中设置Mybatis的一些额外的运行参数 如是否开启延迟加载,动态代理使用CG-LIB,或JAVALIB等
    <plugins>
         <!-- PageHelper4.1.1 --> 
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <property name="dialect" value="oracle"/>
            <property name="offsetAsPageNum" value="false"/>
            <property name="rowBoundsWithCount" value="false"/>
            <property name="pageSizeZero" value="true"/>
            <property name="reasonable" value="false"/>
            <property name="supportMethodsArguments" value="false"/>
            <property name="returnPageInfo" value="none"/>
        </plugin>
    </plugins>  
3、使用方法
pageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息
所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句
所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句
PageHelper只对紧跟着的第一个SQL语句起作用
如上:所以若一个方法中涉及到多个查询,需要小心,避免为不需要分页的添加了分页,而真正需要分页的却没有被分页
1)、统计总数,(将SQL语句变为 select count(0) from xxx,只对简单SQL语句其效果,复杂SQL语句需要自己写)
    Page<?> page = PageHelper.startPage(1,-1);
    long count = page.getTotal();
2)、分页,pageNum - 第N页, pageSize - 每页M条数
    A、只分页不统计(每次只执行分页语句)
    PageHelper.startPage([pageNum],[pageSize]);
    List<?> pagelist = queryForList( xxx.class, "queryAll" , param);
    //pagelist就是分页之后的结果
    B、分页并统计(每次执行2条语句,一条select count语句,一条分页语句)适用于查询分页时数据发生变动,需要将实时的变动信息反映到分页结果上
    Page<?> page = PageHelper.startPage([pageNum],[pageSize],[iscount]);
    List<?> pagelist = queryForList( xxx.class , "queryAll" , param);
    long count = page.getTotal();
    //也可以 List<?> pagelist = page.getList();  获取分页后的结果集
3)、使用PageHelper查全部(不分页)
    PageHelper.startPage(1,0);
    List<?> alllist = queryForList( xxx.class , "queryAll" , param);
4)、PageHelper的其他API
    String orderBy = PageHelper.getOrderBy();    //获取orderBy语句
    Page<?> page = PageHelper.startPage(Object params);
    Page<?> page = PageHelper.startPage(int pageNum, int pageSize);
    Page<?> page = PageHelper.startPage(int pageNum, int pageSize, boolean isCount);
    Page<?> page = PageHelper.startPage(pageNumpageSizeorderBy);
    Page<?> page = PageHelper.startPage(pageNumpageSizeisCountisReasonable);    //isReasonable分页合理化,null时用默认配置
    Page<?> page = PageHelper.startPage(pageNumpageSizeisCountisReasonableisPageSizeZero);    //isPageSizeZero是否支持PageSize为0,true且pageSize=0时返回全部结果,false时分页,null时用默认配置
5)、默认值
    //RowBounds参数offset作为PageNum使用 - 默认不使用
    private boolean offsetAsPageNum = false;
    //RowBounds是否进行count查询 - 默认不查询
    private boolean rowBoundsWithCount = false;
    //当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果
    private boolean pageSizeZero = false;
    //分页合理化
    private boolean reasonable = false;
    //是否支持接口参数来传递分页参数,默认false
    private boolean supportMethodsArguments = false; 





















以上是关于Mybatis中的分页插件的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis 插件使用-自定义简单的分页插件

Mybatis分页插件

SpringBoot集成MyBatis的分页插件PageHelper

Mybatis分页插件

Mybatis的分页[MySql数据库]

ssm框架中解决 sqlserver数据库的分页问题(用的是mybatis插件)