mybatis的扩展插件PageHelper 分页组件详解(含完整代码示例)

在这里插入图片描述


1. PageHelper 功能与核心概念

PageHelper 是 MyBatis 的分页插件,用于简化分页查询。其核心功能包括:

  • 简单分页:通过 PageHelper.startPage() 指定页码和每页数量。
  • 复杂查询分页:支持嵌套查询、多条件查询的分页。
  • 数据库方言支持:自动适配 MySQL、Oracle 等数据库的分页语法。

2. 完整代码示例

步骤1:添加依赖

pom.xml 中引入 PageHelper 的 Spring Boot Starter:

<!-- pom.xml -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.5</version>
</dependency>

步骤2:配置分页插件

通过配置类或 application.yml 启用插件(Spring Boot 自动配置,无需额外代码)。

# application.yml(可选配置)
pagehelper:
  helper-dialect: mysql  # 指定数据库方言
  reasonable: true      # 合理分页(页码小于1时返回第一页,大于最大页时返回最后一页)

步骤3:实体类与 Mapper
// User.java(实体类)
public class User {
    private Long id;
    private String name;
    private Integer age;

    // Getters and Setters
}

// UserMapper.java(MyBatis Mapper 接口)
public interface UserMapper extends BaseMapper<User> {
    // 或直接使用 XML 定义 SQL
}

步骤4:Service 层实现分页
// UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    /**
     * 分页查询用户列表
     * @param pageNum 当前页码
     * @param pageSize 每页数量
     * @return 分页结果
     */
    public PageInfo<User> listUsers(int pageNum, int pageSize) {
        // 开启分页,设置当前页和每页数量
        PageHelper.startPage(pageNum, pageSize);
        
        // 执行查询(可添加复杂条件)
        List<User> users = userMapper.selectList(null); // 或自定义查询方法
        
        // 封装分页结果
        return new PageInfo<>(users);
    }
}

步骤5:Controller 层处理请求
// UserController.java
@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/users")
    public ResponseEntity<PageInfo<User>> getUsers(
        @RequestParam(defaultValue = "1") int pageNum,
        @RequestParam(defaultValue = "10") int pageSize
    ) {
        PageInfo<User> pageInfo = userService.listUsers(pageNum, pageSize);
        return ResponseEntity.ok(pageInfo);
    }
}

步骤6:运行与结果示例

访问 http://localhost:8080/users?pageNum=1&pageSize=5,返回结果类似:

{
    "list": [
        {"id": 1, "name": "张三", "age": 25},
        {"id": 2, "name": "李四", "age": 30}
    ],
    "pageNum": 1,
    "pageSize": 5,
    "total": 100,
    "pages": 20
}

3. 关键代码与注释详解

分页核心代码
// 开启分页
PageHelper.startPage(pageNum, pageSize);

// 执行查询(可添加条件)
List<User> users = userMapper.selectList(null);

// 封装分页信息
PageInfo<User> pageInfo = new PageInfo<>(users);
  • PageHelper.startPage()
    • 参数 pageNumpageSize 分别表示当前页和每页数量。
    • 支持链式调用(如 PageHelper.startPage(1, 10).setOrderBy("age desc"))。
  • PageInfo
    • 包含总记录数(total)、总页数(pages)、当前页数据(list)等信息。

复杂查询示例
// 支持多条件查询
public PageInfo<User> searchUsers(int pageNum, int pageSize, String keyword) {
    PageHelper.startPage(pageNum, pageSize);
    // 自定义查询方法
    List<User> users = userMapper.findByKeyword(keyword);
    return new PageInfo<>(users);
}

4. 总结表格
组件名称功能核心类适用场景关键代码点
PageHelper分页插件(支持复杂查询)PageHelper, PageInfo需要分页的复杂查询(如多条件、嵌套查询)PageHelper.startPage(), PageInfo
配置方式Spring Boot 自动配置或自定义配置application.yml所有分页场景配置 helper-dialectreasonable
数据库适配自动适配 MySQL、Oracle 等内置方言支持多数据库环境无需手动修改 SQL 分页语法

5. 关键实践建议
  1. 分页参数校验
    • 避免 pageNumpageSize 为负数,可通过 @Min(1) 等注解校验。
  2. 性能优化
    • 对大数据量分页查询,建议结合数据库索引或缓存。
  3. 分页逻辑复用
    • 将分页逻辑封装到工具类或基类中,减少重复代码。

通过 PageHelper,开发者可以快速实现分页功能,尤其适合需要灵活处理复杂查询的企业级应用。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