mybatis-plus如何做分页

一、实现思路

  1. 引入 MyBatis-Plus 核心依赖(确保版本正确);
  2. 配置分页插件(MyBatis-Plus 3.4.0+ 推荐使用新的插件配置方式);
  3. 使用 Page 类构建分页条件,调用 mapper 或 service 层的分页方法;
  4. 解析分页结果,获取总条数、当前页数据、总页数等信息。

二、完整实现步骤

1. 引入依赖(Maven)
确保项目中已引入 MyBatis-Plus 核心依赖(以 Spring Boot 为例):

<!-- MyBatis-Plus 核心依赖 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version> <!-- 推荐使用稳定版 -->
</dependency>
<!-- MySQL 驱动(根据数据库类型调整) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

2. 配置分页插件
创建 MyBatis-Plus 配置类,注册分页插件(关键步骤,否则分页不生效):

点击查看代码(java)
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * MyBatis-Plus 配置类
 */
@Configuration
public class MyBatisPlusConfig {

    /**
     * 配置分页插件(3.4.0+ 推荐这种方式)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加分页插件,指定数据库类型(MySQL/Oracle 等)
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

3. 基础实体与 Mapper 准备
假设有一个 User 实体和对应的 Mapper 接口:

点击查看代码(java)
// User 实体(简化版)
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("t_user") // 对应数据库表名
public class User {
    private Long id;
    private String username;
    private String email;
}

// UserMapper 接口(继承 BaseMapper 即可)
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 无需手动写分页 SQL,BaseMapper 已提供分页方法
}

4. 分页查询使用示例

方式 1:基础分页(使用 BaseMapper)
在 Service 层调用分页方法:

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;

@Service
public class UserService {

    @Resource
    private UserMapper userMapper;

    /**
     * 基础分页查询
     * @param pageNum 当前页码(从1开始)
     * @param pageSize 每页条数
     * @return 分页结果
     */
    public IPage<User> getUserPage(Integer pageNum, Integer pageSize) {
        // 1. 构建分页对象(Page 是 MyBatis-Plus 提供的分页条件类)
        Page<User> page = new Page<>(pageNum, pageSize);
        
        // 2. 可选:添加查询条件(如按用户名模糊查询)
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(User::getUsername, "张"); // 示例条件:用户名包含“张”
        
        // 3. 执行分页查询(BaseMapper 的 selectPage 方法)
        IPage<User> userPage = userMapper.selectPage(page, queryWrapper);
        
        // 4. 解析分页结果(IPage 包含所有分页信息)
        long total = userPage.getTotal(); // 总记录数
        long pages = userPage.getPages(); // 总页数
        List<User> records = userPage.getRecords(); // 当前页数据列表
        
        System.out.println("总记录数:" + total + ",总页数:" + pages);
        return userPage;
    }
}

方式 2:自定义 SQL 分页(复杂查询场景)
如果需要手写 SQL 实现复杂分页,只需在 Mapper 中定义方法并传入 Page 对象:

// 1. UserMapper 中添加自定义分页方法
@Mapper
public interface UserMapper extends BaseMapper<User> {
    /**
     * 自定义 SQL 分页
     * @param page 分页对象(必须作为第一个参数)
     * @param email 邮箱模糊查询条件
     * @return 分页结果
     */
    IPage<User> selectUserByEmail(Page<User> page, @Param("email") String email);
}

// 2. 对应的 Mapper.xml 文件(resources/mapper/UserMapper.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="selectUserByEmail" resultType="com.example.demo.entity.User">
        SELECT id, username, email FROM t_user 
        WHERE email LIKE CONCAT('%', #{email}, '%')
        <!-- 无需手动写 LIMIT,MyBatis-Plus 会自动拼接分页语句 -->
    </select>
</mapper>

// 3. Service 层调用自定义分页方法
public IPage<User> getCustomUserPage(Integer pageNum, Integer pageSize, String email) {
    Page<User> page = new Page<>(pageNum, pageSize);
    IPage<User> userPage = userMapper.selectUserByEmail(page, email);
    return userPage;
}

5. 控制器调用示例

import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

@RestController
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping("/users/page")
    public IPage<User> getUserPage(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize) {
        return userService.getUserPage(pageNum, pageSize);
    }
}

三、关键说明

  1. 分页参数:Page 构造器的 pageNum 从 1 开始(符合日常使用习惯),而非 0;
  2. IPage 核心属性
  • getRecords():当前页数据列表;
  • getTotal():总记录数;
  • getPages():总页数;
  • getCurrent():当前页码;
  • getSize():每页条数;
  1. 常见问题
  • 分页不生效:检查是否配置了分页插件,或插件版本与 MyBatis-Plus 版本不兼容;
  • 总记录数为 0:自定义 SQL 时,确保没有手动加 LIMIT,或查询条件无数据;
  • 数据库兼容:PaginationInnerInterceptor 需指定正确的 DbType(如 MySQL、Oracle、PostgreSQL)。

总结

  1. MyBatis-Plus 分页核心是配置 PaginationInnerInterceptor 插件,缺一不可;
  2. 基础分页直接使用 BaseMapper.selectPage(),传入 Page 对象和查询条件即可;
  3. 自定义 SQL 分页时,Page 对象需作为第一个参数,无需手动拼接分页语句,插件会自动处理。

这种方式相比原生 MyBatis 分页,省去了手动编写分页 SQL、计算总页数的工作量,大幅提升开发效率。

posted @ 2026-01-10 12:17  daring_ding  阅读(11)  评论(0)    收藏  举报