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
接口,可以实现分页效果。
实现步骤
- 定义查询方法:在 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_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
使用分页功能。
实现步骤
-
添加 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 结合,可适应复杂分页场景 | 复杂的关联分页查询 |
通过以上方法,您可以根据项目的需求和复杂度选择合适的多表关联分页查询方式。