基于SpringBoot和Mybatis用两种方式实现分页查询

上一篇文章中封装了通用的返回结果、通用分页结果。本文具体记录一下如何基于Mybatis实现分页查询。
参考文章:
Github:pagehelper-spring-boot
Github:HowToUse.md
mybatis-plus分页查询三种方法
MyBatis-Plus分页插件

系列文章指路

系列文章-基于SpringBoot3创建项目并配置常用的工具和一些常用的类

文章目录

  • 1. PageHelper
    • 1.1 引入依赖
    • 1.2 yml配置
      • defaultCount
      • reasonable
      • pageSizeZero
    • 1.3 使用示例
      • 示例
      • 排序
  • 2. MybatisPlus 分页插件
    • 2.1插件配置
    • 2.2使用示例
      • 使用BaseMapper中的 selectPage
      • 使用IService中的 selectPage
      • 手写的sql实现分页
      • 排序

1. PageHelper

如果你也在用 MyBatis,建议尝试该分页插件,这一定是最方便使用的分页插件。这是作者对这款插件的评价,也是我对这款插件的评价。通过示例可以看到,几乎零配置,寥寥几行就实现了分页。

1.1 引入依赖

<dependency>
  <groupId>com.github.pagehelpergroupId>
  <artifactId>pagehelper-spring-boot-starterartifactId>
  <version>1.4.7version>
dependency>

1.2 yml配置

下述属性都有默认值,所以本步骤可以略过。
测试代码来源于 1.3使用示例

pagehelper:
  reasonable: false
  pageSizeZero: false
  defaultCount: true

defaultCount

用于控制默认不带 count 查询的方法中,是否执行 count 查询,默认 true
true
在执行查询sql前,先执行了count(0)操作查出了一共有多少条记录。
基于SpringBoot和Mybatis用两种方式实现分页查询_第1张图片
PageInfo page = new PageInfo<>(fruits);获取到的Pageinfo中包含准确的total为14.
基于SpringBoot和Mybatis用两种方式实现分页查询_第2张图片

false
可以发现未执行count(0)sqlsql1
PageInfo page = new PageInfo<>(fruits);获取到的Pageinfo,total为-1. 基于SpringBoot和Mybatis用两种方式实现分页查询_第3张图片

reasonable

分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。
{offset:-10,limit:10}: 实际查询的第一页

在这里插入图片描述
{offset:1000,limit:10}: 实际查询的最后一页

在这里插入图片描述

pageSizeZero

默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果。
{offset:0,limit:0}: 查询出了所有结果
基于SpringBoot和Mybatis用两种方式实现分页查询_第4张图片

1.3 使用示例

示例

也可以计算出pageNum,使用PageHelper.startPage()

offsetPage方法下的第一个查询sql 进行分页。

    @GetMapping("/pageQuery")
    @Operation(summary = "pageQuery", description = "分页查询")
    public Object pageQuery(@RequestParam(defaultValue = "0", value = "offset") int offset,
                            @RequestParam(defaultValue = "10", value = "limit") int limit) {
        PageHelper.offsetPage(offset,limit);
        List<Fruit> fruits = fruitService.list();
        PageInfo<Fruit> page = new PageInfo<>(fruits);
        PageResult<List<Fruit>> pageRes = new PageResult<>(page.getTotal(), fruits);
        return BaseResult.success(pageRes);
    }

排序

offsetPage()后紧跟一个orderBy即可

        PageHelper.offsetPage(offset, limit);
        if(StrUtil.isNotEmpty(sort)){
            PageHelper.orderBy(sort + " " + order);
        }
        List<Fruit> fruits = fruitService.list();

{offset:9,limit:4,sort:fr_name,order:ASC}

这里需要注意:sort 是数据库中对应的字段,而不是实体类中的矮驼峰形式。

在这里插入图片描述

2. MybatisPlus 分页插件

MybatisPlus 之前已经引入,详情见顶部的系列文章

2.1插件配置

新建配置类,引入分页插件。

@Configuration
public class YaMybatisPlusConfig {

