Реализация пейджинга и использование PageHelper
При работе над проектом разбиение по страницам - очень распространенная небольшая функция, но обычно она имеет очень громоздкий пакет. Вот очень полезный подключаемый модуль - - - - подключаемый модуль разбиения по страницам pageHelper, который может удовлетворить основные потребности нашей работы. .
Введение в PageHelper
PageHelper - очень хороший плагин mybatis с открытым исходным кодом в Китае. Он поддерживает основные основные и часто используемые базы данных, такие как mysql, oracle, DB2, SQLite, Hsqldb и т
. Д. Адрес проекта этого проекта на github: https: // github. ru / pagehelper / Mybatis-PageHelper
Использование
конфигурации PageHelper Введение
Используйте Maven, чтобы добавить следующие зависимости в pom.xml.
Во-первых, вам нужно ввести соответствующие зависимости
<!--分页工具包-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
</dependency>
Соответствующая конфигурация выглядит следующим образом:
Обратите особое внимание на то, что новая версия перехватчика - com.github.pagehelper.PageInterceptor. com.github.pagehelper.PageHelper теперь является специальным классом реализации диалекта, который является классом реализации по умолчанию для подключаемого модуля разбиения на страницы, обеспечивающим то же использование, что и раньше.
1. Настройте плагин перехватчика в XML-файле конфигурации MyBatis.
<plugins>
<!-- com.github.pagehelper为PageInterceptor类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="reasonable" value="true"/>
</plugin>
</plugins>`
2. Настройте перехватчик в файле конфигурации Spring.
Вышеуказанная конфигурация также не может быть настроена в mybatis.xml или может быть настроена в SqlSessionFactoryBean в spring-mybatis.xml. Код выглядит следующим образом:
<!-- SqlSessionFactoryBean -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--分页插件配置-->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<!--配置分页属性-->
<property name="properties">
<props>
<!--指定数据库方言-->
<prop key="helperDialect">mysql</prop>
<!--合理化分页操作-->
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
Введение связанных параметров
Плагин
разбиения на страницы helperDialect автоматически обнаружит текущую ссылку на базу данных и автоматически выберет соответствующий метод разбиения на страницы. Вы можете настроить свойство helperDialect, чтобы указать, какой диалект использует плагин разбиения на страницы. При настройке вы можете использовать следующие сокращенные значения:
oracle, mysql, mariadb, sqlite, hsqldb, postgresql, db2, sqlserver, informix, h2, sqlserver201
Значение rowBoundsWithCount по умолчанию - false. Этот параметр действителен, когда RowBounds используется в качестве параметра разбиения на страницы. Если для этого параметра установлено
значение true, используйте разбиение на страницы RowBounds для выполнения запроса подсчета.
По
умолчанию pageSizeZero имеет значение false. Если для этого параметра задано значение true, будут запрашиваться все результаты, если pageSize = 0 или RowBounds.limit = 0 (эквивалентно отсутствию запроса страницы, но возвращаемый результат по-прежнему относится к типу страницы).
Разумный
параметр рационализации разбиения по страницам, значение по умолчанию - false. Если для этого параметра установлено значение true, первая
страница будет запрашиваться, когда pageNum <= 0, а последняя страница будет запрашиваться, когда pageNum> pages (когда общее количество превышено). Если по умолчанию установлено значение false, запрос выполняется непосредственно на основе параметров.
params
Для поддержки метода startPage (Object params), который увеличивает сопоставление параметров конфигурации для объекта в соответствии с атрибутами
аргумента имени, может быть настроено pageNum, pageSize, count, pageSizeZero, разумно, не настроено с сопоставленными значениями по умолчанию, значение по умолчанию is
pageNum = pageNum; pageSize = pageSize; count = countSql; разумный = разумный; pageSizeZero = pageSizeZero
Использование плагина подкачки
Использовать подключаемый модуль разбиения по страницам очень просто. После настройки вы можете напрямую вызвать статический метод startPage PageHelper, чтобы выполнить разбиение на страницы. Другие запросы можно написать как обычно. Обратите внимание, что метод вызова startPage должен быть написан перед запрос selectAll (), иначе разбиение на страницы недопустимо.
/**
* 分页测试
*/
@Test
public void testPage(){
//page 当前页 size 每页显示多少条
int page = 1,size=10;
//分页处理,只需要调用PageHelper.startPage静态方法即可。
PageHelper.startPage(page,size);
//必须写在要真正执行的代码之前
//startPage的方法必须写在执行查询selectAll()前面
//查询
List<Brand> brands = brandMapper.selectAll();
//获取分页信息,注意这里传入了brands集合对象
PageInfo<Brand> pageInfo = new PageInfo<Brand>(brands);
System.out.println(pageInfo);
}
Примеры следующие
aside.jsp
<li id="system-setting"><a
href="${pageContext.request.contextPath}/orders/findAll.do?page=1&size=4"> <i
class="fa fa-circle-o"></i> 订单管理
</a></li>
Уровень контроллера OrdersController.java
Controller
@RequestMapping("/orders")
public class OrdersController {
@Autowired
private IOrdersService ordersService;
//查询全部订单---未分页
// @RequestMapping("/findAll.do")
// public ModelAndView findAll() throws Exception {
// ModelAndView mv = new ModelAndView();
// List<Orders> ordersList = ordersService.findAll();
// mv.addObject("ordersList", ordersList);
// mv.setViewName("orders-list");
// return mv;
// }
@RequestMapping("/findAll.do")
//注意该默认的参数
public ModelAndView findAll(@RequestParam(name = "page", required = true, defaultValue = "1") int page, @RequestParam(name = "size", required = true, defaultValue = "4") int size) throws Exception {
ModelAndView mv = new ModelAndView();
List<Orders> ordersList = ordersService.findAll(page, size);
//PageInfo就是一个分页Bean 重新封装
PageInfo pageInfo=new PageInfo(ordersList);
mv.addObject("pageInfo",pageInfo);
//通过modelAndview跳转到相关界面
mv.setViewName("orders-page-list");
return mv;
}
}
уровень обслуживания
@Service
@Transactional
public class OrdersServiceImpl implements IOrdersService {
@Autowired
private IOrdersDao ordersDao;
@Override
public List<Orders> findAll(int page, int size) throws Exception {
//参数pageNum 是页码值 参数pageSize 代表是每页显示条数
//必须写在要真正执行的代码之前
PageHelper.startPage(page, size);
return ordersDao.findAll();
}
}
При
возврате данных отображается внешний интерфейс: orders-page-list.jsp
<tbody>
<c:forEach items="${pageInfo.list}" var="orders">
<tr>
<td><input name="ids" type="checkbox"></td>
<td>${orders.id }</td>
<td>${orders.orderNum }</td>
<td>${orders.product.productName }</td>
<td>${orders.product.productPrice }</td>
<td>${orders.orderTimeStr }</td>
<td class="text-center">${orders.orderStatusStr }</td>
<td class="text-center">
<button type="button" class="btn bg-olive btn-xs">订单</button>
<button type="button" class="btn bg-olive btn-xs" onclick="location.href='${pageContext.request.contextPath}/orders/findById.do?id=${orders.id}'">详情</button>
<button type="button" class="btn bg-olive btn-xs">编辑</button>
</td>
</tr>
</c:forEach>
</tbody>
```xml
Обратите внимание на тот факт, что PageInfo уже инкапсулирует для нас много информации, такой как общее количество страниц, общее количество записей, текущая страница и т. Д.
Обратите внимание на написание этого номера страницы
<div class="pull-left">
<div class="form-group form-inline">
总共2 页,共14 条数据。 每页
<!--注意onchange函数 选了某一个就会去调用相关函数-->
<select class="form-control" id="changePageSize" onchange="changePageSize()">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</select> 条
</div>
</div>
<div class="box-tools pull-right">
<ul class="pagination">
<li>
<!--重点注意${pageInfo.pageSize}动态获取-->
<a href="${pageContext.request.contextPath}/orders/findAll.do?page=1&size=${pageInfo.pageSize}" aria-label="Previous">首页</a>
</li>
<li>
<!--重点注意pageInfo.pageNum 表示当前页-->
<a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum-1}&size=${pageInfo.pageSize}">上一页</a></li>
<c:forEach begin="1" end="${pageInfo.pages}" var="pageNum">
<li>
<!--用a标签-->
<a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageNum}&size=${pageInfo.pageSize}">${pageNum}
</a></li>
</c:forEach>
<!--重点注意pageInfo.pageNum 表示当前页-->
<li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum+1}&size=${pageInfo.pageSize}">下一页</a></li>
<li>
<a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pages}&size=${pageInfo.pageSize}" aria-label="Next">尾页</a>
</li>
</ul>
</div>
</div>
<!--重点注意此function方法-->
function changePageSize() {
//获取下拉框的值
//会根据id获取到相应的值
var pageSize = $("#changePageSize").val();
//向服务器发送请求,改变没页显示条数
location.href = "${pageContext.request.contextPath}/orders/findAll.do?page=1&size="
+ pageSize;
}