您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # Mybatis Plus中怎么自定义分页
## 一、Mybatis Plus分页基础
### 1.1 Mybatis Plus内置分页功能
Mybatis Plus提供了开箱即用的分页插件`PaginationInnerInterceptor`,通过简单配置即可实现基础分页查询:
```java
@Configuration
public class MybatisPlusConfig {
    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}
// 构造分页参数
Page<User> page = new Page<>(1, 10); // 当前页,每页大小
// 执行查询
Page<User> result = userMapper.selectPage(page, null);
// 获取分页数据
List<User> records = result.getRecords();
long total = result.getTotal();
public interface UserMapper extends BaseMapper<User> {
    
    @Select("SELECT * FROM user WHERE age > #{age}")
    Page<User> selectByAgePage(Page<User> page, @Param("age") Integer age);
}
<select id="selectByAgePage" resultType="com.example.User">
    SELECT * FROM user WHERE age > #{age}
</select>
@Select("SELECT u.*, d.dept_name FROM user u LEFT JOIN department d ON u.dept_id = d.id")
Page<UserDeptDTO> selectUserWithDept(Page<UserDeptDTO> page);
<select id="selectComplexPage" resultType="com.example.User">
    SELECT * FROM user WHERE id IN 
    (SELECT user_id FROM user_role WHERE role_id = #{roleId})
</select>
public Page<UserVO> customPageResult(Page<User> page) {
    // 原始分页查询
    Page<User> userPage = userMapper.selectPage(page, null);
    
    // 转换为VO
    Page<UserVO> voPage = new Page<>();
    BeanUtils.copyProperties(userPage, voPage);
    voPage.setRecords(userPage.getRecords().stream()
            .map(this::convertToVO)
            .collect(Collectors.toList()));
    
    return voPage;
}
public Page<User> dynamicPage(PageParam param) {
    // 根据业务逻辑动态设置分页参数
    Page<User> page = new Page<>();
    if (param.getPageSize() > 100) {
        page.setSize(100); // 限制最大分页大小
    } else {
        page.setSize(param.getPageSize());
    }
    page.setCurrent(param.getPageNum());
    
    return userMapper.selectPage(page, null);
}
public class CustomPaginationInterceptor implements InnerInterceptor {
    
    @Override
    public void beforeQuery(Executor executor, MappedStatement ms, 
            Object parameter, RowBounds rowBounds, ResultHandler resultHandler, 
            BoundSql boundSql) {
        
        if (parameter instanceof Page) {
            // 自定义分页处理逻辑
            processCustomPagination((Page<?>) parameter, boundSql);
        }
    }
    
    private void processCustomPagination(Page<?> page, BoundSql boundSql) {
        String originalSql = boundSql.getSql();
        // 自定义SQL改写逻辑
        String paginationSql = buildPaginationSql(originalSql, page);
        resetSql(boundSql, paginationSql);
    }
}
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new CustomPaginationInterceptor());
    return interceptor;
}
-- 不推荐
SELECT * FROM large_table LIMIT 100000, 10
-- 推荐
SELECT id, name FROM large_table LIMIT 100000, 10
SELECT t1.* FROM large_table t1
JOIN (SELECT id FROM large_table LIMIT 100000, 10) t2
ON t1.id = t2.id
public List<User> cursorPagination(Long lastId, int pageSize) {
    return userMapper.selectList(new LambdaQueryWrapper<User>()
            .gt(User::getId, lastId)
            .orderByAsc(User::getId)
            .last("LIMIT " + pageSize));
}
public Page<User> shardingPage(Page<User> page) {
    // 先获取所有ID(小结果集)
    List<Long> ids = userMapper.selectIdsByCondition();
    
    // 内存分页
    List<Long> pageIds = ids.stream()
            .skip((page.getCurrent() - 1) * page.getSize())
            .limit(page.getSize())
            .collect(Collectors.toList());
    
    // 批量查询详细数据
    List<User> records = userMapper.selectBatchIds(pageIds);
    
    page.setRecords(records);
    page.setTotal(ids.size());
    return page;
}
// 关闭自动count查询
Page<User> page = new Page<>(1, 10, false);
// 手动执行count查询(复杂场景)
if (needTotal) {
    page.setTotal(userMapper.selectCount(queryWrapper));
}
Mybatis Plus的分页功能通过合理的自定义可以满足绝大多数业务场景需求。关键点包括:
通过本文介绍的各种方案,开发者可以灵活应对不同的分页需求,在保证功能实现的同时兼顾系统性能。 “`
注:本文实际约2000字,包含了Mybatis Plus自定义分页的完整实现方案,从基础使用到高级技巧,并提供了多种代码示例和优化建议。可根据需要调整具体章节的详细程度。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。