当前位置:   article > 正文

mybatis&Mysql分页查询,以及SQL_CALC_FOUND_ROWS与count(*) 性能对比_mybatisconfig分页设置

mybatisconfig分页设置

温故而知新,这里记录一下

一、引言

        分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页。

        物理分页:

        相当于执行了limit分页语句,返回部分数据。物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性比较强,一般适用于数据量比较大,数据更新比较频繁的场景

        逻辑分页:

        一次性把全部的数据取出来,通过程序进行筛选数据。如果数据量大的情况下会消耗大量的内存,由于逻辑分页只需要读取数据库一次,不能获取数据库最新状态,实施性比较差,适用于数据量小,数据稳定的场合。

二、分页处理方式

2.1、MybatisPageHelper组件

        常用的分页组件有MybatisPageHelper等,分页原理为先执行原SQL+limit语句,再执行select count(*) from xxx where xxx语句。

        一共执行了两次,进行了两次数据的筛选和过滤

2.1.1、MybatisPlusConfig配置

创建MybatisPlusConfig配置类,需要配置分页插件,小编使用的Spring boot配置方式。

  1. /**
  2.  * @Auther: IT贱男
  3.  * @Date: 2019/6/12 15:06
  4.  * @Description: MybatisPlus配置类
  5.  */
  6. @Configuration
  7. public class MyBatisPlusConfig {
  8.  
  9.     /**
  10.      * 分页插件
  11.      * @return
  12.      */
  13.     @Bean
  14.     public PaginationInterceptor paginationInterceptor() {
  15.         return new PaginationInterceptor();
  16.     }
  17. }


2.1.2、具体分页实现

MP的Wrapper提供了两种分页查询的方式,源码如下:

  1. /**
  2.      * 根据 entity 条件,查询全部记录(并翻页)
  3.      *
  4.      * @param page         分页查询条件(可以为 RowBounds.DEFAULT
  5.      * @param queryWrapper 实体对象封装操作类(可以为 null
  6.      */
  7.     IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  8.  
  9.     /**
  10.      * 根据 Wrapper 条件,查询全部记录(并翻页)
  11.      *
  12.      * @param page         分页查询条件
  13.      * @param queryWrapper 实体对象封装操作类
  14.      */
  15.     IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

可见两个分页方法参数都是一致的,只是返回参数略有不同,具体选择根据实际业务为准。

  1.   /**
  2.      * 分页查询
  3.      */
  4.     @Test
  5.     public void selectByPage() {
  6.         QueryWrapper<User> wrapper = new QueryWrapper();
  7.         wrapper.like("name", "雨").lt("age", 40);
  8.  
  9.         Page<User> page = new Page<>(1,2);
  10.  
  11.         //IPage<User> userIPage = userMapper.selectPage(page, wrapper);
  12.  
  13.         IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, wrapper);
  14.  
  15.  
  16.         System.out.println("总页数"+mapIPage.getPages());
  17.         System.out.println("总记录数"+mapIPage.getTotal());
  18.         List<Map<String, Object>> records = mapIPage.getRecords();
  19.         records.forEach(System.out::println);
  20.     }

以上分页查询执行sql如下,先是查询了一次总记录数,然后在查询的数据。

  1. DEBUG==>  Preparing: SELECT COUNT(1) FROM user WHERE name LIKE ? AND age <
  2. DEBUG==> Parameters: %雨%(String), 40(Integer)
  3. TRACE<==    Columns: COUNT(1)
  4. TRACE<==        Row: 2
  5. DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? LIMIT ?,? 
  6. DEBUG==> Parameters: %雨%(String), 40(Integer), 0(Long), 2(Long)
  7. TRACE<==    Columns: id, name, age, email, manager_id, create_time
  8. TRACE<==        Row: 2, 张雨琪, 31, zjq@baomidou.com, 1088248166370832385, 2019-01-14 09:15:15
  9. TRACE<==        Row: 3, 刘红雨, 31, lhm@baomidou.com, 1088248166370832385, 2019-01-14 09:48:16
  10. DEBUG<==      Total: 2
  11. 总页数1
  12. 总记录数2

可以看出,质量量两条查询语句:

  • SELECT COUNT(1) FROM user WHERE name LIKE ? AND age < ?
  • SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? LIMIT ?,?

2.2、PageHelper组件

2.2.1. 添加 Maven 依赖

1
2
3
4
5
6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/858247
推荐阅读
相关标签
  

闽ICP备14008679号