Изучили ли вы три метода пейджинга MyBatis? Серия MyBatis (6)

задняя часть MyBatis
Изучили ли вы три метода пейджинга MyBatis? Серия MyBatis (6)

«Эта статья участвовала в мероприятии Haowen Convocation Order, щелкните, чтобы просмотреть:Двойные заявки на внутреннюю и внешнюю стороны, призовой фонд в 20 000 юаней ждет вас, чтобы бросить вызов!"


Статьи по Теме

Краткое содержание серии MyBatis:Серия MyBatis


предисловие

  • Пейджинг — это препятствие, которое мы не можем обойти в процессе разработки! Когда у вас большой объем данных, нереально проверить все данные за один раз, поэтому мы обычно запрашиваем постранично, что снижает нагрузку на сервер и повышает скорость и эффективность! Это также снижает нагрузку на интерфейсный рендеринг!
  • Примечание. Поскольку максимальное целое число, разрешенное java, равно 2 147 483 647, максимальное целое число, которое может использовать ограничение, также равно 2 147 483 647. Извлечение большого объема данных за один раз может привести к переполнению памяти, поэтому используйте его с осторожностью в случаях запросов больших данных!

1. Ограничить пейджинг

  • грамматика:

    • limit ${startPos},${pageSize}
      
    • В реальных проектах мы обычно добавляем суждение null как пустое, как показано ниже:

    • <if test="startPos!=null and pageSize!=null">
          limit ${startPos},${pageSize}
      </if>
      
  • Код бизнес-уровня:

    •     <select id="getUserInfo1" parameterType="map" resultType="dayu">
              select * from user
              <if test="startPos!=null and pageSize!=null">
                  limit ${startPos},${pageSize}
              </if>
          </select>
      
    • List<User> getUserInfo1(Map<String,Object> map);
      
    • @Test
       public void selectUser() {
           SqlSession session = MybatisUtils.getSession();
           UserMapper mapper = session.getMapper(UserMapper.class);
           //这里塞值
            Map<String,Object> parms = new HashMap<>();
            parms.put("startPos","0");
            parms.put("pageSize","5");
           List<User> users = mapper.getUserInfo1(parms);
           for (User map: users){
               System.out.println(map);
          }
           session.close();
      }
      
  • Результаты:

    • image-20210708193554244.png
    • При переходе в 0, 10:
    • image-20210708193625536.png
  • Суммировать:

    • limit 0,10;
    • 0 означает начало с 0-х данных
    • 10 означает проверку 10 частей данных
    • Подождите, пока вторая страница не достигнет предела 10,10;
    • И так далее!
  • Это содержимое на самом деле является содержимым MySQL и не будет подробно объясняться.

2. Пейджинг RowBounds (не рекомендуется)

  • RowBounds помогает нам опустить содержимое limit, нам нужно только обратить внимание на пейджинг на бизнес-уровне! Не нужно передавать указанные данные!

  • Однако это относится к логическому пейджингу, то есть фактически все данные, запрашиваемые SQL, разбиваются на страницы в бизнес-слое, что занимает больше памяти, и обновление данных происходит несвоевременно, может быть определенный лаг! Не рекомендуется!

  • Объект RowBounds имеет 2 свойства: смещение и ограничение.

    • смещение: номер начальной строки

    • limit: необходимое количество строк данных

    • Следовательно, взятые данные: начиная со строки offset+1, возьмите строку limit

  • Код бизнес-уровня:

    • @Test
          public void selectUserRowBounds() {
              SqlSession session = MybatisUtils.getSession();
              UserMapper mapper = session.getMapper(UserMapper.class);
      //        List<User> users = session.selectList("com.dy.mapper.UserMapper.getUserInfoRowBounds",null,new RowBounds(0, 5));
              List<User> users = mapper.getUserInfoRowBounds(new RowBounds(0,5));
              for (User map: users){
                  System.out.println(map);
              }
              session.close();
          }
      
    • List<User> getUserInfoRowBounds(RowBounds rowBounds);
      
    • <select id="getUserInfoRowBounds" resultType="dayu">
              select * from user
      </select>
      
  • Выполните для просмотра результатов:

    • image-20210709112829473.png

