温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Mybatis Plus中怎么自定义分页

发布时间:2021-08-03 15:05:55 来源:亿速云 阅读:378 作者:Leah 栏目:编程语言
# 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; } } 

1.2 基础分页使用示例

// 构造分页参数 Page<User> page = new Page<>(1, 10); // 当前页,每页大小 // 执行查询 Page<User> result = userMapper.selectPage(page, null); // 获取分页数据 List<User> records = result.getRecords(); long total = result.getTotal(); 

二、自定义分页实现方案

2.1 自定义SQL分页查询

2.1.1 Mapper接口定义

public interface UserMapper extends BaseMapper<User> { @Select("SELECT * FROM user WHERE age > #{age}") Page<User> selectByAgePage(Page<User> page, @Param("age") Integer age); } 

2.1.2 XML映射文件实现

<select id="selectByAgePage" resultType="com.example.User"> SELECT * FROM user WHERE age > #{age} </select> 

2.2 复杂关联查询分页

2.2.1 多表关联分页

@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); 

2.2.2 子查询分页处理

<select id="selectComplexPage" resultType="com.example.User"> SELECT * FROM user WHERE id IN (SELECT user_id FROM user_role WHERE role_id = #{roleId}) </select> 

三、高级自定义分页技巧

3.1 自定义分页结果处理

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; } 

3.2 分页参数动态调整

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); } 

四、自定义分页拦截器

4.1 实现自定义分页逻辑

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); } } 

4.2 注册自定义拦截器

@Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new CustomPaginationInterceptor()); return interceptor; } 

五、性能优化建议

5.1 分页查询优化方案

  1. *避免使用SELECT **
-- 不推荐 SELECT * FROM large_table LIMIT 100000, 10 -- 推荐 SELECT id, name FROM large_table LIMIT 100000, 10 
  1. 使用延迟关联优化
SELECT t1.* FROM large_table t1 JOIN (SELECT id FROM large_table LIMIT 100000, 10) t2 ON t1.id = t2.id 

5.2 大数据量分页处理

5.2.1 游标分页实现

public List<User> cursorPagination(Long lastId, int pageSize) { return userMapper.selectList(new LambdaQueryWrapper<User>() .gt(User::getId, lastId) .orderByAsc(User::getId) .last("LIMIT " + pageSize)); } 

5.2.2 分片查询+内存分页

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; } 

六、常见问题解决方案

6.1 分页插件不生效排查

  1. 检查拦截器是否正确配置
  2. 确认方法参数中包含Page对象
  3. 检查SQL是否正确支持分页语法

6.2 分页总数查询优化

// 关闭自动count查询 Page<User> page = new Page<>(1, 10, false); // 手动执行count查询(复杂场景) if (needTotal) { page.setTotal(userMapper.selectCount(queryWrapper)); } 

七、总结

Mybatis Plus的分页功能通过合理的自定义可以满足绝大多数业务场景需求。关键点包括:

  1. 掌握基础分页配置和使用方法
  2. 熟练使用自定义SQL实现复杂分页
  3. 了解高级分页优化技巧
  4. 大数据量场景选择合适的分页策略

通过本文介绍的各种方案,开发者可以灵活应对不同的分页需求,在保证功能实现的同时兼顾系统性能。 “`

注:本文实际约2000字,包含了Mybatis Plus自定义分页的完整实现方案,从基础使用到高级技巧,并提供了多种代码示例和优化建议。可根据需要调整具体章节的详细程度。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI