Предисловие
Когда таблицы участвуют в веб -разработке, например, DataTable, возникнет потребность в пейджинге. Обычно мы делим методы пейджинга на два типа: подключение к фронту и обработка на заднем плане.
Фронт-эндж
Все записи (AJAX) в таблице данных запрашиваются за один раз, а затем кэшируются на передней части и рассчитанную счетную и логику пейджинг. Как правило, передние компоненты (такие как DataTable) будут обеспечивать действия под пейджингом.
Особенности: простые, очень подходящие для мелких веб-платформ; Проблемы производительности возникнут, когда объем данных будет большим, а время для передачи запросов и сети будет долгим.
Бэкэнд Парень
Укажите номер страницы (Pagenum) и размер каждой страницы (PageSize) в запросе AJAX. Бэкэнд запросит данные страницы и возвращает ее, и фронт отвечает только за рендеринг.
Особенности: более сложные; Узрение на производительности находится в производительности запроса MySQL, который, конечно, может быть оптимизирован и решен. Вообще говоря, веб -разработка использует этот метод.
Мы говорим о бэкэнд -странице.
MySQL поддержка страниц
Проще говоря, MySQL поддерживает страсть через лимит. Пожалуйста, смотрите пример ниже.
Использование ограниченного ключевого слова
Ограничение [смещение,] ряды
Offset - это смещение относительно первой строки (первая строка - 0), а ряды - это количество строк.
# Каждая страница имеет 10 записей, возьмите первую страницу и возвращайте первые 10 записей Select * From Tablea Limit 0,10;# Каждая страница имеет 10 записей, возьмите вторую страницу и верните 11 -ю запись, в 20 -ю запись, выберите * из ограничения Tablea 10,10;
Здесь я хочу упомянуть, что когда MySQL обрабатывает страницу:
Ограничение 1000,10 - отфильтроровать 1010 кусков данных, затем отбросьте первые 1000 штук и сохраните 10 штук. Когда смещение будет большое, производительность уменьшится.
Предел 100000,10 - будет отфильтровать 10 Вт+10 кусков данных, а затем отбросить первые 10 Вт. Если вы найдете проблемы с производительностью в странице, вы можете настроить их в соответствии с этой идеей.
Плагин плагина Mybatis PageHelper
При использовании Java Spring Development Mybatis является мощным инструментом для операций базы данных. Однако, имея дело с пейджингом, Mybatis не имеет никаких специальных методов. Как правило, вам необходимо написать оговорку о лимитере самостоятельно, чтобы реализовать его, что относительно дорого. К счастью, есть плагин PageHelper.
1. Зависимость точки
Я не буду упоминать конфигурацию Mybatis. Зависимости Пейджелпера заключаются в следующем. Если вам нужна новая версия, вы можете выбрать на Maven
<dependency> <groupid> com.github.pagehelper </GroupId> <ArtifactId> pageHelper </artifactid> <sersive> 4.1.4 </version> </gethyseriation>
2. Конфигурация Mybatis PageHelper
Откройте файл конфигурации Mybatis, обычно под пути ресурса. Меня зовут mybatis-config.xml.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Конфигурация doctype public "-// mybatis.org//dtd config 3.0 // en" "http://mybatis.org/dtd/mybatis-3-config.dtd"> configuration>? включить или отключить кеш. -> <Настройка name = "cacheenabled" value = "true"/> <!-включить или отключить ленивую загрузку глобально. При отключении все связанные объекты загружаются мгновенно. -> <Настройка name = "LazyLoadEnabled" value = "true"/> <!-Когда включено, объект с ленивым свойством загрузки полностью загружает любое свойство при ее вызове. В противном случае каждое свойство будет загружено по мере необходимости. -> <Настройка name = "AggrevessIvelazyLoading" value = "true"/> <!-Допустить ли один SQL возвращать несколько наборов данных (в зависимости от совместимости драйвера) по умолчанию: true-> <Настройка name = "MultiplerSelsEdsEntabled" value = "true"/> <! name = "usecolumnlabel" value = "true"/> <!- разрешить JDBC генерировать первичные ключи. Требуется поддержка привода. Если установить True, этот настройка заставит сгенерированный первичный ключ, некоторые диски несовместимы, но все еще могут быть выполнены. по умолчанию: false-> <Настройка name = "useGeneratedKeys" value = "true"/> <!-Укажите, как MyBatis автоматически отображает столбцы базовых таблиц данных. Нет: не скрывать частичное: часть полная: все-> <Настройка name = "AutompopingBehavior" value = "Частичный"/> <! операторы и обновления пакетов)-> <Настройка name = "defaultexeCutortype" value = "simple"/> <!-преобразовать поля с использованием номенклатуры верблюда. -> <настройка name = "mapunderscoretocamelcase" value = "true"/> <!-Установка локального сеанса диапазона кэша: Там будет оператор обмена данными: type when inserting a null value --> <setting name="jdbcTypeForNull" value="NULL"/></settings><plugins> <plugin interceptor="com.github.pagehelper.PageHelper"> <property name="dialect" value="mysql"/> <property name="offsetAsPageNum" value="false"/> <property name="rowBoundsWithCount" value="false"/> <property name="pageSizeZero" value="true"/> <property name="reasonable" value="false"/> <property name="supportMethodsArguments" value="false"/> <property name="returnPageInfo" value="none"/> </plugin></plugins></configuration>
На что вам нужно обратить внимание, так это конфигурация, связанная с PageHelper.
Если вы не загружаете файл конфигурации mybatis, то вы используете конфигурацию Mybatis по умолчанию. Как загрузить файл конфигурации mybatis?
Перейдите в конфигурацию DataSrouce.
При настройке SQLSessionFactory укажите файл конфигурации MyBatis Core и путь Mapper, код выглядит следующим образом
@Bean (name = "moonlightsqlSessionFactory") @primary public sqlSessionFactory MoonlightSqlSessionFactory (@qualifier ("MoonlightData") DataSource DataSource) вызывает исключение {sqlSessionFactorybean bean = new sqlSessionFactorybean ();); bean.setDataSource (DataSource); bean.setmapperlocations (новый PathmatchingResourcepatternResolver (). getResources ("ClassPath: mybatis-mapper/*. xml")); bean.setConfiglocation (новый ClassPathresource ("mybatis-config.xml")); return bean.getObject (); }иллюстрировать:
Настройка пути хранения mapper.xml находится в папке ресурса/mybatis-mapper
Файл mybatis-config.xml, настроенный здесь, находится под ресурсом/
3. Парень
Подготовьте mapper.xml, просто напишите один для теста, просто используйте один из проекта.
Этот запрос здесь является типичным запросом с несколькими кондиционами. Что нам нужно сделать, так это то, что на пневматизации записи, сопоставленные с несколькими условиями.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> mapper.org/dtd/mybatis-3-mapper.dtd"> mapper. namespace = "com.kangaroo.studio.moonlight.dao.mapper.moonlightmapper"> <resultmap id = "geoFencelist" type = "com.kangaroo.studio.moonlight.dao.model.geofence"> <vortructor> <idarg colune. id "javatype =" java jdbctype = "integer" /> <arg column = "name" javatype = "java.lang.string" jdbctype = "varchar" /> <arg column = "type" javatype = "java.lang.integer" jdbctype = "integer" /> <argav javaty javaty "jdbctype =" integer " /> <argav javatp jdbctype = "varchar" /> <arg column = "geo" javatype = "java.lang.string" jdbctype = "varchar" /> <arg column = "createTime" javatype = "java.lang.string" jdbctype = "varchar" /> <argebuld = "updateTime" javatype = "java.lang.string" jdbctype = "varchar"/> </constructor> </resultmap> <sql id = "base_column"> id, name, type, `group`, geo, createtime, updateTime </sql> <select =" QuerygeOfence " ParameterType = "com.kangaroo.studio.moonlight.dao.model.geofencequeryparam" resultmap = "geoFenceList"> SELECT <Cult RefID = "BASE_COLUMN"/> From Geofence, где 1 = 1 <if test = "type! = null" и type = #{typence} </if> <if test = "= null" и null "и type = #{if> <if test =" и "null" и null "и type = #{if test =" и "null" и null "и type = # concat ('%', #{name}, '%') </if> <if test = "group! = null"> и `group` like concat ('%', #{group}, '%') </if> <if test =" starttime! = null "> и CreateTime> = #{startTime} </if test =" endtime! = nullime> и nulletime> и endteTime} </if test = "nulltime> и nullime> и nulletime> и nulletime> и endtime} </if test = endtime! </if> </select> </mapper>Написать соответствующие методы в интерфейсе mapper.java
Список <Геофенса> QuerygeOfence (GeofenceQueryparam GeofenceQueryparam);
Сначала добавьте код страницы, а затем объясните позже
@Requestmapping (value = "/warg/Query", method = requestMethod.post) @Responsebody public Queryfence (@Requestbody GeofenceQueryparam GeofenceQueryparam) {try {integer pagenum = geofencequeryparam.getpagenum () = null? Integer pagesize = geofencequeryparam.getPagesize ()! = Null? GeofenceQueryparam.getPagesize (): 10; PageHelper.StartPage (Pagenum, PageSize); Список <Геофенса> List = MoonlightMapper.QuerygeOfence (GeofenceQueryparam); вернуть новый ответ (resultCode.success, «Запрос геофонов успех», список); } catch (Exception e) {logger.error ("Query Geofence не удалось", E); вернуть новый ответ (resultCode.Exception, «Query Geofence не удастся», NULL); }}иллюстрировать:
1. Преимущество PageHelper заключается в том, что страниц и mapper.xml полностью отделены. Метод реализации заключается в усилении процесса выполнения Mybatis в виде подключаемого модуля, добавив общее количество запросов и ограниченных запросов. Принадлежит физической странице.
2. Существует проблема безопасности, на которую вам необходимо обратить внимание, в противном случае это может привести к расстройству пейджинга. Я прямо вставил из этого блога здесь.
4. Когда это приведет к небезопасной пейджинге?
Метод PageHelper использует статический параметр Threadlocal, а параметры и потоки подкислителя связаны.
Пока вы можете убедиться, что метод PageHelper сразу же называется методом запроса MyBatis, это безопасно. Потому что PageHelper автоматически очищает храненный объект Threadlocal в наконец -то фрагмент.
Если исключение происходит перед входом исполнителя, поток будет недоступным, что является человеческой ошибкой (например, несоответствие между методом интерфейса и XML, что приведет к тому, что отображение не будет найдено). Эта ситуация не приведет к неправильному использованию потокового параметра из -за недоступности потока.
Но если вы напишете следующий код, это небезопасное использование:
PageHelper.StartPage (1, 10); List <Country> list; if (param1! = Null) {list = countrymapper.selectif (param1);} else {list = new ArrayList <Country> ();}В этом случае, поскольку у Param1 есть NULL, PageHelper будет создавать параметр пейджинга, но он не потребляется, и этот параметр останется в этом потоке. Когда этот поток снова используется, он может привести к методам, которые не должны быть подготовкой, чтобы потреблять параметры пейджинг, что приводит к необъяснимому подкидке.
Приведенный выше код должен быть написан следующим образом:
Список <Country> list; if (param1! = Null) {pageHelper.StartPage (1, 10); list = countrymapper.selectif (param1);} else {list = new ArrayList <Country> ();}Этот способ написания может обеспечить безопасность.
Если вы не чувствуете себя спокойно с этим, вы можете вручную очистить параметры пейджинга, хранящиеся в Threadlocal, которые можно использовать так:
Список <Country> list; if (param1! = Null) {pageHelper.StartPage (1, 10); try {list = countrymapper.selectall (); } наконец {pageHelper.clearpage (); }} else {list = new ArrayList <Country> ();}Это не хорошо писать так, и это не обязательно.
Суммировать
Выше приведено метод конфигурации и простого использования плагина Pagin Pagin Mybatis PageHelper, представленный вам редактором (рекомендуется). Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!