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

news2024/11/24 10:42:46

上一篇文章中封装了通用的返回结果、通用分页结果。本文具体记录一下如何基于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.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,可能是公司项目用,加上先入为主吧。


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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/703129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这会是下一代的 Java 程序员的技术栈吗?

Servlet 与 Reactive 技术栈 打开 Spring 的官方文档我们在 Reactive 一栏中可以看到下面的架构图&#xff0c;其中可以很明显的看到 Reactive 的技术栈跟 Servlet 技术栈是完全并行的。意思是说我们日常开发的 Servlet web 类型只是一半的内容&#xff0c;还有另外一半世界就…

TI AM64x开发板规格书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)

1 评估板简介 创龙科技TL64x-EVM是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 单/四核Cortex-R5F 单核Cortex-M4F多核处理器设计的高性能评估板&#xff0c;由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证&#xff0c;高性能低功耗&#xff0c;稳…

3.2C++抽象类

C 抽象类 C的抽象类是指至少包含一个纯虚函数的类&#xff0c;不能被实例化。 抽象类的作用是为了实现接口的统一规范&#xff0c;使得不同的子类可以通过实现相同的纯虚函数来实现不同的行为。 定义抽象类时&#xff0c;需要在类中至少包含一个纯虚函数。 抽象类不能被实例…

idea如何连接数据库

输入数据库的用户名和密码就行 Database这里些数据库的名字 快速打开数据库设计 这句话是说时区有问题&#xff1a;因为Mysql用的是美国时区&#xff0c;要搞成中国时区&#xff1a; set global time_zone8:00; 打开cmd窗口&#xff1a; 输入 mysql -u root -p 密码&…

MySql高级篇-006 MySQL架构篇-02MySQL的数据目录:数据库下的主要目录结构、文件系统如何存储数据

第02章_MySQL的数据目录 1.MySQL8的主要目录结构 # 查询名称叫做mysql的文件目录都有哪些[rootatguigu07 ~]# find / -name mysql安装好MySQL 8之后&#xff0c;我们查看如下的目录结构&#xff1a; 1.1 数据库文件的存放路径 MySQL数据库文件的存放路径&#xff1a;/var/…

华为手环8 六月免费表盘上线,让你的腕上表盘更丰富多彩

在如今这个科技与艺术相互融合的时代&#xff01;工程师们给华为手环8花粉朋友准备的6月这一期好看又免费表盘已经上线。你可以根据自己的审美&#xff0c;选择一款最适合自己的表盘&#xff0c;展现出自己的个性和品味。快来选择你的专属表盘&#xff0c;让华为手环8成为你独特…

移动WEB开发之rem适配布局

css基础&#xff08;一&#xff09;css基础&#xff08;一&#xff09;_上半场结束&#xff0c;中场已休息&#xff0c;下半场ing的博客-CSDN博客Emmet语法Emmet语法_上半场结束&#xff0c;中场已休息&#xff0c;下半场ing的博客-CSDN博客css基础&#xff08;二&#xff09;c…

途乐证券|股市里的游资是什么?有什么特点?

股市是一个充满风险和机会的地方&#xff0c;吸引了各类投资者的目光&#xff0c;游资就是其中一种。那么股市里的游资是什么&#xff1f;有什么特点&#xff1f;途乐证券也为大家准备了相关内容&#xff0c;以供参考。 股市里的游资是什么&#xff1f; 一般来说&#xff0c;股…

【JavaScript】使用qrcode生成二维码

QRCode简介&#xff1a; QRCode.js 是一个用于生成二维码的 JavaScript 库。主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库。 使用步骤&#xff1a; 点击下载&#xff1a;https://github.com/davidshimjs/qrcodejs 或者mirrors / davidshimjs / qrco…

selenium 自动化测试 1-如何搭建自动化测试环境,搭建环境过程应该注意的问题

