Mybatis插件pagehelper

先初步了解mybatis的原理图:

Mybatis插件pagehelper_第1张图片
image.png

从图中可以看出,mybatis中首先要在配置文件中配置一些东西,然后根据这些配置去创建一个会话工厂,再根据会话工厂创建会话,会话发出操作数据库的sql语句,然后通过执行器操作数据,再使用mappedStatement对数据进行封装,这就是整个mybatis框架的执行情况。那么mybatis的插件作用在哪一环节呢?它主要作用在Executor执行器与mappedeStatement之间,也就是说mybatis可以在插件中获得要执行的sql语句,在sql语句中添加limit语句,然后再去对sql进行封装,从而可以实现分页处理。
  搞清楚了分页插件的执行情况,下面来总结下mybatis中PageHelper的使用。
1.pom.xm文件中的依赖


    com.github.pagehelper
    pagehelper
    4.1.4

  1. 在mybatis的全局配置文件SqlMapConfig.xml中配置 拦截器插件
    通常的配置方式:



    
    
        
                    
            
        
    

我在这里将xml文件的所有标签一一列出:



    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    

其他五个参数说明:
2.1 增加dialect属性,使用时必须指定该属性,可选值为oracle,mysql,mariadb,sqlite,hsqldb,postgresql,没有默认值,必须指定该属性。
2.2 增加offsetAsPageNum属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,使用RowBounds分页时,会将offset参数当成pageNum使用,可以用页码和页面大小两个参数进行分页。
2.3 增加rowBoundsWithCount属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,使用RowBounds分页会进行count查询。
2.4 增加pageSizeZero属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是Page类型)。
2.5 增加reasonable属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。具体作用请看上面配置文件中的注释内容。

  • 如何选择配置这些参数
    单独看每个参数的说明可能是一件让人不爽的事情,这里列举一些可能会用到某些参数的情况。
    首先dialect属性是必须的,不需要解释。其他的参数一般情况下我们都不必去管,如果想了解何时使用合适,你可以参考以下场景:

场景一
如果你仍然在用类似ibatis式的命名空间调用方式,你也许会用到rowBoundsWithCount,分页插件对RowBounds支持和Mybatis默认的方式是一致,默认情况下不会进行count查询,如果你想在分页查询时进行count查询,以及使用更强大的PageInfo类,你需要设置该参数为true。

场景二
如果你仍然在用类似ibatis式的命名空间调用方式,你觉得RowBounds中的两个参数offset,limit不如pageNum,pageSize容易理解,你可以使用offsetAsPageNum参数,将该参数设置为true后,offset会当成pageNum使用,limit和pageSize含义相同。

场景三
如果觉得某个地方使用分页后,你仍然想通过控制参数查询全部的结果,你可以配置pageSizeZero为true,配置后,如可以通过设置pageSize=0或者RowBounds.limit = 0就会查询出全部的结果。

场景四
如果你分页插件使用于类似分页查看列表式的数据,如新闻列表,软件列表,你希望用户输入的页数不在合法范围(第一页到最后一页之外)时能够正确的响应到正确的结果页面,那么你可以配置reasonable为true,这时如果pageNum<1会查询第一页,如果pageNum>总页数会查询最后一页。

  1. 在执行sql前添加插件,完成分页功能
public class TestPageHelper {

    @Test
    public void testPageHelper() {
        // 创建一个spring容器
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*");
        // 从spring容器中获取mapper代理对象
        TbItemMapper mapper = context.getBean(TbItemMapper.class);
        // 执行查询并分页,TbItemExample是逆向工程自动生成的,用来进行条件查询,这里不设置则表示无条件
        TbItemExample example = new TbItemExample();
        //分页处理,显示第一页的10条数据
        PageHelper.startPage(1, 10);
        List list = mapper.selectByExample(example);//查询
        // 取商品列表
        for(TbItem item : list) {
            System.out.println(item.getTitle());
        }
        // 取分页信息
        PageInfo pageInfo = new PageInfo(list);
        long total = pageInfo.getTotal(); //获取总记录数
        System.out.println("共有商品信息:" + total);
    }
}

特别注意:

3.1.PageHelper.startPage方法重要提示
只有紧跟在PageHelper.startPage方法后的第一个Mybatis的查询(Select方法)方法会被分页。

3.2.分页插件不支持带有for update语句的分页
对于带有for update的sql,会抛出运行时异常,对于这样的sql建议手动分页,毕竟这样的sql需要重视。

3.3.分页插件不支持关联结果查询

你可能感兴趣的:(Mybatis插件pagehelper)