SSM整合之pageHelper实现分页
1.pageHelper介绍
PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql、oracle、mariaDB、DB2、SQLite、Hsqldb等。
本项目在 github 的项目地址:github
本项目在 gitosc 的项目地址:gitosc
2.前期配置
2.1 在pom.xml中添加依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
2.2 在applicationContext.xml中配置拦截器插件
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--pageHelper插件配置-->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个 -->
<props>
<prop key="helperDialect">oracle</prop>
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
3.分页的实现案例
3.1 Controller
@RequestMapping("/findAllByPage.do")
public ModelAndView findAllByPage(@RequestParam(name = "page", required = true, defaultValue = "1") int page, @RequestParam(name = "size", required = true, defaultValue = "4") int size) throws Exception {
List<Orders> ordersList = ordersService.findAllByPage(page, size);
PageInfo pageInfo = new PageInfo(ordersList);
ModelAndView mv = new ModelAndView();
mv.addObject("pageInfo", pageInfo);
mv.setViewName("orders-page-list");
return mv;
}
Temp: 通过PageInfo的构造方法传入orders的数据。
3.2 Service
public List<Orders> findAllByPage(int page, int size) {
PageHelper.startPage(page,size);
return ordersDao.findAll();
}
Temp: PageHelper.startPage(page,size);代码段必须在执行dao层代码之前,否则将不能实现分页功能。
3.3 Dao
@Select("select * from orders")
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "orderNum", property = "orderNum"),
@Result(column = "orderTime", property = "orderTime"),
@Result(column = "orderStatus", property = "orderStatus"),
@Result(column = "peopleCount", property = "peopleCount"),
@Result(column = "payType", property = "payType"),
@Result(column = "orderDesc", property = "orderDesc"),
@Result(column = "productId", property = "product", javaType = Product.class, one = @One(select = "com.itheima.ssm.dao.IProductDao.findById"))
})
public List<Orders> findAll();
Temp: 简单的查询语句
3.4 jsp相关页面
3.4.1 aside.jsp
<a href="${pageContext.request.contextPath}/orders/findAllByPage.do?page=1&size=4">
<i class="fa fa-circle-o"></i> 订单管理 </a>
3.4.2 orders-page-list.jsp
- 导入jsp标签库
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
2.找到分页的代码进行修改
<div class="box-tools pull-right">
<ul class="pagination">
<li>
<a href="${pageContext.request.contextPath}/orders/findAllByPage.do?page=1&size=${pageInfo.pageSize}" aria-label="Previous">首页</a>
</li>
<li><a href="${pageContext.request.contextPath}/orders/findAllByPage.do?page=${pageInfo.pageNum-1}&size=${pageInfo.pageSize}">上一页</a></li>
<c:forEach begin="1" end="${pageInfo.pages}" var="pageNum">
<li><a href="${pageContext.request.contextPath}/orders/findAllByPage.do?page=${pageNum}&size=${pageInfo.pageSize}">${pageNum}</a></li>
</c:forEach>
<li><a href="${pageContext.request.contextPath}/orders/findAllByPage.do?page=${pageInfo.pageNum+1}&size=${pageInfo.pageSize}">下一页</a></li>
<li>
<a href="${pageContext.request.contextPath}/orders/findAllByPage.do?page=${pageInfo.pages}&size=${pageInfo.pageSize}" aria-label="Next">尾页</a>
</li>
</ul>
</div>
**Temp:**通常来说我们在最后一页的页面点击下一页是不能实现的,原始的分页代码在下一页和上一页会加上jstl的判断语句,但是pageHelper很好的解决了这个问题,即在配置时添加了这段代码
<prop key="reasonable">true</prop>
3.实现选择每页显示的记录条数
总共${pageInfo.pages}页,共${pageInfo.total} 条数据。 每页
<select class="form-control" id="changePageSize" onchange="changePageSize()">
<c:forEach begin="1" end="${pageInfo.total}" var="pageSize">
<option <c:if test="${pageInfo.pageSize == pageSize}">selected</c:if>>
${pageSize}
</option>
</c:forEach>
</select> 条
function changePageSize() {
//获取下拉框的值
var pageSize = $("#changePageSize").val();
//向服务器发送请求,改变没页显示条数
location.href = "${pageContext.request.contextPath}/orders/findAllByPage.do?page=1&size="
+ pageSize;
}