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.rhkb.cn/news/462241.html

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

相关文章

【C/C++】qsort函数的学习与使用

零.导言 在之前的文章中&#xff0c;我介绍了冒泡排序&#xff0c;即按ASCII码值把元素从小到大排序&#xff08;文章链接我放在了第五部分&#xff0c;有兴趣的小伙伴可以求看看&#xff09;。而今天我将继续介绍qsort函数&#xff0c;这个函数可以起到和冒泡排序一样的作用&a…

华为实时视频使用FLV播放RTSP流

import flvjs from ‘flv.js’; 安装flv <video style"width:100%;height:100%;" ref"videoHWRef" ></video>// src 华为rtsp流 rtsp://admin:Huaweivideo10.10.8.151:554/xxx/trackID1// url 需要后端提供视频源地址playVideo() {if (fl…

【STM32】通过 DWT 实现毫秒级延时

目录 零、前言一、DWT1、DEMCR2、DWT_CTRL3、DWT_CYCCNT 二、实现代码三、测试 零、前言 在 FreeRTOS 中&#xff0c;SysTick 被用于作为调度器的一部分进行任务调度&#xff0c;那么如果我需要使用软件模拟通信&#xff0c;例如软件 I2C&#xff0c;需要使用 delay&#xff0…

如何在Linux系统中使用Ansible进行自动化部署

如何在Linux系统中使用Ansible进行自动化部署 Ansible简介 安装Ansible 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 启动Ansible服务 Ansible基本概念 Inventory Playbook Module 配置Ansible 测试Ansible配置 执行Ansible Playbook Ansible模块 文件模块 包管理模块…

「Mac畅玩鸿蒙与硬件20」鸿蒙UI组件篇10 - Canvas 组件自定义绘图

Canvas 组件在鸿蒙应用中用于绘制自定义图形,提供丰富的绘制功能和灵活的定制能力。通过 Canvas,可以创建矩形、圆形、路径、文本等基础图形,为鸿蒙应用增添个性化的视觉效果。本篇将介绍 Canvas 组件的基础操作,涵盖绘制矩形、圆形、路径和文本的实例。 关键词 Canvas 组件…

从零开始构建 ChatGPT

今天&#xff0c;我们要介绍的是一个名为 LLMs-from-scratch 的 GitHub 项目&#xff0c;它由开发者 rasbt 精心打造&#xff0c;旨在一步步教你如何使用 PyTorch 从零开始实现一个类似 ChatGPT 的大型语言模型&#xff08;LLM&#xff09;。 这是一个教育性质的开源项目&…

【Git】Git常用命令

目录 1 前言2 git命令2.1 branch2.2 checkout2.3 pull and push2.4 config2.4.1 Proxy 2.5 tag2.6 rebase2.7 patch2.8 remote2.9 submodule2.10 rm2.10 gitignore2.11 某个commit更改了哪些文件2.12 clean 3 结束语 1 前言 本章记录总结在使用git过程中常用的一些命令&#x…

redis分布式锁在项目中的应用总结

项目应用 应用1 redis分布式锁实现两个操作的原子性 需求&#xff1a;实现一人一单业务逻辑时&#xff08;如果能走到这个逻辑&#xff0c;代表库存是充足的&#xff09;&#xff0c;我们需要 先查询订单 如果订单不存在即没有买过则创建订单 这两个步骤我们要保证是原子…

前端 react 面试题(二)

文章目录 hooks的使用规则为什么hooks要确保在函数组件的最顶层,而不能放置在循环或者条件语句中。react的事件模型react的合成事件是如何实现的react事件传参,可以使用箭头函数或bind方法,这两种哪一种更好使用箭头函数:使用`bind`方法:react的事件模型和vue的区别React …

1分钟解决Excel打开CSV文件出现乱码问题

