SpringBoot整合Mybatis分页功能

注:本文章为上课笔记,并非原创,如有问题可以发送邮件[email protected],如有侵权会立刻撤销

SpringBoot 整合 mybatis-pagehelper

1.引入分页插件依赖



    com.github.pagehelper
    pagehelper-spring-boot-starter
    1.2.12

2.配置yml

# 分页插件配置
pagehelper:
  helperDialect: mysql
  supportMethodsArguments: true

3.使用分页插件,在查询前使用分页插件,原理:统一拦截sql,为其提供分页功能

/**
 * page: 第几页
 * pageSize: 每页显示条数
 */
PageHelper.startPage(page, pageSize);

4.调用查询之后,将数据封装到自带的分页对象中

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 ...... ......

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

订单信息关联查询结果集VO
订单编号 订单商品表主键 总价格 下单日期 商品名称 单价 ......
订单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是否用的是子查询

你可能感兴趣的:(SpringBoot,Java架构师体系,Mybatis,mybatis)