在学习jsp的时候,我用到了分页,那时候分页对于我来说很难,调试了大半天,不是这错就是那错,如今学了mybatis 和他的插件mybatis-pagehelper觉得分页简单了。
耐心看完,最后有完整的使用案例
1. 引入分页插件的依赖:
<!--pagehelper -->
<
dependency
>
<
groupId
>
com.github.pagehelper
</
groupId
>
<
artifactId
>
pagehelper-spring-boot-starter
</
artifactId
>
<
version
>
1.2.12
</
version
>
</
dependency
>
2.在.yml文件中添加:
# 分页插件配置
pagehelper:
helperDialect: mysql
supportMethodsArguments: true
3.
使用分页插件,在查询前使用分页插件,原理:统一拦截
sql
,为其提供分页功能:
/**
* page: 第几页
* pageSize: 每页显示条数
* 这两个参数都是由前端传来
*/
PageHelper
.
startPage
(
page
,
pageSize
);
4.
分页数据封装到
PagedGridResult.java 传给前端(
PagedGridResult 是自定义的,但也是通用的,会提供
):
PageInfo
<?>
pageList
=
new
PageInfo
<>
(
list
);
PagedGridResult grid
=
new
PagedGridResult
();
grid
.
setPage
(
page
); // 当前页数
grid
.
setRows
(
list
); //这个list是分页后的数据,是每行的数据
grid
.
setTotal
(
pageList
.
getPages
());
grid
.
setRecords
(
pageList
.
getTotal
());
/*****
看到4 中的代码你可能会迷:
1.PageInfo中的 total 表示: 总记录数 ,而 他的 records才 表示:总记录数
2.PageInfo 中的 page 表示: 总页数,而
PagedGridResult 中的 total 表示 总页数
*/
==================================================================
5.
PagedGridResult 类:
/**
*
* @Title: PagedGridResult.java
* @Package com.imooc.utils
* @Description: 用来返回分页Grid的数据格式
* Copyright: Copyright (c) 2019
*/
public class PagedGridResult {
private int page; // 当前页数
private int total; // 总页数
private long records; // 总记录数
private List<?> rows; // 每行显示的内容
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public long getRecords() {
return records;
}
public void setRecords(long records) {
this.records = records;
}
public List<?> getRows() {
return rows;
}
public void setRows(List<?> rows) {
this.rows = rows;
}
}
========================================================================
6. 使用案例:
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public PagedGridResult queryPagedComments(String itemId, Integer level,
Integer page,Integer pageSize) {
Map<String,Object>map =new HashMap<>();
map.put("itemId",itemId);
map.put("level",level);
/*** page: 第几页 * pageSize: 每页显示条数 */
PageHelper.startPage(page, pageSize);
List<ItemCommentVO> list=itemsMapperCustom.queryItemComments(map);
PageInfo<?> pageList = new PageInfo<>(list); //<>中就是 ? ,不是乱码,可以传任何类
PagedGridResult grid = new PagedGridResult();
grid.setPage(page);
grid.setRows(list);
grid.setTotal(pageList.getPages());
grid.setRecords(pageList.getTotal());
return grid;
}
================================================================================
7.如果你有很多地方要用到分页,也可以将其抽取出来:
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public PagedGridResult queryPagedComments(String itemId, Integer level,
Integer page,Integer pageSize) {
Map<String,Object>map =new HashMap<>();
map.put("itemId",itemId);
map.put("level",level);
/*** page: 第几页 * pageSize: 每页显示条数 */
PageHelper.startPage(page, pageSize);
List<ItemCommentVO> list=itemsMapperCustom.queryItemComments(map);
return setterPagedGrid(list,page);
}
private PagedGridResult setterPagedGrid(List<?>list,Integer page){
PageInfo<?> pageList = new PageInfo<>(list);
PagedGridResult grid = new PagedGridResult();
grid.setPage(page);
grid.setRows(list);
grid.setTotal(pageList.getPages());
grid.setRecords(pageList.getTotal());
return grid;
}
pageHelper 不支持 嵌套分页,会出现一些问题:
关于订单有三张表:订单表,订单状态表,订单关联商品表
比如说:查询订单信息,一个订单对应多个商品,这种情况:
不用分页一般是用一条sql语句:
od.id as orderId, od.created_time as createdTime, od.pay_method as payMethod, od.real_pay_amount as realPayAmount, od.post_amount as postAmount, os.order_status as orderStatus, oi.item_id as itemId, oi.item_name as itemName, oi.item_img as itemImg, oi.item_spec_name as itemSpecName, oi.buy_counts as buyCounts, oi.price as price FROM orders od LEFT JOIN order_status os on od.id = os.order_id LEFT JOIN order_items oi ON od.id = oi.order_id WHERE od.user_id = #{paramsMap.userId} AND od.is_delete = 0 <if test="paramsMap.orderStatus != null"> and os.order_status = #{paramsMap.orderStatus} </if> ORDER BY od.updated_time ASC
但是对于分页就不行了,
如何解决呢?答:先查询订单信息(order 和order_status先关联),再根据订单信息中的orderId 来查询对应的商品关联信息
resultMap中的collection中配置的select传递条件
<resultMap id="myOrdersVO" type="com.imooc.pojo.vo.MyOrdersVO"> <id column="orderId" property="orderId"/> <result column="createdTime" property="createdTime"/> <result column="payMethod" property="payMethod"/> <result column="realPayAmount" property="realPayAmount"/> <result column="postAmount" property="postAmount"/> <result column="orderStatus" property="orderStatus"/> <result column="isComment" property="isComment"/> <collection property="subOrderItemList" select="getSubItems" column="orderId" ofType="com.imooc.pojo.vo.MySubOrderItemVO"> <result column="itemId" property="itemId"/> <result column="itemName" property="itemName"/> <result column="itemImg" property="itemImg"/> <result column="itemSpecId" property="itemSpecId"/> <result column="itemSpecName" property="itemSpecName"/> <result column="buyCounts" property="buyCounts"/> <result column="price" property="price"/> </collection> </resultMap>
============================================================
<select id="queryMyOrders" resultMap="myOrdersVO" parameterType="Map"> SELECT od.id as orderId, od.created_time as createdTime, od.pay_method as payMethod, od.real_pay_amount as realPayAmount, od.post_amount as postAmount, os.order_status as orderStatus, od.is_comment as isComment FROM orders od LEFT JOIN order_status os on od.id = os.order_id WHERE od.user_id = #{paramsMap.userId} AND od.is_delete = 0 <if test="paramsMap.orderStatus != null"> and os.order_status = #{paramsMap.orderStatus} </if> ORDER BY od.updated_time ASC </select> ======================================================== <select id="getSubItems" parameterType="String" resultType="com.imooc.pojo.vo.MySubOrderItemVO"> select oi.item_id as itemId, oi.item_name as itemName, oi.item_img as itemImg, oi.item_spec_name as itemSpecName, oi.buy_counts as buyCounts, oi.price as price from order_items oi where oi.order_id = #{orderId} </select>