分页查询的两种实现方法

第一种:mybatis-plus自带的分页方法,通过调用selectPage方法实现分页,适用于通过QueryWrapper拼装SQL。

第二种:pagehelper分页组件适用于自定义sql的分页查询。

pagehelper分页组件的原理如下:

调用PageHelper.startPage方法设置分页参数,通过一层一层进入源码,最终将分页参数设置到ThreadLocalLOCAL_PAGE=newThreadLocal(); 中。

通过PageInterceptor拦截器拦截 MyBatis的Executor 的 query() 方法得到原始的sql语句,首先得到count总数,然后从ThreadLocal中取出分页参数,在原始sql语句中添加分页参数查询分页数据。

每次分页查询之后分页组件清空了ThreadLocal中的分页参数,以免影响后边的SQL语句的执行。

即:仅对调用了PageHelper.startPage方法后的第一条SQL分页查询,如果后续SQL也需要分页查询则需要先调用PageHelper.startPage方法设置分页参数。

1. MyBatis-Plus 自带的分页方法

MyBatis-Plus 提供了方便的分页查询功能,主要是通过 selectPage 方法实现。它结合了 Page 对象和 QueryWrapper 来构建分页查询。

1.1 Page 对象

Page 对象用于设置分页参数,包括当前页码和每页显示的记录数。它还可以在查询完成后,获取总记录数以及分页数据。

Page page = new Page<>(currentPage, pageSize);
  • currentPage:当前页码,从 1 开始。
  • pageSize:每页显示的记录数。

1.2 QueryWrapper 对象

QueryWrapper 用于构建查询条件,支持链式调用。常用的方法包括:

  • eq(String column, Object val):等值查询。
  • ne(String column, Object val):不等值查询。
  • gt(String column, Object val):大于查询。
  • ge(String column, Object val):大于等于查询。
  • lt(String column, Object val):小于查询。
  • le(String column, Object val):小于等于查询。
  • like(String column, Object val):模糊查询。
  • between(String column, Object val1, Object val2):范围查询。

1.3 结合 selectPage 方法

通过 selectPage 方法执行分页查询,返回 IPage 对象。

Page page = new Page<>(1, 10); // 查询第一页,每页 10 条记录
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", 1).like("name", "John");

IPage userPage = userMapper.selectPage(page, queryWrapper);
  • selectPage(Page page, @Param("ew") Wrapper queryWrapper):该方法的第一个参数为分页对象,第二个参数为查询条件。

1.4 结果处理

分页查询的结果包含在 IPage 对象中,可以通过以下方法获取:

  • getRecords():获取当前页的数据列表。
  • getTotal():获取总记录数。
  • getPages():获取总页数。
  • getCurrent():获取当前页码。

1.5 代码示例

Page page = new Page<>(1, 10);
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("status", 1).like("username", "test");

IPage userPage = userMapper.selectPage(page, wrapper);
List users = userPage.getRecords();

2. PageHelper 分页组件

PageHelper 是一个 MyBatis 分页插件,主要用于自定义 SQL 的分页查询。

2.1 使用 PageHelper 设置分页参数

在执行 SQL 查询前,先调用 PageHelper.startPage 方法设置分页参数。这个方法将分页参数保存到 ThreadLocal 中,以便在拦截器中使用。

PageHelper.startPage(1, 10); // 查询第一页,每页 10 条记录

2.2 执行查询

调用 PageHelper 分页后,直接执行 Mapper 的查询方法即可,这里的查询可以是自定义的 SQL 语句。

List userList = userMapper.selectCustomQuery();

2.3 获取分页结果

PageHelper 通过拦截 SQL 执行来实现分页功能,查询结果会自动被封装为 PageInfo 对象。PageInfo 包含了分页的相关信息,如总记录数、总页数、当前页码等。

PageInfo pageInfo = new PageInfo<>(userList);
  • getList():获取当前页的数据列表。
  • getTotal():获取总记录数。
  • getPages():获取总页数。
  • getPageNum():获取当前页码。

2.4 代码示例

PageHelper.startPage(1, 10);
List users = userMapper.selectCustomQuery();
PageInfo pageInfo = new PageInfo<>(users);

3. 总结

  • MyBatis-Plus 分页方法:适用于需要结合查询条件(QueryWrapper)并且 SQL 相对简单的场景。
  • PageHelper 分页组件:适用于复杂的自定义 SQL 查询场景。

你可能感兴趣的:(java,mybatis,java,数据库,分页查询,intellij,idea)