SpringBoot整合Mybatis分页功能

注:本文章为上课笔记,并非原创,如有问题可以发送邮件15735105314@163.com,如有侵权会立刻撤销

SpringBoot 整合 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.调用查询之后,将数据封装到自带的分页对象中

PageInfo<?> pageList = new PageInfo<>(list);

 PageInfo分页对象中包含,总数据量,总页数等多项与分页相关的数据,上面的操作将查询到的数据放入其中。代码如下:

@Transactional(propagation = Propagation.SUPPORTS)
    @Override
    public PagedGridResult queryPagedComment(String itemId, Integer level, Integer page, Integer pageSize) {
        Map<String, Object> paramsMap = new HashMap<String, Object>();
        paramsMap.put("itemId", itemId);
        paramsMap.put("level", level);
        PageHelper.startPage(page, pageSize);

        List<CommentVo> 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<CommentVo> list = itemsMapperCustom.queryItemComments(paramsMap);

PageInfo<?> pageList = new PageInfo<>(list);

 如果觉得Mybatis的分页对象数据太多,或者不满足自己的分页需求,可以自定义分页对象,将得到的Mybatis分页对象的有用数据移入到自定义分页对象中即可,个人觉得还是自定义一个为好,日后有什么相关需求也容易改一些,如果使用Mybatis分页对象后,日后有什么需要功能扩展的地方,自定义一个对象去继承Mybatis分页对象,也是可以的,及扩展了功能也不影响之前的代码。

注意:

分页插件不支持嵌套结果映射,由于嵌套结果方式会导致数据结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确,例如电商平台的用户中心,在用户查询订单信息的时候,假设每页会显示10条订单信息,由于每条订单会有一个或者多个商品,数据库在进行订单表和订单商品表关联查询的时候,会以订单商品表的记录为单位。

订单表
订单编号(主键)总价格下单日期.....
订单12002019-09-04 20:32:52......
订单22612019-06-02 21:42:32......
订单39872019-02-01 22:32:42......
订单43472019-07-09 21:22:12......
订单商品表
订单商品表主键订单主键商品名称单价......
1订单1name1............
2订单1name2............
3订单2name3............
4订单2name4............
5订单2name5............
6订单2name6............
7订单3name7............
8订单3name8............
9订单4name9............
10订单4name10............

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

订单信息关联查询结果集VO
订单编号订单商品表主键总价格下单日期商品名称单价......
订单112002019-09-04 20:32:52name1............
订单122002019-09-04 20:32:52name2............
订单232612019-06-02 21:42:32name3............
订单242612019-06-02 21:42:32name4............
订单252612019-06-02 21:42:32name5............
订单262612019-06-02 21:42:32name6............
订单379872019-02-01 22:32:42name7............
订单389872019-02-01 22:32:42name8............
订单493472019-07-09 21:22:12name9............
订单4103472019-07-09 21:22:12name10............

 

 

 

 

 

 

 

 

 

 

 

 

从上面的订单信息结果集中可以看出共有10条数据,如果前端指定分页大小为每页10条,那么当前结果集表的数据量刚好一页,如果还有其他订单数据就只能放入下一页了,但是我们要的是每页订单的数据量为10,而当前结果集中的订单数只有4条,但是数据库确实以每页10条进行了分割,这就是嵌套结果映射导致数据结果集被折叠,数据库查询出10条数据,但是映射之后只有4条数据。这种情况如何处理。

这里提出两种解决方案(解决方案很多,这里只说两种)

1、先在订单表中查询当前页的10条订单数据,之后在程序中利用这10条订单的主键查询出订单的对应的商品数据,在程序中对数据进行组装,或在后端一次性组装或在前端进行懒加载组装(例如淘宝的商品分类的子分类就是懒加载,鼠标放上去才会加载当前类的子类)。

2.利用resultMap中字标签collection的select属性和column属性,

待续,为什么翻页插件是对主select标签语句起作用,还有collection的select是否用的是子查询

SpringBoot整合MyBatis进行分页操作时,可以使用PageHelper插件来实现分页功能。首先需要添加相关依赖,例如在pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.2.0</version> </dependency> ``` 然后,在application.properties文件中配置PageHelper插件的相关参数: ```properties # 分页插件配置 pagehelper.helper-dialect=mysql pagehelper.params=count=countSql pagehelper.reasonable=true pagehelper.support-methods-arguments=true ``` 接下来,可以通过编写代码来实现分页功能。具体的实现方式根据个人需求的不同而有所区别。可以使用SQL分页,利用原生的SQL关键字limit来实现;也可以利用PageHelper插件来实现简单的分页操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SpringBoot整合MyBatis分页](https://blog.csdn.net/qq_51808107/article/details/131393594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [SpringBoot整合MyBatis四种常用的分页方式(详细总结)](https://blog.csdn.net/qq_45037155/article/details/128046032)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值