Mybatisplus多表关联分页查询有多种实现方式

Mybatisplus多表关联分页查询有多种实现方式

      • 1. 使用 MyBatis-Plus 配合 XML 自定义 SQL 实现多表关联分页查询
        • 实现步骤
        • 示例代码
          • 实体类定义
          • Mapper 接口定义
          • Mapper XML 编写多表关联查询
          • Service 调用分页查询
      • 2. 使用 MyBatis-Plus 的 `Wrapper` 搭配 `自定义 SQL` 实现分页查询
        • 示例代码
      • 3. 使用 MyBatis-Plus 配合 `Wrapper` 和 `关联查询 DTO` 实现分页查询
        • 示例代码
          • 定义查询结果的 DTO 类
          • 定义 `UserMapper` 的查询方法
          • Service 调用分页查询
      • 4. 使用 MyBatis-Plus 与 `PageHelper` 配合实现多表关联分页查询
        • 实现步骤
        • 示例代码
      • 总结

在 MyBatis-Plus 中,虽然没有直接支持多表关联查询的内置方法,但可以通过以下几种方式实现多表关联分页查询:

1. 使用 MyBatis-Plus 配合 XML 自定义 SQL 实现多表关联分页查询

这是最常用的方式,通过自定义 SQL 查询可以实现较复杂的关联查询,结合 MyBatis-Plus 的 IPage 接口,可以实现分页效果。

实现步骤
  1. 定义查询方法:在 Mapper 接口中定义分页查询方法。
  2. 编写 XML 查询语句:在 Mapper XML 文件中编写 SQL 查询,包括分页逻辑。
  3. 调用分页插件:在服务层调用分页查询方法。
示例代码
实体类定义

假设有两个实体类:UserOrder,我们想查询用户及其对应的订单列表。

@Data
public class User {private Long id;private String name;
}@Data
public class Order {private Long id;private Long userId;private String productName;
}
Mapper 接口定义

UserMapper 中定义分页查询方法:

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;public interface UserMapper extends BaseMapper<User> {IPage<User> selectUserOrders(Page<?> page, @Param("userId") Long userId);
}
Mapper XML 编写多表关联查询

UserMapper.xml 中定义多表关联 SQL 查询:

<select id="selectUserOrders" resultType="User">SELECT u.*, o.product_nameFROM user uLEFT JOIN order o ON u.id = o.user_idWHERE u.id = #{userId}
</select>
Service 调用分页查询
@Autowired
private UserMapper userMapper;public IPage<User> getUserOrders(Page<User> page, Long userId) {return userMapper.selectUserOrders(page, userId);
}

在调用此方法时传入 Page 对象,MyBatis-Plus 会自动处理分页参数。

Page<User> page = new Page<>(1, 10); // 分页参数:第1页,每页10条
IPage<User> result = userService.getUserOrders(page, 1L);

2. 使用 MyBatis-Plus 的 Wrapper 搭配 自定义 SQL 实现分页查询

可以通过 Wrapper 搭配 自定义 SQL 的方式实现关联查询并分页。此方法灵活,但需要自行编写 SQL 语句。

示例代码

UserMapper 中定义查询方法:

@Select("SELECT u.*, o.product_name " +"FROM user u LEFT JOIN order o ON u.id = o.user_id " +"WHERE u.id = #{userId}")
IPage<User> selectUserOrdersCustom(Page<?> page, @Param("userId") Long userId);

在 Service 层直接调用分页查询:

Page<User> page = new Page<>(1, 10); // 分页参数
IPage<User> result = userMapper.selectUserOrdersCustom(page, 1L);

3. 使用 MyBatis-Plus 配合 Wrapper关联查询 DTO 实现分页查询

使用 DTO(数据传输对象)作为查询结果,将查询到的字段映射到 DTO 中,减少数据库字段和实体类的耦合。

示例代码
定义查询结果的 DTO 类
@Data
public class UserOrderDTO {private Long userId;private String userName;private String productName;
}
定义 UserMapper 的查询方法
@Select("SELECT u.id AS userId, u.name AS userName, o.product_name AS productName " +"FROM user u LEFT JOIN order o ON u.id = o.user_id " +"WHERE u.id = #{userId}")
IPage<UserOrderDTO> selectUserOrderDTO(Page<?> page, @Param("userId") Long userId);
Service 调用分页查询
Page<UserOrderDTO> page = new Page<>(1, 10); // 分页参数
IPage<UserOrderDTO> result = userMapper.selectUserOrderDTO(page, 1L);