3. Плагин подкачки Mybatis_PageHelper

  • Официальный адрес GitHubофициальный адрес

  • импортный пакет jar

    •     <dependency>
             <groupId>com.github.pagehelper</groupId>
             <artifactId>pagehelper</artifactId>
             <version>5.1.7</version>
          </dependency>
      
  • Настройте файл конфигурации ядра MyBatis

    •     <plugins>
              <plugin interceptor="com.github.pagehelper.PageInterceptor" />
          </plugins>
      
  • код бизнес-уровня

    • @Test
          public void selectUserPageHelper() {
              SqlSession session = MybatisUtils.getSession();
              UserMapper mapper = session.getMapper(UserMapper.class);
              //第二种,Mapper接口方式的调用,推荐这种使用方式。
              PageHelper.startPage(1, 3);
              List<User> list = mapper.getUserInfo();
              //用PageInfo将包装起来
              PageInfo page = new PageInfo(list);
              for (User map: list){
                  System.out.println(map);
              }
              System.out.println("page:---"+page);
              session.close();
          }
      
  • Результаты

    • image-20210709150537674.png
  • Суммировать

    • PageHelper по-прежнему очень полезен, и это также физическая подкачка страниц!

    • На самом деле мы вообще больше используем второй тип: вызов интерфейса Mapper

    • //第一种,RowBounds方式的调用
      List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
      
      //第二种,Mapper接口方式的调用,推荐这种使用方式。
      PageHelper.startPage(1, 10);
      List<User> list = userMapper.selectIf(1);
      
      //第三种,Mapper接口方式的调用,推荐这种使用方式。
      PageHelper.offsetPage(1, 10);
      List<User> list = userMapper.selectIf(1);
      
      //第四种,参数方法调用
      //存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
      public interface CountryMapper {
          List<User> selectByPageNumSize(
                  @Param("user") User user,
                  @Param("pageNum") int pageNum, 
                  @Param("pageSize") int pageSize);
      }
      //配置supportMethodsArguments=true
      //在代码中直接调用:
      List<User> list = userMapper.selectByPageNumSize(user, 1, 10);
      
      //第五种,参数对象
      //如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
      //有如下 User 对象
      public class User {
          //其他fields
          //下面两个参数名和 params 配置的名字一致
          private Integer pageNum;
          private Integer pageSize;
      }
      //存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
      public interface CountryMapper {
          List<User> selectByPageNumSize(User user);
      }
      //当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
      List<User> list = userMapper.selectByPageNumSize(user);
      
      //第六种,ISelect 接口方式
      //jdk6,7用法,创建接口
      Page<User> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
          @Override
          public void doSelect() {
              userMapper.selectGroupBy();
          }
      });
      //jdk8 lambda用法
      Page<User> page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy());
      
      //也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
      pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
          @Override
          public void doSelect() {
              userMapper.selectGroupBy();
          }
      });
      //对应的lambda用法
      pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());
      
      //count查询,返回一个查询语句的count数
      long total = PageHelper.count(new ISelect() {
          @Override
          public void doSelect() {
              userMapper.selectLike(user);
          }
      });
      //lambda
      total = PageHelper.count(()->userMapper.selectLike(user));
      
      • расширять

        • //获取第1页,10条内容,默认查询总数count
          PageHelper.startPage(1, 10);
          List<User> list = userMapper.selectAll();
          //用PageInfo对结果进行包装
          PageInfo page = new PageInfo(list);
          //测试PageInfo全部属性
          //PageInfo包含了非常全面的分页属性
          assertEquals(1, page.getPageNum());
          assertEquals(10, page.getPageSize());
          assertEquals(1, page.getStartRow());
          assertEquals(10, page.getEndRow());
          assertEquals(183, page.getTotal());
          assertEquals(19, page.getPages());
          assertEquals(1, page.getFirstPage());
          assertEquals(8, page.getLastPage());
          assertEquals(true, page.isFirstPage());
          assertEquals(false, page.isLastPage());
          assertEquals(false, page.isHasPreviousPage());
          assertEquals(true, page.isHasNextPage());
          
        • Этот метод очень удобен и быстр в использовании! Рекомендуемое использование!

        • Из-за ограниченного пространства невозможно продемонстрировать все варианты использования! Заинтересованные друзья могут проверить это сами!

        • По-тихому, я все равно попробовал их все, интегрировал Spring и добавил тест-перехватчик!


Впереди долгий путь, и я обязательно буду его искать вдоль и поперёк~

Если вы думаете, что я блогеры хорошо пишу! Писать нелегко, пожалуйста, ставьте лайки, подписывайтесь и комментируйте, чтобы поощрять блоггеров ~ хахах