自定义分页查询
一、分页查询简介:
- 当一个操作数据库进行查询的语句返回的结果集内容如果过多,那么内存极有可能溢出,所以在查询中含有大数据的情况下分页是必须的。
二、分页查询分类:
- 物理分页:
- 在数据库执行查询时(实现分页查询),查询需要的数据—依赖数据库的SQL语句
- 在SQL查询时,从数据库只检索分页需要的数据
- 通常不同的数据库有着不同的物理分页语句
- 逻辑分页:
- 在sql查询时,先从数据库检索出所有数据的结果集,在程序内,通过逻辑语句获得分页需要的数据
三、Mysql 分页查询实现:
# LIMIT 子句
SELECT 投影列 FROM 表名 WHERE 条件 ORDER BY LIMIT 开始位置,查询数量;
# LINIT OFFICT 子句
SELECT 投影列 FROM 表名 WHERE 条件 ORDER BY LIMIT 查询数量 OFFSET 开始位置;
查询原则:
- MYSQL 分页中开始位置为 0。
- 分页子句在查询语句的最后侧。
- 分页公式:(当前页-1)*每页大小
四、创建 Page 模型
- 在一个分页页面,除了要展示的结果集,还要显示当前页、当前页条数、此次条件查询总条数,总页数等额外信息,可是 SQL 查询的单次结果只有一个数据,所以我们需要把这些数据项收集起来放到数据模型当中,返回该数据模型。
我们可以创建一个Page对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Page<T> {
//当前页
private int currentPage;
//每页显示的条数
private int pageSize;
//总条数
private int totalCount;
//总页数
private int totalPage;
//结果集
private List<T> result;
}
再写一个分页查询的方法
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageService {
private PageMapper pageMapper;
/**
* 条件分页查询
*
* @param page 分页信息
* @param condition 查询条件
* @return page对象
*/
public Page<Users> queryByPage(Page page, String condition) {
int count = pageMapper.queryCount(page, condition);
// TODO: 计算总页数等信息,填入Page对象中
// 计算总页数: 向上转型
page.setTotalPage((int) Math.ceil(1.0 * (count / page.getPageSize())));
List<Users> res = pageMapper.queryByPage(page, condition);
// TODO: 数据填入Page对象,返回Page对象
return page;
}
}
mapper: 暂时写一个伪代码
public class PageMapper {
/**
* 统计总数
*
* @param page 分页信息
* @param condition 查询条件
* @return 总条数
*/
public int queryCount(Page page, String condition) {
// TODO: 实际是连接数据库查询总条数 select count(*) from table where name = condition;
return 1;
}
/**
* 数据库分页查询
*
* @param page 分页信息
* @param condition 查询条件
* @return 查询结果数据集合
*/
public List queryByPage(Page page, String condition) {
int start = (page.getCurrentPage() - 1) * page.getPageSize();
int end = page.getPageSize();
// TODO: 实际是连接数据库条件查询 select * from table where name = condition limit start, end;
return new ArrayList<>();
}
}
五、 MyBatis分页插件 - PageHelper
- PageHelper是一款非常好用的开源免费的Mybatis第三方分页插件。使用该插件时,只要传入分页参数,即可自动生成页面对象。分页插件和持久层接口是完全不耦合的,分页插件的主要功能是帮我们封装查询结果。
我们使用该插件分页查询所有用户
<!-- PageHelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
Mybatis配置文件中配置PageHelper插件
<plugins>
<!-- 配置分页插件 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 因为不同数据库的分页查询关键字不同,所以要设置数据库类型 -->
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
使用分页插件
@Test
public void testFindPage() {
// 查询前设置分页参数,参数一:页数,从1开始。参数二:每页条数
PageHelper.startPage(1, 3);
// 正常查询
List<Users> all = userMapper.queryAll();
// 创建页面对象,将查询结果传入,并且里面会封装需要的Page信息
PageInfo pageInfo = new PageInfo(all);
// TODO: 返回PageInfo对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)