1.1 什么是分页查询及其重要性
想象一下打开一个包含上万条数据的表格——浏览器可能会卡顿,用户需要滚动很久才能找到想要的信息。分页查询就是把大量数据分割成多个小块,每次只加载其中一部分的技术手段。
在Java优学网这样的在线教育平台,课程列表、学习记录、用户评论都可能产生海量数据。直接展示全部数据不仅影响加载速度,还会降低用户体验。分页让数据呈现更加优雅,用户可以通过翻页快速定位目标内容。
我记得第一次接触分页是在一个学生管理系统中。当时没有实现分页功能,每次查询学生名单都要等待十几秒,页面滚动条变得特别短。后来加入分页后,页面响应速度明显提升,用户操作也更加流畅。
1.2 MyBatis分页查询的基本原理
MyBatis本身并不直接提供分页功能,而是通过拦截SQL语句,在原始查询基础上添加分页相关的限制条件。核心思想是在数据库层面完成数据切片,而不是把所有数据都取到内存中再分页。
具体来说,分页需要两个关键参数:页码和每页大小。假设每页显示10条数据,要查询第3页的内容,对应的SQL语句会添加LIMIT 20, 10这样的限制(MySQL语法),意思是从第20条记录开始取10条数据。
不同的数据库分页语法有所差异。Oracle使用ROWNUM,SQL Server用TOP和OFFSET FETCH,但底层逻辑都是相通的。MyBatis的分页插件会根椐配置的数据库类型自动生成合适的分页SQL。
这种设计确实很巧妙,既保持了代码的简洁性,又确保了查询效率。

1.3 分页查询在Java优学网中的应用场景
在Java优学网这样的教育平台,分页查询几乎无处不在。课程分类页面需要分页展示不同技术方向的课程,避免一次性加载所有课程造成的性能问题。
用户个人中心的学习记录也需要分页。一个活跃用户可能完成了几百个课程的学习,分页展示让历史记录更加清晰易读。搜索功能更是离不开分页——当用户搜索"Spring Boot"时,可能返回几十个相关课程,分页让结果浏览变得轻松。
我注意到很多教育平台在实现分页时都采用相似的策略。比如在显示课程评价时,通常只展示最新或最热门的几条,通过分页让用户自主选择查看更多的评价内容。这种设计既保证了页面加载速度,又提供了完整的信息访问路径。
分页已经成为现代Web应用的标准配置,特别是在数据密集型的教育平台中。合理的分页设计能够显著提升用户体验,同时减轻服务器和数据库的负担。
List

pagehelper: helper-dialect: mysql reasonable: true support-methods-arguments: true
CREATE INDEX idx_category_created ON courses(category_id, created_time DESC);
@GetMapping("/courses")
public PageResult
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "20") Integer pageSize,
@RequestParam(required = false) Integer categoryId) {
PageHelper.startPage(pageNum, pageSize);
List<Course> courses = courseService.getCoursesByCategory(categoryId);
PageInfo<Course> pageInfo = new PageInfo<>(courses);
return PageResult.success(pageInfo);
}
public class DynamicPageParam {
private Integer page;
private Integer size;
private String sort;
private Boolean needTotal = true;
public PageRequest toPageRequest() {
// 根据业务场景动态调整分页大小
if (size == null) {
size = deducePageSize();
}
// 验证参数有效性
validate();
return new PageRequest(page, size, sort);
}
private Integer deducePageSize() {
// 移动端使用较小分页
if (isMobileRequest()) return 10;
// 管理后台使用较大分页
if (isAdminRequest()) return 50;
// 默认分页大小
return 20;
}
}