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

IPage<UserVo> selectPageVo(IPage<?> page, Integer state);// or (class MyPage extends Ipage{ private Integer state; })MyPage selectPageVo(MyPage page);// orList<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 中调用该方法进行分页查询,代码如下:

@Servicepublic class UserService {@Autowiredprivate 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 中接收请求参数并返回结果集,代码如下:

@RestControllerpublic class UserController {@Autowiredprivate 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 中调用该方法进行分页查询,代码如下:

@Servicepublic class OrderService {@Autowiredprivate 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 中接收请求参数并返回结果集,代码如下:

@RestControllerpublic class OrderController {@Autowiredprivate 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 中调用该方法进行分页查询,代码如下:

@Servicepublic class ArticleService {@Autowiredprivate 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 中接收请求参数并返回结果集,代码如下:

@RestControllerpublic class ArticleController {@Autowiredprivate 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。