目录 前言&#xff1a; 1、selenium的介绍 2、selenium的版本介绍 3. selenium工作原理 4. selenium安装 4.1 安装selenium 4.2 安装浏览器驱动 4.3 安装浏览器 4.4 验证安装结果 5. 浏览器基本操作 前言&#xff1a; 搭建Selenium自动化测试环境是进行Web应用程序自…

京东到家小程序-在性能及多端能力的探索实践 | 京东云技术团队

一、前言 京东到家小程序最初只有微信小程序&#xff0c;随着业务的发展&#xff0c;同样的功能需要支持容器越来越多&#xff0c;包括支付宝小程序、京东小程序、到家APP、京东APP等&#xff0c;然而每个端分开实现要面临研发成本高、不一致等问题。 为了提高研发效率&#…

关于栈和队列的几个题

思维导图&#xff1a; 1.匹配括号 题目如下&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以…

【灾报警主机联网问题】

火灾报警主机联网问题一直是各消防项目中的难点&#xff0c;特别是管廊等长距离通讯中&#xff0c;如何保证通讯信号长期稳定可靠的运行是需要工程重点解决的问题&#xff0c;而LCAN-FOBR系列环网冗余式CAN光纤转换器提供二路光通道和一路CAN通道&#xff0c;实现CAN与光纤之间…

基于ENVI的遥感影像的非监督分类

ENVI包括了ISODATA和K-Mean两种非监督分类方法。 ISODATA&#xff08;Iterative Self-Orgnizing Data Analysize Technique&#xff09;是一种重复自组织数据分析技术&#xff0c;计算数据空间中均匀分布的类均值&#xff0c;然后用最小距离技术将剩余像元进行迭代聚合&#x…

常见分子直径

He 0.26 H2 0.289 NO 0.317 CO2 0.33 Ar 0.34 O2 0.346 N2 0.364 CO 0.376 CH4 0.38 C2H4 0.39 Xe 0.396 C3H8 0.43 SO2 0.28 气体分子 分子直径/nm 水0.27&#xff5e;0.32 氨0.365&#xff5e;0.38 苯0.65&#xff5e;0.68 乙烷0.40&#xff5e;0.47 乙烯…

华为OD机试真题 Python 实现【快速开租建站】【2023Q1 200分】,附详细解题思路

一、题目描述 当前IT部门支撑了子公司颗粒化业务&#xff0c;该部门需要实现为子公司快速开租建站的能力&#xff0c;建站是指在一个全新的环境部署一套IT服务。 每个站点开站会由一系列部署任务项构成&#xff0c;每个任务项部署完成时间都是固定和相等的&#xff0c;设为1。…

项目——学生信息管理系统5

目录 教师模块功能的实现 创建一个 Teacher 实体类 创建 添加老师界面 AddTeacherFrm 注意创建成 JInternalFrame 类型 页面的制作 给添加按钮绑定事件 提供一个重置表单功能 回到 MainFrm 添加教师管理的按钮 给添加教师按钮绑定事件 测试添加教师功能 创建教师信息管…

Day8——操作系统基础windows

文章目录 操作系统基础操作系统的定义 什么是windows 操作系统基础 操作系统的定义 什么是windows

gin RouterGroup 方法概览

路由组 RouterGroup是gin 里面的路由组&#xff0c;主要作用是实现gin的路由。 RouterGroup是嵌套在了Engine内部&#xff0c;实际上调用Engine的get&#xff0c;post等方式就是RouterGroup的实现。 另外RouterGroup还实现了如下两个接口&#xff1a; Engine相当于RouterGrou…

【Shell】自定义传入参数

授权 cd /Users/lion/Downloads/shell-test-demos chmod ux *.sh#!/bin/bashprintHelp() {echo "-p pic (required) path for pic"exit 1 }while getopts p:h OPT; docase $OPT inp) path"$OPTARG" ;;esac done# check api_key exists if [ -z "$pat…