第一种:mybatis-plus自带的分页方法,通过调用selectPage方法实现分页,适用于通过QueryWrapper拼装SQL。
第二种:pagehelper分页组件适用于自定义sql的分页查询。
pagehelper分页组件的原理如下:
调用PageHelper.startPage方法设置分页参数,通过一层一层进入源码,最终将分页参数设置到ThreadLocal
通过PageInterceptor拦截器拦截 MyBatis的Executor 的 query() 方法得到原始的sql语句,首先得到count总数,然后从ThreadLocal中取出分页参数,在原始sql语句中添加分页参数查询分页数据。
每次分页查询之后分页组件清空了ThreadLocal中的分页参数,以免影响后边的SQL语句的执行。
即:仅对调用了PageHelper.startPage方法后的第一条SQL分页查询,如果后续SQL也需要分页查询则需要先调用PageHelper.startPage方法设置分页参数。
MyBatis-Plus 提供了方便的分页查询功能,主要是通过 selectPage
方法实现。它结合了 Page
对象和 QueryWrapper
来构建分页查询。
1.1 Page
对象Page
对象用于设置分页参数,包括当前页码和每页显示的记录数。它还可以在查询完成后,获取总记录数以及分页数据。
Page page = new Page<>(currentPage, pageSize);
currentPage
:当前页码,从 1 开始。pageSize
:每页显示的记录数。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)
:范围查询。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)
:该方法的第一个参数为分页对象,第二个参数为查询条件。分页查询的结果包含在 IPage
对象中,可以通过以下方法获取:
getRecords()
:获取当前页的数据列表。getTotal()
:获取总记录数。getPages()
:获取总页数。getCurrent()
:获取当前页码。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();
PageHelper 是一个 MyBatis 分页插件,主要用于自定义 SQL 的分页查询。
在执行 SQL 查询前,先调用 PageHelper.startPage
方法设置分页参数。这个方法将分页参数保存到 ThreadLocal
中,以便在拦截器中使用。
PageHelper.startPage(1, 10); // 查询第一页,每页 10 条记录
调用 PageHelper 分页后,直接执行 Mapper 的查询方法即可,这里的查询可以是自定义的 SQL 语句。
List userList = userMapper.selectCustomQuery();
PageHelper 通过拦截 SQL 执行来实现分页功能,查询结果会自动被封装为 PageInfo
对象。PageInfo
包含了分页的相关信息,如总记录数、总页数、当前页码等。
PageInfo pageInfo = new PageInfo<>(userList);
getList()
:获取当前页的数据列表。getTotal()
:获取总记录数。getPages()
:获取总页数。getPageNum()
:获取当前页码。PageHelper.startPage(1, 10);
List users = userMapper.selectCustomQuery();
PageInfo pageInfo = new PageInfo<>(users);
QueryWrapper
)并且 SQL 相对简单的场景。