官方文档中给出了几种分页方式,挨个举例说明一下
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 分页方式的区别主要在于传递参数的方式和返回结果的类型。
- IPage selectPageVo(IPage page, Integer state)
这种方式需要传入一个 IPage 对象作为分页参数,其泛型类型可以是任何实体类。方法返回值也是一个 IPage 对象,其中的泛型类型是
UserVo 类型,表示查询结果集。
- MyPage selectPageVo(MyPage page)
这种方式需要传入一个自定义的分页对象 MyPage 作为分页参数,该对象继承了 Mybatis Plus 提供的 IPage
接口,并添加了一个 Integer 类型的 state 属性。方法返回值也是一个 MyPage 对象,其中的泛型类型是 UserVo
类型,表示查询结果集。
- 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。