PageHelper和Mybatis-plus分页的使用

本文介绍如何在Spring Boot项目中使用PageHelper和Mybatis-plus实现分页功能。通过具体步骤指导读者完成环境搭建、依赖配置及代码编写,并提供测试方法。

PageHelper和Mybatis-plus分页的使用

一、PageHelper

① 准备sql

CREATE TABLE `t_user` (
  `id` int NOT NULL COMMENT '主键id',
  `name` varchar(255) DEFAULT NULL COMMENT '名字',
  `age` int DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

在这里插入图片描述② 创建springboot项目

③ 编写pom文件

<dependencies>
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.4.3</version>
    </dependency>

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.0</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

主要是导入 pagehelper-spring-boot-starter 依赖
④ 编写application.yml 文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/zhuicat?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
    username: root
    password: 123456
server:
  port: 8854

pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true

# 日志配置
logging:
  level:
    com.example: debug
    org.springframework: warn

⑤ 创建entity实体类User

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_user")
public class User  {
    //主键id
    @TableId
    private Integer id;
    //名字
    private String name;
    //年龄
    private Integer age;
}

创建 mapper文件 UserMapper

public interface UserMapper extends BaseMapper<User> {}

创建service文件 UserService

public interface UserService extends IService<User> {}

创建service实现类 UserServiceImpl

@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}

创建controller层 UserController

@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping
    public List<User> list(Integer page,Integer rows) {
        PageHelper.startPage(page,rows);
        List<User> userList = userService.list();
        PageInfo<User> pageInfo = new PageInfo<>(userList);
        long total = pageInfo.getTotal();
        int pages = pageInfo.getPages();

        return userList;
    }
}

Soringboot主启动类 Application

@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

⑥ 测试:
在这里插入图片描述在这里插入图片描述

二、Mybatis-plus

我们在上面搭建的项目进行

① 之前的依赖已经导入了

主要就是:mybatis-plus-boot-starter

② application.yml

# mybatis-plus
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  # 控制台打印sql语句
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

③ controller

@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserService userService;
    
    @GetMapping("/list")
    public List<User> list2(Integer page,Integer rows) {
        Page<User> pageUser = new Page<>(page,rows);
        userService.page(pageUser,null);

        List<User> userList = pageUser.getRecords();
        long total = pageUser.getTotal();
        return userList;
    }

}

注意:这里的 Page 导入的包应该是 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

④:测试:

在这里插入图片描述在这里插入图片描述