通过 DTO,将分页数据返回,避免直接使用实体类作为结果对象,可以增加查询的灵活性和复用性。

4. 使用 MyBatis-Plus 与 PageHelper 配合实现多表关联分页查询

虽然 MyBatis-Plus 自带分页插件,但在复杂的多表查询中,也可以结合 PageHelper 使用分页功能。

实现步骤
  1. 添加 PageHelper 依赖:

    <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.13</version>
    </dependency>
    
  2. 在查询方法中调用 PageHelper.startPage() 设置分页参数。

示例代码
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;public PageInfo<UserOrderDTO> getUserOrdersPage(int pageNum, int pageSize, Long userId) {PageHelper.startPage(pageNum, pageSize);List<UserOrderDTO> list = userMapper.selectUserOrderList(userId);return new PageInfo<>(list);
}

通过 PageHelper.startPage(pageNum, pageSize); 配置分页,然后使用 PageInfo 封装返回结果,获取分页数据。

总结

实现方式优点适用场景
XML 自定义 SQL灵活性高,可实现复杂的关联查询复杂 SQL 关联查询
Wrapper 自定义 SQL灵活性高,支持简单关联查询简单的多表关联查询
使用 DTO 与自定义 SQL减少实体类耦合,增加查询灵活性需要返回特定字段的查询
MyBatis-Plus + PageHelper 分页查询与 PageHelper 结合,可适应复杂分页场景复杂的关联分页查询

通过以上方法,您可以根据项目的需求和复杂度选择合适的多表关联分页查询方式。

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

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

相关文章

一些硬件知识【2024/11/2】

当需要提供功率型的输出信号的时候&#xff0c;可以在信号发生器外接功率放大器&#xff0c;这样可以提高输出功率 信号的调幅&#xff08;AM&#xff09;、调频&#xff08;FM&#xff09;与调相&#xff08;PM&#xff09;&#xff1a; 调制信号&#xff1a;控制高频振荡的低…

WPF自定义日历控件Calendar 的方法

推荐下载地址 https://www.haolizi.net/example/view_2107.html <UserControl.Resources><local1:DayConverter x:Key"DayConverter"/><!--导入转换器--><Style x:Key"CalendarStyle1"TargetType"{x:Type Calendar}">&…

Qt第三课 ----------输入类的控件属性

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Go如何实现自旋锁

自旋锁简介 在并发编程中&#xff0c;互斥锁&#xff08;Mutex&#xff09;是一种常用的同步机制&#xff0c;用于保护临界资源&#xff0c;防止数据竞争。而在某些特定场景下&#xff0c;尤其是当锁的持有时间很短且线程数量有限的情况下&#xff0c;一种更为轻量级的锁——自…

LabVIEW 离心泵机组故障诊断系统

开发了一套基于LabVIEW图形化编程语言设计的离心泵机组故障诊断系统。系统利用先进的数据采集技术和故障诊断方法&#xff0c;通过远程在线监测与分析&#xff0c;有效提升了离心泵的预测性维护能力&#xff0c;保证了石油化工生产的连续性和安全性。 项目背景及意义 离心泵作…

typescript的简介

简介 tsc npm install -g typescripttsc -v作用 检查类型和语法错误&#xff0c;提前纠错 ts的类型 如何穿件带有ts的vue工程 作用 常见类型 用法 编写一个ts文件 let username:string "John";let age:number 25;let isUpdated:boolean true;let data:any &q…

WPF+MVVM案例实战(二十)- 制作一个雷达辐射效果的按钮

文章目录 1、案例效果2、文件创建与代码实现1、创建文件2、图标资源文件3、源代码获取1、案例效果 2、文件创建与代码实现 1、创建文件 打开 Wpf_Examples 项目,在 Views 文件夹下创建窗体界面 RadarEffactWindow.xaml 。代码功能分两个部分完成,一个是样式,一个是动画。页…

5G学习笔记三之物理层、数据链路层、RRC层协议

