pageHelper是国内非常优秀的一款开源的mybatis分页插件,他支持常用的数据库,例如MySQL、Oracle、SQLite等
1.添加pageHelper坐标:
<!-- mybatis提供的分页助手 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
2.配置mybatis的插件:
方式一,在applicationContext.xml里配置mybatis的pageHelper插件:
<!-- 配置SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!--配置分页助手-->
<property name="plugins">
<array>
<!-- 引入插件类型 -->
<bean class="com.github.pagehelper.PageInterceptor">
<!-- 指定使用的数据库-->
<property name="properties">
<!--因为分页插件支持多种数据库,需指明当前所用数据库 ,helperDialect mysql数据库(方言)-->
<props>
<prop key="helperDialect">mysql</prop>
</props>
</property>
</bean>
</array>
</property>
<!-- 引入sqlMapConfig.xml文件 -->
<property name="configLocation" value="classpath:sqlMapConfig.xml"></property>
<!-- 配置别名 -->
<property name="typeAliasesPackage" value="com.ld.domain"></property>
</bean>
方式二,在sqlMapConfig.xml里配置mybatis的pageHelper插件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入分页插件,不用指定数据库方言,mybatis自动选择-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
</configuration>
3.项目集成pageHelper:
控制层:
@Controller
@RequestMapping("/order")
public class OrderController {
@Autowired
OrderService orderService;
/**
* 分页助手--查询所有订单信息
* @param model
* @param currPage
* @param pageSize
* @return
*/
@RequestMapping("/findAll")
public ModelAndView findAll(ModelAndView model, @RequestParam(name = "currPage",defaultValue="1") Integer currPage,@RequestParam(name = "pageSize",defaultValue = "5") Integer pageSize){
PageInfo<Order> pageInfo = orderService.findByPageHelper(currPage, pageSize);
//将数据库查询结果封装到model
model.addObject("pageInfo",pageInfo);
//设置视图页面
model.setViewName("order-list");
return model;
}
}
业务层:
public interface OrderService {
/**
* 分页助手的查询方法
* @param currPage 当前页
* @param pageSize 每页显示的数据量
* @return
*/
PageInfo<Order> findByPageHelper(Integer currPage,Integer pageSize);
}
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
OrderDao orderDao;
@Override
public PageInfo<Order> findByPageHelper(Integer currPage, Integer pageSize) {
PageHelper.startPage(currPage,pageSize);//设置开始页
List<Order> list = orderDao.findAll();//获取所有订单信息
//创建PageInfo对象(参数1-list:所有订单信息集合,参数2-navigatePages:页面显示页码的数量)
PageInfo<Order> pageInfo = new PageInfo<>(list,3);
//打印观察pageHelper常用的API
System.out.println("当前页:"+pageInfo.getPageNum());
System.out.println("每页查多少:"+pageInfo.getPageSize());
System.out.println("总条数:"+pageInfo.getTotal());
System.out.println("总页数:"+pageInfo.getPages());
System.out.println("每页显示的数据:"+pageInfo.getList().size());
System.out.println("上一页页码:"+pageInfo.getPrePage());
System.out.println("下一页页码:"+pageInfo.getNextPage());
System.out.println("页面显示的第一个页码:"+pageInfo.getNavigateFirstPage());
System.out.println("页面显示的最后一个页码:"+pageInfo.getNavigateLastPage());
return pageInfo;
}
}
持久层:
public interface OrderDao {
//查询所有订单信息
List<Order> findAll();
}
<?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 namespace="com.ld.dao.OrderDao">
<resultMap id="base_map" type="order">
<id property="id" column="id"></id>
<result property="orderNum" column="orderNum"></result>
<result property="orderTime" column="orderTime"></result>
<result property="peopleCount" column="peopleCount"></result>
<result property="orderDesc" column="orderDesc"></result>
<result property="payType" column="payType"></result>
<result property="orderStatus" column="orderStatus"></result>
<!--关联属性-->
<association property="product" javaType="product">
<result property="productName" column="productName"></result>
</association>
</resultMap>
<select id="findAll" resultMap="base_map">
select o.*,p.productName from orders o left join product p on o.productid=p.id
</select>
</mapper>
PageInfo是一个分页工具类,里面的参数详细介绍,请参考:
order-list.jsp:
<!--数据列表-->
<table id="dataList"
class="table table-bordered table-striped table-hover dataTable">
<thead>
<tr>
<th class="" style="padding-right: 0px;"><input
id="selall" type="checkbox" class="icheckbox_square-blue">
</th>
<th class="sorting_asc">ID</th>
<th class="sorting">订单编号</th>
<th class="sorting">下单时间</th>
<th class="sorting">出行人数</th>
<th class="sorting">支付方式</th>
<th class="sorting">订单状态</th>
<th class="sorting">产品名称</th>
<th class="text-center">操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${pageInfo.list}" var="order">
<tr>
<td><input name="ids" type="checkbox"></td>
<td>${order.id}</td>
<td>${order.orderNum}</td>
<td>
<fmt:formatDate value="${order.orderTime}" pattern="yyyy-MM-dd HH:mm"/>
</td>
<td>${order.peopleCount}</td>
<td>
${order.payType=="0"?"支付宝":order.payType=="1"?"微信":"其他"}
<!--
<c:if test='${order.payType=="0"}'>支付宝</c:if>
<c:if test='${order.payType=="1"}'>微信</c:if>
<c:if test='${order.payType=="2"}'>其他</c:if>
-->
</td>
<td>${order.orderStatus=="0"?"未支付":"已支付"}</td>
<td>${order.product.productName}</td>
<td class="text-center">
<button type="button" class="btn bg-olive btn-xs"
onclick='location.href="${pageContext.request.contextPath}/pages/order-show.jsp"'>订单</button>
<button type="button" class="btn bg-olive btn-xs"
onclick='location.href="${pageContext.request.contextPath}/pages/order-show.jsp"'>查看</button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
<div class="box-footer">
<div class="pull-left">
<div class="form-group form-inline">
总共${pageInfo.pages} 页,共${pageInfo.total} 条数据。 每页
<%--如果切换下拉数字,默认从第1页开始显示--%>
<select class="form-control" id="pageSize" onclick="gotoPage(1)">
<%--value的值就是页面pageSize的值--%>
<option value="3">3</option>
<option value="5" selected="selected">5</option>
<option value="10">10</option>
<option value="15">15</option>
</select> 条
</div>
</div>
<div class="box-tools pull-right">
<ul class="pagination">
<li><a href="javascript:gotoPage(1)" aria-label="Previous">首页</a></li>
<li><a href="javascript:gotoPage(${pageInfo.prePage})">上一页</a></li>
<c:forEach begin="${pageInfo.navigateFirstPage}" end="${pageInfo.navigateLastPage}" var="i">
<li><a href="javascript:gotoPage(${i})">${i}</a></li>
</c:forEach>
<li><a href="javascript:gotoPage(${pageInfo.nextPage})">下一页</a></li>
<li><a href="javascript:gotoPage(${pageInfo.pages})" aria-label="Next">尾页</a></li>
</ul>
</div>
</div>
<script
src="${pageContext.request.contextPath}/plugins/jQuery/jquery-2.2.3.min.js"></script>
<script type="text/javascript">
//当选中下拉列表中的pageSize时,给当前<option>加上属性selected=selected
//组合选择器 id+元素+属性
$("#pageSize option[value=${pageInfo.pageSize}]").prop("selected","selected");
//分页相关内容
function gotoPage(currPage) {
//获取下拉列表中pageSize的值
var pageSize=$("#pageSize").val();
//判断控制页码范围
if (currPage<1){
return;//终止代码执行
}
if (currPage>${pageInfo.total}){
return;//终止代码执行
}
location.href="${pageContext.request.contextPath}/order/findAll?currPage="+currPage+"&pageSize="+pageSize;
}
</script>
效果:
这个分页助手虽然很nice,但是手动分页也需要掌握,熟悉实现原理
请参考: