MyBatis 分页(pagination)

1. 分页方式

  A. 逻辑分页:指一次性查询出符合要求的数据,然后从这些结果中检索需要的分页数据,优点是只访问一次,缺点是需要消耗大量的内存、有内存溢出的风险、对数据库压力较大且数据可能滞后,如使用RowBounds进行分页;

  B. 物理分页:指从数据库查询出指定条数的数据,优点是占用内存少,数据是最新的,缺点是每次都要访问数据库,如使用pagehelper工具;

 

2. 分页实现

  A. 数组分页:先查询出全部数据,然后用list.subList()方法截取需要的部分;

  B. RowBounds分页:先取出所有数据,然后游标移动到offset位置,循环取limit条数据,然后把剩下的数据丢弃,new RowBounds(pageIndex, pageSize);

  C. SQL分页:limit pageIndex, pageSize;

  D. Interceptor拦截器分页:分页插件的原理是使用MyBatis提供的插件接口(org.apache.ibatis.plugin.Interceptor),实现自定义插件,在插件的拦截方法内,拦截待执行的SQL,然后根据设置的方言dialect和设置的分页参数,重写SQL,生成带有分页语句的SQL,执行重写后的SQL,从而实现物理分页;

 

3. Pagehelper分页插件

  A. Maven依赖

    <!-- pagehelper mybatis分页 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.12</version>
        </dependency>

   B.  Java8 Stream流导致PageHelper失效问题,表现total统计错误(是list集合条数,而非总条数),改为for循环即可

 

4. MyBatis-Plus分页

  A. PaginationInterceptor分页插件

   B. 使用方式

 

5. 其它

  A. 基于游标分页:SELECT * FROM table_name LIMIT 10, 800 替换为 SELECT * FROM table_name WHERE id > 800 LIMIT 10,通过显示告知数据库最新行,数据库就确切地知道基于索引从哪里开始搜索,而不需要考虑目标范围之外的记录(全表扫描);

 

可参考:MyBatis框架分页的5种方式

posted @ 2020-03-29 17:52  如幻行云  阅读(1427)  评论(1编辑  收藏  举报