mybatisplus的几种分页方式

官方文档中给出了几种分页方式,挨个举例说明一下

IPage<UserVo> selectPageVo(IPage<?> page, Integer state);
// or (class MyPage extends Ipage<UserVo>{ private Integer state; })
MyPage selectPageVo(MyPage page);
// or
List<UserVo> selectPageVo(IPage<UserVo> page, Integer state);

这三种 Mybatis Plus 分页方式的区别主要在于传递参数的方式和返回结果的类型。

  1. IPage selectPageVo(IPage<?> page, Integer state)

这种方式需要传入一个 IPage 对象作为分页参数,其泛型类型可以是任何实体类。方法返回值也是一个 IPage 对象,其中的泛型类型是
UserVo 类型,表示查询结果集。

  1. MyPage selectPageVo(MyPage page)

这种方式需要传入一个自定义的分页对象 MyPage 作为分页参数,该对象继承了 Mybatis Plus 提供的 IPage
接口,并添加了一个 Integer 类型的 state 属性。方法返回值也是一个 MyPage 对象,其中的泛型类型是 UserVo
类型,表示查询结果集。

  1. List selectPageVo(IPage page, Integer state)

这种方式需要传入一个 IPage 对象作为分页参数,其中的泛型类型是 UserVo 类型。方法返回值是一个
List 对象,表示查询结果集。

总的来说,这三种方式的核心都是使用 Mybatis Plus 提供的分页插件来实现分页功能,不同的是传递参数和返回结果的方式略有差异。根据实际需要选择合适的方式即可。

下边分别举例子说明下使用方法

1. IPage selectPageVo(IPage<?> page, Integer state)

以查询用户列表为例,假设我们有一个 User 实体类,其中包含了用户的
id、姓名、年龄等属性。我们要实现的功能是查询所有年龄大于指定值的用户列表,并按照 id 升序排列,每页显示 10 条记录。

首先,在 UserMapper 接口中定义一个 selectUserList() 方法,代码如下:

public interface UserMapper extends BaseMapper<User> {
    IPage<UserVo> selectUserList(IPage<?> page, Integer age);
}

然后,在 UserService 中调用该方法进行分页查询,代码如下:

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    
    public IPage<UserVo> getUserList(Integer pageNum, Integer age) {
        IPage<UserVo> page = new Page<>(pageNum, 10, true);
        page.setOrderByAsc("id");
        return userMapper.selectUserList(page, age);
    }
}

这里创建了一个 Page 对象,指定当前页码和每页显示数量,并设置了按照 id 字段升序排序。然后将该 Page 对象作为参数,调用 UserMapper 中的 selectUserList() 方法,获取查询结果。

最后,在 Controller 中接收请求参数并返回结果集,代码如下:

@RestController
public class UserController {
    @Autowired
    private UserService userService;
    
    @GetMapping("/users")
    public Result getUsers(@RequestParam(defaultValue = "1") Integer pageNum,
                           @RequestParam(defaultValue = "18") Integer age) {
        IPage<UserVo> userList = userService.getUserList(pageNum, age);
        return Result.success(userList);
    }
}

通过以上示例可以发现,该方式需要传入一个 IPage 对象作为分页参数,并且返回的结果集类型是 UserVo。

2. MyPage selectPageVo(MyPage page)

以查询订单列表为例,假设我们有一个 Order 实体类,其中包含了订单的 id、用户
id、订单号等属性。我们要实现的功能是查询指定用户的订单列表,并按照订单生成时间倒序排列,每页显示 20 条记录。

首先,在 OrderMapper 接口中定义一个 selectOrderList() 方法,代码如下:

public interface OrderMapper extends BaseMapper<Order> {
    MyPage selectOrderList(MyPage page, Long userId);
}

这里需要使用自定义的分页对象 MyPage,并添加一个 Long 类型的 userId 属性。然后在方法中使用该 userId 属性进行查询,并将查询结果封装到 MyPage 中返回。

然后,在 OrderService 中调用该方法进行分页查询,代码如下:

@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;
    
    public MyPage getOrderList(Long userId, Integer pageNum) {
        MyPage page = new MyPage(pageNum, 20);
        page.setDesc("create_time");
        page.setUserId(userId);
        return orderMapper.selectOrderList(page, userId);
    }
}

这里创建了一个 MyPage 对象,指定当前页码和每页显示数量,并设置了按照 create_time 字段倒序排序,并将 userId 设置到 MyPage 对象中。然后将该 MyPage 对象作为参数,调用 OrderMapper 中的 selectOrderList() 方法,获取查询结果。

最后,在 Controller 中接收请求参数并返回结果集,代码如下:

@RestController
public class OrderController {
    @Autowired
    private OrderService orderService;
    
    @GetMapping("/orders")
    public Result getOrders(@RequestParam(defaultValue = "1") Integer pageNum,
                            @RequestParam Long userId) {
        MyPage orderList = orderService.getOrderList(userId, pageNum);
        return Result.success(orderList);
    }
}

通过以上示例可以发现,该方式需要使用自定义的分页对象 MyPage,并且返回的结果集类型是根据 MyPage 泛型类型指定的。

3. List selectPageVo(IPage page, Integer state)

以查询文章列表为例,假设我们有一个 Article 实体类,其中包含了文章的
id、标题、内容等属性。我们要实现的功能是查询所有状态为已发布的文章列表,并按照发布时间倒序排列,每页显示 15 条记录。

首先,在 ArticleMapper 接口中定义一个 selectArticleList() 方法,代码如下:

public interface ArticleMapper extends BaseMapper<Article> {
    List<ArticleVo> selectArticleList(IPage<ArticleVo> page, Integer state);
}

