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

 更新时间:2025年03月14日 10:01:54   作者:techzhi  
本文主要介绍了Mybatisplus多表关联分页查询多种实现方式,包括使用XML自定义SQL、Wrapper搭配自定义SQL、使用DTO与自定义SQL及结合PageHelper实现分页查询,感兴趣的可以了解一下

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

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

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

实现步骤

  • 定义查询方法:在 Mapper 接口中定义分页查询方法。
  • 编写 XML 查询语句:在 Mapper XML 文件中编写 SQL 查询,包括分页逻辑。
  • 调用分页插件:在服务层调用分页查询方法。

示例代码

实体类定义

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

@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_name
    FROM user u
    LEFT JOIN order o ON u.id = o.user_id
    WHERE 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&lt;User&gt; page = new Page&lt;&gt;(1, 10); // 分页参数:第1页,每页10条
IPage&lt;User&gt; 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&lt;UserOrderDTO&gt; selectUserOrderDTO(Page&lt;?&gt; page, @Param("userId") Long userId);

Service 调用分页查询

Page&lt;UserOrderDTO&gt; page = new Page&lt;&gt;(1, 10); // 分页参数
IPage&lt;UserOrderDTO&gt; result = userMapper.selectUserOrderDTO(page, 1L);

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

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

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

实现步骤

添加 PageHelper 依赖:

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

在查询方法中调用 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 结合,可适应复杂分页场景复杂的关联分页查询

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

到此这篇关于Mybatisplus多表关联分页查询多种实现方式的文章就介绍到这了,更多相关Mybatisplus多表关联分页查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot从application.properties中注入list, map方式

    springboot从application.properties中注入list, map方式

    这篇文章主要介绍了springboot从application.properties中注入list,map方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Android bdflow数据库神器的使用

    Android bdflow数据库神器的使用

    这篇文章主要介绍了Android bdflow数据库神器的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Spring Cloud @RefreshScope 原理及使用

    Spring Cloud @RefreshScope 原理及使用

    这篇文章主要介绍了Spring Cloud @RefreshScope 原理及使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • vue+springboot上传文件、图片、视频及回显到前端详解

    vue+springboot上传文件、图片、视频及回显到前端详解

    一般来说vue可以使用axios或者fetch等ajax库发送文件请求,而springboot则可以使用Spring MVC的方式来处理上传文件请求,下面这篇文章主要给大家介绍了关于vue+springboot上传文件、图片、视频及回显到前端的相关资料,需要的朋友可以参考下
    2023-04-04
  • 使用Java实现对两个秒级时间戳相加

    使用Java实现对两个秒级时间戳相加

    在现代应用程序开发中,时间戳的处理是一个常见需求,特别是当我们需要对时间戳进行运算时,比如时间戳的相加操作,本文我们将探讨如何使用Java对两个秒级时间戳进行相加,并展示详细的代码示例和运行结果,需要的朋友可以参考下
    2024-08-08
  • Java如何使用Optional与Stream取代if判空逻辑(JDK8以上)

    Java如何使用Optional与Stream取代if判空逻辑(JDK8以上)

    这篇文章主要给大家介绍了关于Java如何使用Optional与Stream取代if判空逻辑(JDK8以上)的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • B/S与C/S架构的区别介绍

    B/S与C/S架构的区别介绍

    本文详细讲解了B/S与C/S架构的区别,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Spring详细解读事务管理

    Spring详细解读事务管理

    Spring事务的本质就是对数据库事务的支持,没有数据库事务,Spring是无法提供事务功能的。Spring只提供统一的事务管理接口,具体实现都是由数据库自己实现的,Spring会在事务开始时,根据当前设置的隔离级别,调整数据库的隔离级别,由此保持一致
    2022-04-04
  • Springboot整合https的实例代码

    Springboot整合https的实例代码

    本文简单介绍了一些密码学的基础和如何通过Springboot整合HTTPS,本文将通过实例代码给大家详细介绍整合过程,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • Java Stream 流的使用过程解析

    Java Stream 流的使用过程解析

    这篇文章主要介绍了Java Stream 流的使用过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论