<think>我们正在讨论的是在Java持久层框架中如何选择分页插件:PageHelperMyBatis-Plus分页功能。 用户提供的引用内容: 引用[1]:PageHelper是国内非常优秀的一款开源的mybatis分页插件,支持多种数据库。 引用[2]:两者在使用语法上没有太大区别,但依赖不同。PageHelper需要单独引入pagehelper依赖,而MyBatis-Plus分页是其内置功能,引入MyBatis-Plus依赖即可。 引用[3]:展示了一个使用MyBatis-Plus分页的Controller示例。 用户问题:如何在PageHelperMyBatis-Plus分页功能中进行选择? 我们需要从多个角度进行比较: 1. 项目技术栈: - 如果项目已经使用MyBatis-Plus,那么使用其内置的分页功能更为方便,无需额外引入依赖,且风格统一。 - 如果项目只是使用MyBatis,没有引入MyBatis-Plus,那么PageHelper是一个轻量级的选择。 2. 功能特点: - PageHelper:支持多种数据库,分页方式简单(一行代码实现分页),提供了丰富的参数扩展点。 - MyBatis-Plus分页:作为MyBatis-Plus的一部分,除了分页还提供了很多其他功能(如CRUD增强、条件构造器、代码生成器等)。其分页功能与MyBatis-Plus的其他功能(如条件查询)可以无缝衔接。 3. 使用方式: - PageHelper:通过静态方法调用,在查询前调用`PageHelper.startPage(pageNum, pageSize)`,接下来的第一个MyBatis查询方法会被分页- MyBatis-Plus:需要先配置分页拦截器,然后在Service层使用其提供的分页方法(如`page`方法)或者使用分页对象(如`Page`对象)作为参数在Mapper层进行查询。 4. 与Spring Boot集成: - 两者都支持Spring Boot,通过简单的配置即可。 5. 性能: - 两者在性能上差异不大,都通过拦截器实现,生成分页SQL。 6. 扩展性: - PageHelper提供了更多的分页参数内存分页功能。 - MyBatis-Plus分页与其条件构造器结合使用非常方便,适合复杂查询的分页。 因此,选择建议如下: - 如果项目已经使用MyBatis-Plus,或者打算使用MyBatis-Plus的增强功能,那么选择MyBatis-Plus分页功能。 - 如果项目仅使用MyBatis,并且希望一个专注于分页的轻量级插件,那么选择PageHelper。 下面是两种分页方式的具体使用示例: ### PageHelper 使用示例 1. 引入依赖(基于引用[2]): ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.3.0</version> <!-- 版本可更新 --> </dependency> ``` 2. 配置拦截器(在MyBatis配置文件中或Spring Boot的配置类中): ```java @Configuration public class MyBatisConfig { @Bean public PageInterceptor pageInterceptor() { return new PageInterceptor(); } } ``` 3. 在Service层使用: ```java public PageInfo<User> listUsers(int pageNum, int pageSize) { // 紧跟着的第一个查询会被分页 PageHelper.startPage(pageNum, pageSize); List<User> users = userMapper.selectAll(); return new PageInfo<>(users); } ``` 4. Controller层返回分页结果(包含分页信息): ```java @GetMapping("/users") public PageInfo<User> getUsers(@RequestParam int pageNum, @RequestParam int pageSize) { return userService.listUsers(pageNum, pageSize); } ``` ### MyBatis-Plus 使用示例 1. 引入依赖(基于引用[2]): ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> <!-- 版本可更新 --> </dependency> ``` 2. 配置分页拦截器(Spring Boot): ```java @Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 根据数据库类型选择 return interceptor; } } ``` 3. Service层使用(引用[3]中的示例): ```java // 在Service中可以直接使用page方法 public IPage<User> listUsers(int pageNum, int pageSize) { Page<User> page = new Page<>(pageNum, pageSize); return userMapper.selectPage(page, null); } ``` 或者使用自定义查询: ```java public IPage<User> listUsersByCondition(int pageNum, int pageSize, String condition) { Page<User> page = new Page<>(pageNum, pageSize); // 使用QueryWrapper构建条件 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.like("name", condition); return userMapper.selectPage(page, wrapper); } ``` 4. Controller层返回分页结果(引用[3]): ```java @GetMapping("/list") public IPage<User> list(@RequestParam Integer page, @RequestParam Integer rows) { return userService.listUsers(page, rows); } ``` 总结: | 特性 | PageHelper | MyBatis-Plus分页 | |-------------------|----------------------------|---------------------------| | 依赖 | 单独依赖 | 包含在MyBatis-Plus依赖中 | | 使用方式 | 静态方法调用 | 通过Page对象Mapper方法 | | 多数据库支持 | 支持广泛 | 支持(需配置DbType) | | 与MyBatis-Plus集成| 无 | 原生支持 | | 推荐场景 | 纯MyBatis项目 | 已使用MyBatis-Plus的项目 | 根据项目的实际情况选择即可。 §§相关问题§§ 1. PageHelper分页原理是什么? 2. MyBatis-Plus分页插件如何配置多数据库支持? 3. 如何实现自定义count查询以提高分页性能? 4. 分页查询如何优化大数据量下的性能? 5. 如何实现前端分页与后端分页的选择? </think>### PageHelperMyBatis-Plus 分页功能选择指南 #### 一、核心差异对比 | **特性** | **PageHelper** | **MyBatis-Plus 分页** | |------------------|------------------------------------------|----------------------------------------| | **依赖关系** | 独立插件,需单独引入依赖[^2] | MyBatis-Plus 内置功能[^2] | | **集成复杂度** | 需额外配置拦截器 | 自动生效(配置分页插件后) | | **语法风格** | 静态方法调用 `PageHelper.startPage()` | 面向对象 `new Page<>(page, size)`[^3] | | **返回值处理** | 返回 `PageInfo` 对象(含分页元数据) | 返回 `IPage` 接口对象[^3] | | **多数据源支持** | 支持更广泛(Oracle、DB2等)[^1] | 主要优化 MySQL/PG(需指定 DbType) | #### 二、选择决策树 ```mermaid graph TD A[项目技术栈] --> B{是否已用 MyBatis-Plus?} B -->|是| C[直接使用 MyBatis-Plus 分页] B -->|否| D{需要支持非主流数据库?} D -->|是| E[选择 PageHelper] D -->|否| F[根据团队熟悉度选择] ``` #### 三、具体场景建议 1. **首选 MyBatis-Plus 分页的场景** -使用 MyBatis-Plus 的 CRUD 增强功能 - 项目主要使用 MySQL/PostgreSQL - 需要统一技术栈减少依赖(避免同时引入两个分页插件)[^2] ```java // MyBatis-Plus 分页示例 @GetMapping("/list") public IPage<User> list(Integer page, Integer size) { return userService.page(new Page<>(page, size)); } ``` 2. **首选 PageHelper 的场景** - 需兼容 Oracle、SQLite 等数据库[^1] - 项目仅使用原生 MyBatis(未引入 MyBatis-Plus- 需要更精细的分页控制(如内存分页模式) ```java // PageHelper 分页示例 public PageInfo<User> listUsers(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); List<User> users = userMapper.selectAll(); return new PageInfo<>(users); } ``` #### 四、性能注意事项 1. **SQL 优化** - 两者本质都是改写 SQL 添加 `LIMIT`/`ROWNUM` - 避免在分页查询中使用 `SELECT *`(特别是大字段) 2. **依赖冲突风险** ⚠️ 禁止同时激活两个分页插件(导致 SQL 被多次改写)[^2] ```xml <!-- 错误示例:同时引入会导致冲突 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> ``` #### 五、迁移建议 从 PageHelper 迁移到 MyBatis-Plus 分页: 1. 移除 PageHelper 依赖拦截器配置 2. 修改返回值类型:`PageInfo` → `IPage` 3. 替换启动方式:`PageHelper.startPage()` → `new Page<>()` 4. 前端适配:PageHelper 的页码从1开始,MyBatis-Plus 默认同前 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值