然后,在 ArticleService 中调用该方法进行分页查询,代码如下:

@Service
public class ArticleService {
    @Autowired
    private ArticleMapper articleMapper;
    
    public IPage<ArticleVo> getArticleList(Integer pageNum) {
        IPage<ArticleVo> page = new Page<>(pageNum, 15);
        page.setDesc("publish_time");
        return articleMapper.selectArticleList(page, 1);
    }
}

这里创建了一个 Page 对象,指定当前页码和每页显示数量,并设置了按照 publish_time 字段倒序排序。然后将该 Page 对象作为参数,调用 ArticleMapper 中的 selectArticleList() 方法,获取查询结果。

最后,在 Controller 中接收请求参数并返回结果集,代码如下:

@RestController
public class ArticleController {
    @Autowired
    private ArticleService articleService;
    
    @GetMapping("/articles")
    public Result getArticles(@RequestParam(defaultValue = "1") Integer pageNum) {
        IPage<ArticleVo> articleList = articleService.getArticleList(pageNum);
        return Result.success(articleList);
    }
}

通过以上示例可以发现,该方式需要传入一个泛型为 ArticleVo 的 IPage 对象作为分页参数,并且返回的结果集类型是 ArticleVo。

<think>嗯,用户现在想用MyBatisPlus实现多表分页关联查询,但可能不太清楚具体怎么做。我需要根据提供的引用内容来整理出几种方法。 首先,根据引用[1]和[2],MyBatis-Plus自带分页插件在单表查询很方便,但多表关联可能需要自己写SQL。用户可能需要手动编写SQL语句,然后在Mapper接口中定义方法,结合分页参数。比如引用[4]中的例子,用@Select注解直接在Mapper接口里写SQL,然后返回分页对象。 另外,引用[5]提到使用Java8的Stream API进行分组处理,可能是在查询出结果后,对数据进行内存分页。不过这种方法可能效率不高,尤其是数据量大时,但可以作为备选方案。 还有一种方法可能是结合PageHelper,如引用[1]所述。虽然MyBatis-Plus有自己的分页插件,但PageHelper在某些情况下可能更灵活,特别是在复杂查询中。不过需要注意两者的兼容性,避免分页参数冲突。 用户可能需要具体的步骤,比如定义Mapper方法、编写XML中的SQL、处理分页参数等。比如引用[3]提到的准备Page对象,传入页码和每页数量。然后引用[4]中的XML文件示例,展示如何写多表关联的SQL,并使用分页参数。 可能还需要注意,多表查询时可能需要使用ResultMap来处理结果集映射,确保关联表的数据正确填充到实体类中。引用[4]中的例子虽然用了@Select,但如果是复杂的结果映射,可能需要XML配置。 用户可能遇到的常见问题包括分页总数不准确,或者SQL性能问题。这时候可能需要优化SQL,或者检查分页插件的配置是否正确。比如在自定义SQL中确保计算总数的子查询正确,避免全表扫描。 总结下来,实现方式主要有两种:一种是手动编写SQL,在Mapper接口中使用@Select或XML配置,结合MyBatis-Plus的Page对象;另一种是结合PageHelper进行分页。此外,内存分页虽然简单但效率低,适合小数据量。需要根据具体情况选择合适的方法,并注意SQL优化和分页的正确性。</think>### MyBatis-Plus多表分页关联查询实现方法 #### 一、手动编写SQL实现 1. **定义Mapper接口方法** 在自定义Mapper接口中添加分页查询方法,使用`@Param`注解绑定分页对象: ```java @Mapper public interface UserMapper extends BaseMapper<User> { Page<User> selectPageWithRole(@Param("page") Page<User> page, @Param("roleName") String roleName); } ``` 2. **编写XML映射文件** 在XML文件中实现多表关联查询,注意包含分页参数: ```xml <select id="selectPageWithRole" resultType="com.example.entity.User"> SELECT u.*, r.role_name FROM user u LEFT JOIN role r ON u.role_id = r.id WHERE r.role_name = #{roleName} </select> ``` 无需手动添加`LIMIT`语句,MyBatis-Plus分页插件会自动处理[^3]。 #### 二、使用@Select注解实现 直接在Mapper接口中编写SQL(适用于简单关联): ```java @Select("SELECT u.*, o.order_no FROM user u LEFT JOIN order o ON u.id = o.user_id ${ew.customSqlSegment}") Page<User> selectUserWithOrder(Page<User> page, @Param(Constants.WRAPPER) QueryWrapper<User> wrapper); ``` 此方法通过`${ew.customSqlSegment}`支持Wrapper条件构造器[^4]。 #### 三、结合Java8 Stream分组(内存分页) 1. **先查询后处理** 查询关联数据后通过Stream进行内存分页: ```java List<RecordClock> rawList = recordClockMapper.selectList(null); // 内存分页(需自行计算起始位置) int pageSize = 10; List<RecordClock> pageList = rawList.stream() .skip((current-1)*pageSize).limit(pageSize) .collect(Collectors.toList()); ``` 此方式适用于数据量较小的场景[^5]。 #### 四、PageHelper整合方案 1. **添加依赖** 在`pom.xml`中引入PageHelper: ```xml <dependency> <groupId>com.github.pagehelper</groupId> </dependency> ``` 2. **在Service层使用** ```java PageHelper.startPage(1, 10); List<UserDTO> list = userMapper.selectWithRole(); PageInfo<UserDTO> pageInfo = new PageInfo<>(list); ``` 注意:需关闭MyBatis-Plus自带分页插件避免冲突[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值