com.github.pagehelper
pagehelper-spring-boot-starter
1.2.12
# 分页插件配置
pagehelper:
helperDialect: mysql
supportMethodsArguments: true
/**
* page: 第几页
* pageSize: 每页显示条数
*/
PageHelper.startPage(page, pageSize);
PageInfo pageList = new PageInfo<>(list);
PageInfo分页对象中包含,总数据量,总页数等多项与分页相关的数据,上面的操作将查询到的数据放入其中。代码如下:
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public PagedGridResult queryPagedComment(String itemId, Integer level, Integer page, Integer pageSize) {
Map paramsMap = new HashMap();
paramsMap.put("itemId", itemId);
paramsMap.put("level", level);
PageHelper.startPage(page, pageSize);
List list = itemsMapperCustom.queryItemComments(paramsMap);
PageInfo pageList = new PageInfo<>(list);
//PagedGridResult grid = new PagedGridResult();
//grid.setPage(page);
// 数据脱敏处理
for(CommentVo comment : list){
comment.setNickname(DesensitizationUtil.commonDisplay(comment.getNickname()));
}
//grid.setRows(list);
//grid.setTotal(pageList.getPages());
//grid.setRecords(pageList.getTotal());
return setPagedGridResult(list, page);
}
public PagedGridResult setPagedGridResult(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;
}
上面代码只有下面三行是Mybatis分页相关的,其余都是自定义的一些其他的逻辑,
PageHelper.startPage(page, pageSize);
List list = itemsMapperCustom.queryItemComments(paramsMap);
PageInfo pageList = new PageInfo<>(list);
如果觉得Mybatis的分页对象数据太多,或者不满足自己的分页需求,可以自定义分页对象,将得到的Mybatis分页对象的有用数据移入到自定义分页对象中即可,个人觉得还是自定义一个为好,日后有什么相关需求也容易改一些,如果使用Mybatis分页对象后,日后有什么需要功能扩展的地方,自定义一个对象去继承Mybatis分页对象,也是可以的,及扩展了功能也不影响之前的代码。
注意:
分页插件不支持嵌套结果映射,由于嵌套结果方式会导致数据结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确,例如电商平台的用户中心,在用户查询订单信息的时候,假设每页会显示10条订单信息,由于每条订单会有一个或者多个商品,数据库在进行订单表和订单商品表关联查询的时候,会以订单商品表的记录为单位。
订单编号(主键) | 总价格 | 下单日期 | ..... |
订单1 | 200 | 2019-09-04 20:32:52 | ...... |
订单2 | 261 | 2019-06-02 21:42:32 | ...... |
订单3 | 987 | 2019-02-01 22:32:42 | ...... |
订单4 | 347 | 2019-07-09 21:22:12 | ...... |
订单商品表主键 | 订单主键 | 商品名称 | 单价 | ...... |
1 | 订单1 | name1 | ...... | ...... |
2 | 订单1 | name2 | ...... | ...... |
3 | 订单2 | name3 | ...... | ...... |
4 | 订单2 | name4 | ...... | ...... |
5 | 订单2 | name5 | ...... | ...... |
6 | 订单2 | name6 | ...... | ...... |
7 | 订单3 | name7 | ...... | ...... |
8 | 订单3 | name8 | ...... | ...... |
9 | 订单4 | name9 | ...... | ...... |
10 | 订单4 | name10 | ...... | ...... |
订单编号 | 订单商品表主键 | 总价格 | 下单日期 | 商品名称 | 单价 | ...... |
订单1 | 1 | 200 | 2019-09-04 20:32:52 | name1 | ...... | ...... |
订单1 | 2 | 200 | 2019-09-04 20:32:52 | name2 | ...... | ...... |
订单2 | 3 | 261 | 2019-06-02 21:42:32 | name3 | ...... | ...... |
订单2 | 4 | 261 | 2019-06-02 21:42:32 | name4 | ...... | ...... |
订单2 | 5 | 261 | 2019-06-02 21:42:32 | name5 | ...... | ...... |
订单2 | 6 | 261 | 2019-06-02 21:42:32 | name6 | ...... | ...... |
订单3 | 7 | 987 | 2019-02-01 22:32:42 | name7 | ...... | ...... |
订单3 | 8 | 987 | 2019-02-01 22:32:42 | name8 | ...... | ...... |
订单4 | 9 | 347 | 2019-07-09 21:22:12 | name9 | ...... | ...... |
订单4 | 10 | 347 | 2019-07-09 21:22:12 | name10 | ...... | ...... |
从上面的订单信息结果集中可以看出共有10条数据,如果前端指定分页大小为每页10条,那么当前结果集表的数据量刚好一页,如果还有其他订单数据就只能放入下一页了,但是我们要的是每页订单的数据量为10,而当前结果集中的订单数只有4条,但是数据库确实以每页10条进行了分割,这就是嵌套结果映射导致数据结果集被折叠,数据库查询出10条数据,但是映射之后只有4条数据。这种情况如何处理。
这里提出两种解决方案(解决方案很多,这里只说两种)
1、先在订单表中查询当前页的10条订单数据,之后在程序中利用这10条订单的主键查询出订单的对应的商品数据,在程序中对数据进行组装,或在后端一次性组装或在前端进行懒加载组装(例如淘宝的商品分类的子分类就是懒加载,鼠标放上去才会加载当前类的子类)。
2.利用resultMap中字标签collection的select属性和column属性,
待续,为什么翻页插件是对主select标签语句起作用,还有collection的select是否用的是子查询