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

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

系列文章指路👉

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

1. PageHelper

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

1.1 引入依赖

<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper-spring-boot-starter</artifactId>
  <version>1.4.7</version>
</dependency>

1.2 yml配置

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

pagehelper:
  reasonable: false
  pageSizeZero: false
  defaultCount: true

defaultCount

用于控制默认不带 count 查询的方法中,是否执行 count 查询,默认 true
true
在执行查询sql前,先执行了count(0)操作查出了一共有多少条记录。
在这里插入图片描述
PageInfo<Fruit> page = new PageInfo<>(fruits);获取到的Pageinfo中包含准确的total为14.
在这里插入图片描述

false
可以发现未执行count(0)sqlsql1
PageInfo<Fruit> page = new PageInfo<>(fruits);获取到的Pageinfo,total为-1. res1

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}: 查询出了所有结果
在这里插入图片描述

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。
在这里插入图片描述

使用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。
在这里插入图片描述

手写的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<OrderItem> orderItems = new ArrayList<>();
        orderItems.add(new OrderItem(sort,"ASC".equals(order)));
        page.addOrder(orderItems);*/

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


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

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

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot是一个用于构建Java应用程序的开源框架,它简化了Java开发过程,并提供了许多开箱即用的功能和特性。在Spring Boot中,实现分页查询可以通过使用Spring Data JPA和Pageable接口来实现。 首先,你需要在项目中引入Spring Data JPA依赖。在pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 接下来,创建一个数据访问对象(DAO)接口,并继承自JpaRepository接口。例如,你可以创建一个名为UserRepository的接口来操作用户数据: ```java import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Long> { } ``` 在你的服务类中,你可以注入UserRepository,并使用Pageable接口来实现分页查询。例如,你可以创建一个名为UserService的服务类: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @Service public class UserService { private final UserRepository userRepository; @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public Page<User> getUsers(Pageable pageable) { return userRepository.findAll(pageable); } } ``` 在控制器类中,你可以注入UserService,并使用Pageable参数来接收分页查询的参数。例如,你可以创建一个名为UserController的控制器类: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { private final UserService userService; @Autowired public UserController(UserService userService) { this.userService = userService; } @GetMapping("/users") public Page<User> getUsers(@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size) { PageRequest pageable = PageRequest.of(page, size); return userService.getUsers(pageable); } } ``` 以上代码示例中,我们通过GET请求的"/users"路径来获取用户列表,并可以通过page和size参数来指定分页查询的页码和每页大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小雅痞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值