一、编码问题 1、不同编码格式 CSV 文件有多种编码格式&#xff0c;如 UTF - 8、UTF - 16、ANSI 等。如果 CSV 文件是 UTF - 8 编码&#xff0c;而 Excel 默认使用的是 ANSI 编码打开&#xff0c;就可能出现乱码。例如&#xff0c;许多从网络应用程序或非 Windows 系统生成的 …

【python】OpenCV—Tracking(10.4)—Centroid

文章目录 1、任务描述2、人脸检测模型3、完整代码4、结果展示5、涉及到的库函数6、参考 1、任务描述 基于质心实现多目标&#xff08;以人脸为例&#xff09;跟踪 人脸检测采用深度学习的方法 核心步骤&#xff1a; 步骤#1&#xff1a;接受边界框坐标并计算质心 步骤#2&…

GraphQL系列 - 第2讲 Spring集成GraphQL

目录 一、maven依赖二、Schema 定义三、代码集成3.1 创建模型类3.2 创建服务类3.3 创建控制器类 四、单元测试五、实际 HTTP 请求测试5.1 查询单个 Person5.2 查询所有 People5.3 添加 Person 六、其他6.1 开启graphiql6.2 开启schema查看端点 一、maven依赖 首先&#xff0c;…

Golang | Leetcode Golang题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; func countArrangement(n int) int {f : make([]int, 1<<n)f[0] 1for mask : 1; mask < 1<<n; mask {num : bits.OnesCount(uint(mask))for i : 0; i < n; i {if mask>>i&1 > 0 && (num%(i1) 0 |…

模拟栈的实现

栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出 LIFO &#xff08; Last In First Out &#xff09;的原则。 压栈&…

Win10搭建SFTP服务器

1、下载安装 Release v9.5.0.0p1-Beta PowerShell/Win32-OpenSSH GitHub 下载OpenSSH-Win64.zip 解压之后放入到&#xff1a;C:\Program Files (x86)\OpenSSH-Win64以管理员身份打开CMD进入到 C:\Program Files (x86)\OpenSSH-Win64 文件夹执行命令 powershell.exe -Exec…

WordPress网站添加嵌入B站视频,自适应屏幕大小,取消自动播放

结合bv号 改成以下嵌入式代码&#xff08;自适应屏幕大小,取消自动播放&#xff09; <iframe style"width: 100%; aspect-ratio: 16/9;" src"//player.bilibili.com/player.html?isOutsidetrue&bvidBV13CSVYREpr&p1&autoplay0" scrolling…

C语言内幕--全局变量(结合内存分区、汇编视角看类型、连接器)

前言 学习资源&#xff1a;b站up主&#xff1a;底层技术栈学过C语言都知道&#xff0c;全局变量可以再全局中使用&#xff0c;其实全局变量内部还是涉及到不少知识&#xff0c;这里从内存分区、汇编视角看类型、连接器等角度看待全局变量&#xff1b;由于涉及到底层技术&#…

省级-建成区绿化覆盖率数据(2006-2022年)

建成区绿化覆盖率是指城市建成区的绿化覆盖面积占建成区的百分比。 城市绿化覆盖率的提升&#xff0c;不仅能够改善城市的空气质量&#xff0c;降低噪音污染&#xff0c;还能提高城市的生物多样性&#xff0c;为市民提供更多的休闲和娱乐空间。 2006年-2022年省级-建成区绿化…

基于CNN-BiLSTM的时间序列数据预测,15个输入1个输出,可以更改数据集,MATLAB代码

1. 数据收集与预处理 数据清洗&#xff1a;处理缺失值、异常值等。特征工程&#xff1a;提取有助于预测的特征。数据标准化&#xff1a;将时间序列数据标准化&#xff0c;使其具有零均值和单位方差&#xff0c;有助于模型训练。滑动窗口划分&#xff1a;将时间序列数据划分为多…

SSM学习 day02

一、vue项目开发流程 vue根组件 <template><div><h1>{{ message }}</h1><element-view></element-view></div> </template><script> import ElementView from ./views/Element/ElementView.vue export default {compon…