本文记录我在二手交易平台项目中实现分页功能的完整过程,从依赖到代码,附踩坑。
一、为什么要分页
商品列表数据多了,一次全查出来:
数据库压力大
前端渲染慢
用户看不完
分页:每次只查一页的数据,按需加载。
二、加依赖
MyBatis Plus 3.5.9 之后,分页插件被拆到了独立依赖,光有 starter 不够。
在 pom.xml 加:
<!-- MyBatis Plus 分页插件依赖(3.5.9+ 需要单独引入) --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-jsqlparser</artifactId><version>3.5.16</version></dependency>三、配置分页插件
新建 config/MyBatisPlusConfig.java:
packagecom.example.secondhand_shop.config;importcom.baomidou.mybatisplus.annotation.DbType;importcom.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;importcom.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassMyBatisPlusConfig{@BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptor=newMybatisPlusInterceptor();// 添加分页插件interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));returninterceptor;}}四、ProductMapper 加分页联查方法
普通分页不会联查分类名,要自定义 SQL:
@Select("SELECT p.*, c.name AS categoryName FROM product p "+"LEFT JOIN category c ON p.category_id = c.id")IPage<Product>pageWithCategory(Page<Product>page);注意:参数是 Page,返回值是 IPage。
五、ProductService 加分页方法
publicPage<Product>pageProduct(IntegerpageNum,IntegerpageSize){Page<Product>page=newPage<>(pageNum,pageSize);return(Page<Product>)getBaseMapper().pageWithCategory(page);}为什么不用 return page(page)?
因为 page(page) 走默认查询,不会联查分类名,categoryName 会是 null。
六、ProductController 加分页接口
@GetMapping("/page")publicResponseResult<Page<Product>>page(@RequestParam(defaultValue="1")IntegerpageNum,@RequestParam(defaultValue="5")IntegerpageSize){returnResponseResult.success(productService.pageProduct(pageNum,pageSize));}踩坑:/page 要放在 /{id} 前面,否则 Spring 会优先匹配 /{id},把 page 当成 id。
七、踩坑汇总
八、总结
分页三步:
加依赖 mybatis-plus-jsqlparser
配插件 PaginationInnerInterceptor
写代码 Mapper 自定义 SQL + Service 调 pageWithCategory + Controller 加 /page 接口
完整跑通后,商品列表性能大大提升,用户也能翻页了。