sky-take-out项目Mybatis的使用

分页查询

    public PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO) {PageHelper.startPage(categoryPageQueryDTO.getPage(),categoryPageQueryDTO.getPageSize());//下一条sql进行分页,自动加入limit关键字分页Page<Category> page = categoryMapper.pageQuery(categoryPageQueryDTO);return new PageResult(page.getTotal(), page.getResult());}

这段 Java 代码是一个典型的 分页查询方法,使用了 PageHelper(MyBatis 的分页插件)和 MyBatis 的 Mapper 接口 来实现分页查询功能。


🧩 一、代码逐行解析

public PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO) {
  • 定义一个名为 pageQuery 的方法,接收一个 CategoryPageQueryDTO 类型的参数,返回值为 PageResult
  • CategoryPageQueryDTO 是封装分页查询参数的 数据传输对象(DTO)
  • PageResult 是一个封装了分页结果(总记录数和当前页数据)的响应对象。

PageHelper.startPage(categoryPageQueryDTO.getPage(), categoryPageQueryDTO.getPageSize());
  • 这是 PageHelper 提供的静态方法,用于开启分页功能。
  • 它会拦截下一条 SQL 查询,并自动为其加上分页语句(如 LIMIT offset, pageSize)。
  • 参数说明:
    • getPage():当前页码(如第1页、第2页)
    • getPageSize():每页显示的记录数

⚠️ 注意:PageHelper.startPage() 只对紧随其后的第一条查询语句生效,所以一定要确保它在执行查询前调用。


Page<Category> page = categoryMapper.pageQuery(categoryPageQueryDTO);
  • 调用 categoryMapperpageQuery 方法执行数据库查询。
  • 返回值类型是 Page<Category>,这是 PageHelper 提供的一个分页对象,内部封装了:
    • 当前页的数据(List<Category>
    • 总记录数(total
    • 当前页码、每页大小等信息(PageHelper 内部使用)

return new PageResult(page.getTotal(), page.getResult());
  • 构造一个 PageResult 对象返回给前端:
    • page.getTotal():总记录数
    • page.getResult():当前页的数据列表(List<Category>

🧾 二、涉及类说明

1. PageHelper.startPage(...)(MyBatis 分页插件)
  • 来自:com.github.pagehelper.PageHelper
  • 功能:开启分页,自动为下一条 SQL 添加分页逻辑。
  • 依赖:需要在项目中引入 pagehelper-spring-boot-starter 或手动配置插件。
2. Page<T>(MyBatis 分页结果对象)
  • 来自:com.github.pagehelper.Page
  • 是一个 List<T> 的子类,额外封装了分页信息,如:
    • long getTotal():总记录数
    • int getPageNum():当前页码
    • int getPageSize():每页大小
3. CategoryPageQueryDTO
  • 是一个自定义的 查询参数封装类,通常包含如下字段:
      @Datapublic class CategoryPageQueryDTO implements Serializable {//页码private int page;//每页记录数private int pageSize;//分类名称private String name;//分类类型 1菜品分类  2套餐分类private Integer type;}
    
4. PageResult
  • 是一个通用的分页结果封装类,通常用于返回给前端,结构如下:
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class PageResult {private long total;         // 总记录数private List<?> records;    // 当前页数据
    }
    

📌 三、MyBatis Mapper 接口示例

public interface CategoryMapper {Page<Category> pageQuery(CategoryPageQueryDTO categoryPageQueryDTO);
}

对应的 XML SQL 示例:

    <!--    分页查询--><select id="pageQuery" resultType="com.sky.entity.Category">select * from category<where><if test="name != null and name != ''">and name like concat('%',#{name},'%')</if><if test="type != null">and type = #{type}</if></where>order by sort asc , create_time desc</select>

✅ 四、总结流程图

1. 接口接收分页参数 (Page, PageSize)↓
2. 调用 PageHelper.startPage(page, pageSize)↓
3. 执行 categoryMapper.pageQuery(dto) 查询↓
4. MyBatis + PageHelper 自动添加 LIMIT 分页语句↓
5. 查询结果返回 Page<Category> 对象↓
6. 构造 PageResult 返回给前端

✅ 五、注意事项

  1. PageHelper 仅对下一条 SQL 生效

    • 如果中间有其他 SQL 被执行,分页可能失效。
    • 例如:在 startPage() 后又执行了 select count(*),再执行主查询,可能导致分页失效。
  2. 不要在循环中使用 PageHelper

    • 可能导致分页混乱。
  3. PageHelper 与 MyBatis Plus 的 Page 对象不同

    • MyBatis Plus 使用 IPage,PageHelper 使用 Page,注意不要混淆。

✅ 六、推荐优化:使用 PageResult 封装更丰富的信息

public class PageResult {private long total;private int pageNum;private int pageSize;private int totalPages;private List<?> records;public PageResult(long total, List<?> records, int pageNum, int pageSize) {this.total = total;this.records = records;this.pageNum = pageNum;this.pageSize = pageSize;this.totalPages = (int) Math.ceil((double) total / pageSize);}// Getter / Setter
}

这样前端可以拿到:

  • 总页数
  • 当前页
  • 每页数量
  • 数据列表

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

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

相关文章

H3CNE小小综合实验

实验拓扑图实验需求 按照图示配置IP地址在SW1和SW2之间配置链路聚合增加链路带宽&#xff0c;提高可靠性PC5和PC6属于VLAN10&#xff0c; PC7和PC8属于VLAN20SW1和SW2属于二层交换机&#xff0c;SW3为三层交换机&#xff08;VLAN100用于对接R4&#xff09;,在交换机之间相连的链…

IP协议深入理解

一、什么是ip协议?1.1、ip协议是网络层协议&#xff0c;ip协议的本质工作是提供一种能力&#xff0c;把数据可靠的跨网络从主机A送到主机B&#xff1b;1.2、什么是ip&#xff1f;ip目标网络目标主机&#xff1b;画图图解:如图&#xff0c;当主机A想要把数据发给主机B时&#x…

接收表单数据:serialize()函数解析

一、form-serialize作用与引入 作用&#xff1a; form-serialize可以快速收集表单数据&#xff0c;按照使用者意愿转化为对象或字符串输出&#xff0c;以便于提交至服务器。 引入&#xff1a; form-serialize不是浏览器自带的JS方法&#xff0c;而是第三方工具库。可以直接通过…

vc配置使用预编译

预编译原理 stdafx.h中加入系统文件&#xff0c;减少cpp中对这些文件的解析&#xff0c;提高速度 stdafx.h 会把编译的文件生成pch&#xff0c;后续解析头文件直接调用pch里面的数据 配置 新建stdafx.h和stdafx.cpp文件 配置stdafx.cpp文件为/Yc 创建预编译文件整个项目设置/Yc…

反射机制的登录系统

一、实体层&#xff08;po层&#xff09; //UserInfo package com.hugeyurt.po;import java.sql.ResultSet; import java.sql.SQLException;public class UserInfo {private String userID;private String name;private int count;private Long errorTime;private String pwd;p…

装饰器模式及优化

装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种模式创建了一个装饰器类&#xff0c;用来包装原有的类&#xff0c;并在保持类方法签名完整性的前提下&#xff…

共指消解技术全解析:从语言学规则到深度学习(附论文精读)

精读威斯康星大学综述《Coreference Resolution: A Survey》&#xff0c;揭秘NLP中"实体链接"的核心技术一、什么是共指消解&#xff1f;为什么它是NLP的基石&#xff1f;共指消解(Coreference Resolution) 旨在识别文本中指向同一实体的不同表述。例如&#xff1a;t…

git配置git commit -m “fix 11,22: 修改bugid为11,22“

文章目录前言一、报错提示二、实现1.commitlint.config.js规范配置2. **修改正则表达式**&#xff1a;3. **移除 scope-case 规则**&#xff1a;4. **增强自定义规则逻辑**&#xff1a;测试结果&#xff1a;正则表达式详解&#xff1a;前言 提示&#xff1a;正常的配置git规范…

nastools继任者?极空间部署影视自动化订阅系统『MediaMaster』

nastools继任者&#xff1f;极空间部署影视自动化订阅系统『MediaMaster』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 对于我们NAS玩家来说&#xff0c;观影总是大家绕不开的一个执念&#xff0c;并且为观影的折腾大家也都是乐此不疲~ 曾经有一个非常绝绝子的观影神器摆在我们…

题解:CF1690G Count the Trains

思路&#xff1a; 首先我们可以理清一下各种情况&#xff1a;1&#xff09;m可能为02&#xff09;一次操作时&#xff0c;只需要考虑每节火车的车头。3&#xff09;当一节火车的速度降低时&#xff0c;只会影响它及它后面的车厢当m0时&#xff0c;我们可以记录上一节车头的速度…

CCF编程能力等级认证GESP—C++3级—20250628

CCF编程能力等级认证GESP—C3级—20250628单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)奇偶校验分糖果单选题&#xff08;每题 2 分&#xff0c;共 30 分…

2G和3G网络关闭/退网状态(截止2025年7月)

从能打语音电话的2G&#xff0c;到能发彩信、聊QQ的3G&#xff0c;这两项陪伴了我们数十年的通信技术&#xff0c;正在悄然退出历史舞台。近日&#xff0c;全球移动供应商协会&#xff08;GSA&#xff09;发布的《2025年7月2G和3G网络关闭报告》显示&#xff0c;全球已有超百个…

Day06_C语言网络编程20250718mobus重点

01.思维导图1 什么是 modbus他是一个在工控领域非常好用的通信写 modbus协议本质上是一个 基于 tcp 协议二次封装的一个协议 什么叫做基于tcp二次封装的协议&#xff1a;我们自己写的pack_t(无论静态还是动态)&#xff0c;都是属于二次封装的协议modbus协议是一种 “主从问答式…

比亚迪古德伍德亮相:从技术突破到文化对话

近日&#xff0c;比亚迪携腾势Z9GT、方程豹豹5、腾势D9亮相英国古德伍德速度节——全球最具声望的汽车文化盛典。方程豹豹5搭载全球首个 DMO电驱越野平台&#xff0c;在爬山赛道上展现出媲美性能跑车的动力响应与精准控制&#xff0c;彻底打破“越野必靠大排量燃油机”的西方传…

UniApp TabBar 用户头像方案:绕过原生限制的实践

需求场景&#xff1a; 在 UniApp 项目中&#xff0c;需要将 TabBar 首页项 (index) 的图标替换为当前用户的网络图片&#xff0c;并实现&#xff1a; 放大且圆形显示。点击该图标时&#xff0c;页面滚动回顶部。切换到其他分类时&#xff0c;首页 Tab 项恢复为普通首页图标。 尝…

如何阅读Spring源码

如何阅读Spring源码 简介 最近有许多人问我如何阅读Spring源码&#xff0c;那我便在这给出阅读源码的方法&#xff0c;能够保证本地能够让源码能够运行起来。 Spring 源码环境本地编译 Gradle下载地址 通过网盘分享的文件&#xff1a;gradle-6.4.1-all.zip 链接: https://pan.b…

Excel导出实战:从入门到精通 - 构建专业级数据报表的完整指南

文章目录Excel导出实战&#xff1a;从入门到精通 - 构建专业级数据报表的完整指南引言&#xff1a;ExcelJSFileSaver如何映射到Excel操作一、ExcelJS核心架构解析 - 从文件结构理解1. 工作簿(Workbook)模型 - 相当于整个Excel文件2. 工作表(Worksheet)配置 - 相当于单个工作表设…

PyTorch图像预处理全解析(transforms)

1. 引言在深度学习计算机视觉任务中&#xff0c;数据预处理和数据增强是模型训练的关键步骤&#xff0c;直接影响模型的泛化能力和最终性能表现。PyTorch 提供的 torchvision.transforms 模块&#xff0c;封装了丰富的图像变换方法&#xff0c;能够高效地完成图像标准化、裁剪、…

slam中的eskf观测矩阵推导

在之前的《slam中的eskf推导》一文中&#xff0c;没有写观测矩阵 H 矩阵的过程&#xff0c;现在补上这部分。前置列举几个等下推导需要用到的一些点&#xff1a;平面特征点构造观测矩阵例如在 fastlio 中&#xff0c;是利用平面特征点到拟合平面的距离来构造观测方程&#xff0…

Python_2

逻辑判断 首先得首先&#xff0c;我们想判断一个逻辑的正确与否&#xff0c;一定是需要一个能够表现出逻辑的词 如果我只说一个1 2&#xff0c;那么大家都不知道我在说什么但是如果我说1<2,那么大家就能判断这个语句的正确与否了 下面是几个常用的逻辑词 < 小于>大于&…