«Эта статья участвовала в мероприятии 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(); }
-
-
Результаты:
- При переходе в 0, 10:
-
Суммировать:
- 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>
-
-
Выполните для просмотра результатов:
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(); }
-
-
Результаты
-
Суммировать
-
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 и добавил тест-перехватчик!
-
-
-
Впереди долгий путь, и я обязательно буду его искать вдоль и поперёк~
Если вы думаете, что я блогеры хорошо пишу! Писать нелегко, пожалуйста, ставьте лайки, подписывайтесь и комментируйте, чтобы поощрять блоггеров ~ хахах