Skip to content

Mybatis Plus 分页插件

TIP

MyBatis-Plus 内置了分页插件,支持物理分页,性能优于内存分页。

配置分页插件

java
@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        // 分页插件(设置数据库类型)
        PaginationInnerInterceptor pagination = new PaginationInnerInterceptor(DbType.MYSQL);
        pagination.setMaxLimit(500L); // 单页最大限制
        pagination.setOverflow(true); // 请求页超出总页数时回正

        interceptor.addInnerInterceptor(pagination);
        return interceptor;
    }
}

分页查询

java
// 创建分页对象(第1页,每页10条)
Page<User> page = new Page<>(1, 10);

// Mapper 层分页
Page<User> result = userMapper.selectPage(page, null);

// Service 层分页
Page<User> result = userService.page(new Page<>(1, 10));

// 获取分页信息
long total = result.getTotal();       // 总记录数
long pages = result.getPages();       // 总页数
List<User> records = result.getRecords(); // 当前页数据
boolean hasNext = result.hasNext();   // 是否有下一页
boolean hasPrev = result.hasPrevious(); // 是否有上一页

带条件分页

java
// Mapper 层
Page<User> page = new Page<>(1, 10);
LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery()
    .ge(User::getAge, 18)
    .orderByDesc(User::getCreateTime);
Page<User> result = userMapper.selectPage(page, wrapper);

// Service 层(更简洁)
Page<User> result = userService.page(
    new Page<>(1, 10),
    Wrappers.lambdaQuery(User.class).ge(User::getAge, 18)
);

自定义分页

可以在 Mapper XML 中使用自定义分页:

java
// Mapper 接口
Page<UserVO> selectUserPage(Page<?> page, @Param("name") String name);
xml
<select id="selectUserPage" resultType="com.example.vo.UserVO">
    SELECT u.*, o.order_count
    FROM user u
    LEFT JOIN (SELECT user_id, COUNT(*) order_count FROM `order` GROUP BY user_id) o
        ON u.id = o.user_id
    <where>
        <if test="name != null and name != ''">
            AND u.name LIKE CONCAT('%', #{name}, '%')
        </if>
    </where>
</select>