5G学习笔记三之物理层、数据链路层、RRC层协议 物理层位于无线接口协议栈的最底层&#xff0c;作用&#xff1a;提供了物理介质中比特流传输所需要的所有功能。 1.3.1 传输信道的类型 物理层为MAC层和更高层提供信息传输的服务&#xff0c;其中&#xff0c;物理层提供的服务…

​Java面试经典 150 题.P13. 罗马数字转整数(012)​

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int romanToInt(String s) {int sum…

一键AI换衣-可图AI试衣

我们的真的实现了穿衣自由了吗&#xff1f;上传一张人物图片和衣服的图片&#xff0c;就能实现一键换衣。 这就是可图AI试衣项目 魔塔地址&#xff1a;https://www.modelscope.cn/studio ... lors-Virtual-Try-On 参考&#xff1a; 一键AI换衣-可图AI试衣 https://www.jinsh…

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…

ffmpeg+vue2

一、安装依赖 npm install ffmpeg/core ffmpeg/ffmpeg "ffmpeg/core": "^0.10.0", "ffmpeg/ffmpeg": "^0.10.1",二、配置ffmpeg 安装好插件以后&#xff0c;需要配置一下代码&#xff0c;否则会报错&#xff1a; 1、在vue.config.js…

奇瑞汽车:降阶模型在新能源汽车热管理仿真上的应用

随着新能源汽车的发展&#xff0c;对仿真技术的要求也越来越高。那么奇瑞汽车利用降阶模型在新能源汽车热管理仿真上做了哪些应用呢&#xff1f;本次内容主要从四个方面展开介绍&#xff1a; 1、 奇瑞汽车简介&#xff1b; 2、 热管理降阶模型开发的背景&#xff1b; 3、 高低…

ctf文件上传题小总结与记录

解题思路&#xff1a;先看中间件&#xff0c;文件上传点&#xff08;字典扫描&#xff0c;会员中心&#xff09;&#xff0c;绕过/验证&#xff08;黑名单&#xff0c;白名单&#xff09;&#xff0c;解析漏洞&#xff0c;cms&#xff0c;编辑器&#xff0c;最新cve 文件上传漏…

nginx上传文件超过限制大小、响应超时、反向代理请求超时等问题解决

1、文件大小超过限制 相关配置&#xff1a; client_max_body_size&#xff1a; Syntax:client_max_body_size size;Default:client_max_body_size 1m;Context:http, server, location 2、连接超时: proxy_read_timeout&#xff1a; Syntax:proxy_read_timeout time;Default…

11.02学习

一、获取字符串的方法 1. 使用 scanf 函数&#xff1a; scanf 函数可以用来从标准输入&#xff08;通常是键盘&#xff09;读取格式化的输入。例如&#xff1a; char str[100]; scanf("%s", str); 这会读取一个字符串直到遇到空格、制表符或换行符。 2. 使用 g…

00-开发环境 MPLAB IDE 配置

MPLAB IDE V8.83 File 菜单简介 New (CtrlN)&#xff1a; 创建一个新文件&#xff0c;用于编写新的代码。 Add New File to Project...&#xff1a; 将新文件添加到当前项目中。 Open... (CtrlO)&#xff1a; 打开现有文件。 Close (CtrlE)&#xff1a; 关闭当前打开的文件。 …

基于BP神经网络的手写体数字图像识别

基于BP神经网络的手写体数字图像识别 摘要 在信息化飞速发展的时代&#xff0c;光学字符识别是一个重要的信息录入与信息转化的手段&#xff0c;其中手写体数字的识别有着广泛地应用&#xff0c;如&#xff1a;邮政编码、统计报表、银行票据等等&#xff0c;因其广泛地应用范围…

vite和webpack

✨create-vite 和 vue-cli的区别 create-vite 和 vue-cli 都是 Vue 项目的脚手架工具&#xff0c;但它们在架构、构建速度、配置灵活性、插件生态等方面有明显的差异。 1. 基础架构和构建工具 create-vite&#xff1a;基于 Vite&#xff0c;使用原生 ES 模块&#xff08;ESM&…

鸿蒙进阶篇-Swiper组件的使用

“在科技的浪潮中&#xff0c;鸿蒙操作系统宛如一颗璀璨的新星&#xff0c;引领着创新的方向。作为鸿蒙开天组&#xff0c;今天我们将一同踏上鸿蒙基础的探索之旅&#xff0c;为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…