    /**
     * 最新版
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

2.2使用示例

先使用行偏移量offset计算出pageNum

使用BaseMapper中的 selectPage

    @GetMapping("/pageQuery3")
    @Operation(summary = "pageQuery3", description = "分页查询-使用MybatisPlus分页插件 baseMapper")
    public Object pageQuery3(@RequestParam(defaultValue = "0", value = "offset") int offset,
                             @RequestParam(defaultValue = "10", value = "limit") int limit) {
        int pageNum = offset / limit + 1;
        Page<Fruit> page = new Page<>(pageNum, limit);
        fruitMapper.selectPage(page, new QueryWrapper<>());
        PageResult<List<Fruit>> pageRes = new PageResult<>(page.getTotal(), page.getRecords());
        return BaseResult.success(pageRes);
    }

{offset:9,limit:4}
查询第3页,页大小为4。
基于SpringBoot和Mybatis用两种方式实现分页查询_第5张图片

使用IService中的 selectPage

    @GetMapping("/pageQuery4")
    @Operation(summary = "pageQuery4", description = "分页查询-使用MybatisPlus分页插件 IService")
    public Object pageQuery4(@RequestParam(defaultValue = "0", value = "offset") int offset,
                             @RequestParam(defaultValue = "10", value = "limit") int limit) {
        int pageNum = offset / limit + 1;
        Page<Fruit> page = new Page<>(pageNum, limit);
        // fruitService.page(page);
        fruitService.page(page, new QueryWrapper<>());
        PageResult<List<Fruit>> pageRes = new PageResult<>(page.getTotal(), page.getRecords());
        return BaseResult.success(pageRes);
    }

{offset:9,limit:4}
查询第3页,页大小为4。
基于SpringBoot和Mybatis用两种方式实现分页查询_第6张图片

手写的sql实现分页

FruitMapper.java

  /**
   * 分页查询水果
   * @param pageInfo 分页参数
   * @param paramsMap 查询参数
   * @return IPage水果分页
   */
  IPage<Fruit> pageQueryFruit(Page<Fruit> pageInfo, Map<String, Object> paramsMap);

FruitMapper.xml

    <select id="pageQueryFruit" parameterType="map" resultType="com.ya.boottest.fruit.entity.Fruit">
       SELECT id, fr_code, fr_name, fr_price
       FROM fruit
       WHERE 1 = 1
    select>

FruitController.java

    @GetMapping("/pageQuery5")
    @Operation(summary = "pageQuery5", description = "分页查询-使用MybatisPlus分页插件 手写sql")
    public Object pageQuery5(@RequestParam(defaultValue = "0", value = "offset") int offset,
                             @RequestParam(defaultValue = "10", value = "limit") int limit) {
        int pageNum = offset / limit + 1;
        Page<Fruit> page = new Page<>(pageNum, limit);
        Map<String, Object> paramsMap = new HashMap<>();
        // 放入自己的查询条件
        fruitMapper.pageQueryFruit(page, paramsMap);
        PageResult<List<Fruit>> pageRes = new PageResult<>(page.getTotal(), page.getRecords());
        return BaseResult.success(pageRes);
    }

{offset:9,limit:4}
查询第3页,页大小为4。
在这里插入图片描述

排序

可以使用QueryWrapper.orderBy(), 也可以放到paramsMap中自己拼接。
本文介绍放到Page的OrderItem列表中这种方式

{offset:9,limit:4,sort:fr_name,order:DESC}

同样需要注意:sort 是数据库中对应的字段,而不是实体类中的矮驼峰形式。

        page.addOrder(new OrderItem(sort,"ASC".equals(order)));
        /* List orderItems = new ArrayList<>();
        orderItems.add(new OrderItem(sort,"ASC".equals(order)));
        page.addOrder(orderItems);*/

执行sql:
在这里插入图片描述
ps. 我个人更喜欢用PageHelper,可能是公司项目用,加上先入为主吧。


零落成泥碾作尘,只有香如故。

—— 陆游·南宋《卜算子·咏梅》

你可能感兴趣的:(Java,spring,boot,pageHelper,mybatis-plus,mybatis)