0


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

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

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

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

这是最常用的方式,通过自定义 SQL 查询可以实现较复杂的关联查询,结合 MyBatis-Plus 的

IPage

接口,可以实现分页效果。

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

假设有两个实体类:

User

Order

,我们想查询用户及其对应的订单列表。

@DatapublicclassUser{privateLong id;privateString name;}@DatapublicclassOrder{privateLong id;privateLong userId;privateString productName;}
Mapper 接口定义

UserMapper

中定义分页查询方法:

importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.baomidou.mybatisplus.extension.plugins.pagination.Page;importorg.apache.ibatis.annotations.Param;publicinterfaceUserMapperextendsBaseMapper<User>{IPage<User>selectUserOrders(Page<?> page,@Param("userId")Long userId);}
Mapper XML 编写多表关联查询

UserMapper.xml

中定义多表关联 SQL 查询:

<selectid="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 调用分页查询
@AutowiredprivateUserMapper userMapper;publicIPage<User>getUserOrders(Page<User> page,Long userId){return userMapper.selectUserOrders(page, userId);}

在调用此方法时传入

Page

对象,MyBatis-Plus 会自动处理分页参数。

Page<User> page =newPage<>(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 =newPage<>(1,10);// 分页参数IPage<User> result = userMapper.selectUserOrdersCustom(page,1L);

3. 使用 MyBatis-Plus 配合

Wrapper

关联查询 DTO

实现分页查询

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

示例代码
定义查询结果的 DTO 类
@DatapublicclassUserOrderDTO{privateLong userId;privateString userName;privateString 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 =newPage<>(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() 设置分页参数。
示例代码
importcom.github.pagehelper.PageHelper;importcom.github.pagehelper.PageInfo;publicPageInfo<UserOrderDTO>getUserOrdersPage(int pageNum,int pageSize,Long userId){PageHelper.startPage(pageNum, pageSize);List<UserOrderDTO> list = userMapper.selectUserOrderList(userId);returnnewPageInfo<>(list);}

通过

PageHelper.startPage(pageNum, pageSize);

配置分页,然后使用

PageInfo

封装返回结果,获取分页数据。

总结

实现方式优点适用场景XML 自定义 SQL灵活性高,可实现复杂的关联查询复杂 SQL 关联查询Wrapper 自定义 SQL灵活性高,支持简单关联查询简单的多表关联查询使用 DTO 与自定义 SQL减少实体类耦合,增加查询灵活性需要返回特定字段的查询MyBatis-Plus + PageHelper 分页查询与 PageHelper 结合,可适应复杂分页场景复杂的关联分页查询
通过以上方法,您可以根据项目的需求和复杂度选择合适的多表关联分页查询方式。

标签: java mybatis

本文转载自: https://blog.csdn.net/weixin_44102162/article/details/143325371
版权归原作者 techzhi 所有, 如有侵权,请联系我们删除。

“Mybatisplus多表关联分页查询有多种实现方式”的评论:

还没有评论