Если вы также используете MyBatis, рекомендуется попробовать этот плагин подкачки, который должен бытьНаиболее удобноПлагин пагинации для использования.
Необходимость в плагинах пагинации
В интернет-приложениях пейджинг можно описать везде, а тень пейджинга можно найти в любом месте, где нужно отобразить данные. В повседневной разработке в погоне за эффективностью обычно используется физическое разбиение базы данных на страницы. В настоящее время для бизнес-логики SQL в большинстве случаев необходимо выводить две части SQL для достижения эффекта пейджинга: общее количество запросов count и лимит пейджинга, что, несомненно, сильно увеличивает нагрузку. Для такого большого количества похожего кода, не относящегося к бизнес-логике, абстрагирование общих плагинов является обязательным.
Принцип работы плагина пейджинга
Mybatis предоставляет разработчикам интерфейс перехватчика.Поскольку этот интерфейс реализован, некоторые пользовательские операции могут выполняться до того, как Mybatis выполнит SQL. На этой основе разработан плагин подкачки.Для SQL, который нуждается в подкачке, плагин будет перехватывать и генерировать две части SQL. Возьмем простой пример:
Чистый SQL:
select * from table where a = '1'
Общее количество запросов после перехвата SQL:
select count(*) from table where a = '1'
Пейджинг SQL после перехвата:
select * from table where a = '1' limit 5,10
Таким образом, нам нужно только разработать исходный SQL в соответствии с бизнес-логикой, и нам не нужно заботиться о влиянии синтаксиса подкачки на исходный SQL — перехватчик уже обработал это за нас. Для получения дополнительной информации о перехватчиках см.:
- Исходный код QueryInterceptor
- Расширенное руководство по Executor Interceptor — спецификация QueryInterceptor
поддерживаемые базы данных
Плагин в настоящее время поддерживает физическое разбиение по страницам для следующих баз данных:
- Oracle
- Mysql
- MariaDB
- SQLite
- Hsqldb
- PostgreSQL
- DB2
- SqlServer(2005,2008)
- Informix
- H2
- SqlServer2012
- Derby
- Phoenix
Интеграция со SpringMVC
Зависимости Maven
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.0</version>
</dependency>
Файл конфигурации Spring
Просто нужно настроить mybatis в оригиналеSqlSessionFactoryBean
Вы можете добавить конфигурацию плагина пейджинга в нужное место. Конкретные различия см. в следующем сравнении:
Первоначальная конфигурация:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dynamicDataSource"/>
<property name="mapperLocations">
<list>
<value>classpath:mapper/*.xml</value>
<value>classpath:mapper/*/*.xml</value>
</list>
</property>
</bean>
Плюс конфигурация плагина пейджинга:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dynamicDataSource"/>
<property name="mapperLocations">
<list>
<value>classpath:mapper/*.xml</value>
<value>classpath:mapper/*/*.xml</value>
</list>
</property>
<!-- 配置分页插件 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
helperDialect=postgresql
reasonable=true
</value>
</property>
</bean>
</array>
</property>
</bean>
Видно, что только что добавил<property name="plugins">
Конфигурация. существует<property name="properties">
Вы можете настроить параметры подкачки в, как правило, настроить тип базы данныхhelperDialect
Вот и все. Полные параметры следующие:
<!-- 该参数默认为false -->
<!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
<!-- 和startPage中的pageNum效果一样-->
<property name="offsetAsPageNum" value="true"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="true"/>
<!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
<!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
<property name="pageSizeZero" value="true"/>
<!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
<!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
<!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
<property name="reasonable" value="true"/>
<!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
<!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 -->
<property name="params" value="pageNum=start;pageSize=limit;pageSizeZero=zero;reasonable=heli;count=contsql"/>
Использовать код
Статический метод PageHelper.startPage можно вызвать перед методом Mybatis, который необходимо разбить на страницы.Первый метод запроса Mybatis сразу после этого метода будет выгружен на страницы, а затем подключаемый модуль подкачки инкапсулирует информацию о подкачке вPageInfo
середина.
// startPage(第几页, 多少条数据)
PageHelper.startPage(pageIndex, pageSize);
// Mybatis查询方
List<InstanceVO> list = instanceDao.select(instance);
// 用PageInfo对结果进行包装
PageInfo pageInfo = new PageInfo(list);
С помощью этого неинвазивного метода для исходного SQL можно получить эффект пейджинга и подробную информацию пейджинга. PageInfo содержит очень подробные свойства разбиения на страницы:
public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow和endRow不常用,这里说个具体的用法
//可以在页面中"显示startRow到endRow 共size条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//第一页
private int firstPage;
//前一页
private int prePage;
//下一页
private int nextPage;
//最后一页
private int lastPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
...
}
конкретный пример
Чистый SQL:
select
id,name,create_time,create_user_id,update_time,update_user_id,is_delete
from xxx.aaa
where
( is_delete = ? )
Перехваченный SQL (полученный из информации журнала Mybatis):
# count
select count(0) from xxx.aaa WHERE (is_delete = ?)
# 分页
select
id,name,create_time,create_user_id,update_time,update_user_id,is_delete
from xxx.aaa
where
( is_delete = ? ) LIMIT 3
Возвращенные данные json:
возвращать данные с пользовательским классомResult
инкапсулировать,models
бизнес-данные,paging
является пейджинговой информацией.
{
"models":[
{
"createTime":1508890619000,
"createUserId":"888888",
"id":3,
"isDelete":0,
"name":"【TEST】",
"updateTime":1512373972000,
"updateUserId":"888888"
},
{
"createTime":1508890619000,
"createUserId":"888888",
"id":4,
"isDelete":0,
"name":"bbb",
"updateTime":1508891132000,
"updateUserId":"888888"
},
{
"createTime":1508890619000,
"createUserId":"888888",
"id":5,
"isDelete":0,
"name":"ccc",
"updateTime":1508891132000,
"updateUserId":"888888"
}
],
"paging":{
"endRow":3,
"firstPage":1,
"hasNextPage":true,
"hasPreviousPage":false,
"isFirstPage":true,
"isLastPage":false,
"lastPage":5,
"navigateFirstPage":1,
"navigateLastPage":5,
"navigatePages":8,
"navigatepageNums":[1,2,3,4,5],
"nextPage":2,
"pageNum":1,
"pageSize":3,
"pages":5,
"prePage":0,
"size":3,
"startRow":1,
"total":15
},
"resultCode":"100",
"success":true,
"valid":true
}
Суммировать
При использовании плагина подкачки вам не нужно писать SQL подкачки и считать SQL в месте подкачки, и вам не нужно менять существующий бизнес-код.Вам нужно только вызвать строку кода перед выполнением SQL для реализации пейджинг и получить богатую пейджинговую информацию. Имея эту информацию о подкачке, внешний интерфейс может выбирать различные методы подкачки, что очень удобно!
Ссылаться на
- GitHub.com/помощник страницы/…
- git ee.com/free/моя гегемония…
- Уууууууууууууууууу магия шифров талант/не прошёл восхождение-проползти...
- Автор этой статьи: cipher
- Ссылка на эту статью: Уууууууууууууууууу магия шифров талант/не прошёл восхождение-проползти...
- Уведомление об авторских правах:Все статьи в этом блоге, если не указано иное, используютCC BY-NC-SA 4.0 CNсоглашение. Пожалуйста, укажите источник!