.query().page(分页对象) 完整讲解

.query().page(分页对象) 完整讲解 .query().page(分页对象)完整讲解1.拆开整条代码PageBlogpageblogService.query().orderByDesc(liked).page(newPage(current,SystemConstants.MAX_PAGE_SIZE));拆成两步看// 第一步QueryChainWrapperBlogchainblogService.query();// 第二步 加排序条件chain.orderByDesc(liked);// 第三步 执行分页查询PageBlogpageResultchain.page(newPage(current,SystemConstants.MAX_PAGE_SIZE));2.blogService.query()返回什么blogService继承IServiceBlogdefaultQueryChainWrapperTquery(){returnnewQueryChainWrapper(this);}返回QueryChainWrapperBlog链式包装对象等价于你手动创建QueryWrapperBlogQueryWrapper基于字符串字段名写条件所以下面两句完全等价// 链式写法你现在的代码blogService.query().orderByDesc(liked).page(pageObj);// 传统写法QueryWrapperBlogwrappernewQueryWrapper();wrapper.orderByDesc(liked);blogService.page(pageObj,wrapper);.query()就是用来省去你手动 new QueryWrapper。3. QueryChainWrapper 里面的 .page() 方法方法签名链式Wrapper里面的pagepublicPageTpage(PageTpage)只接收一个参数分页Page对象为什么不需要传 wrapper因为你前面.orderByDesc()、.eq()这些条件已经存到当前这个 QueryChainWrapper 对象内部了。而 IService 的原生page需要两个参数// IService原生PageTpage(PageTpage,WrapperTqueryWrapper)本质底层执行的还是 IService 的 page 方法链式只是语法糖。4.整条调用执行流程一步一步blogService.query()// 1、 创建链式对象空条件.orderByDesc(liked)// 2、 往 wrapper 添加排序条件: order by liked desc.page(newPage(1,5));// 3、 真正访问数据库执行分页⚠️重点①、②两步不会连接数据库仅仅组装SQL条件只有调用.page()的那一刻才发送SQL去MySQL默认发出两条SQL-- count 统计总条数SELECTCOUNT(1)FROMblogORDERBYlikedDESC-- 查询当前页数据SELECT*FROMblogORDERBYlikedDESCLIMIT0,55.参数new Page(current, size)回顾newPage(current,size)newPage(current,size,isSearchCount)current页码从 1 开始size每页条数isSearchCount是否执行 count 统计总条数默认true例子new Page(2,5)第2页每页5条limit offset (2‑1)*5 5 →limit 5,56.返回结果 PagePageBlogpage......;ListBlogrecordspage.getRecords();//当前页博客数据longtotalpage.getTotal();//总条数longpagespage.getPages();//总页数7.query().page()VSlambdaQuery().page()对比// query 版本QueryWrapper字符串字段blogService.query().orderByDesc(liked).page(pageObj);// lambdaQuery版本LambdaQueryWrapper实体属性blogService.lambdaQuery().orderByDesc(Blog::getLiked).page(pageObj);唯一区别就是前面Wrapper类型不一样后面.page()完全是同一个方法、一模一样的分页逻辑。项目query().pagelambdaQuery().page条件字段写法字符串liked方法引用Blog::getLiked编译检查字段无写错运行时报错有IDEA直接飘红分页执行逻辑完全一样完全一样8.常见易错坑坑1没有配置分页插件 → .page() 失效查全部数据必须配置否则 limit 不会生效BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptornewMybatisPlusInterceptor();interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));returninterceptor;}坑2混淆两种page链式只传Pagechain.page(pageObj);IService原生两个参数blogService.page(pageObj,wrapper);不要写成// 错误: 链式里面不要再传 wrapperblogService.query().page(pageObj,wrapper);坑3直接返回Page对象给前端returnResult.ok(page);//错returnResult.ok(page.getRecords());//对返回列表9.链式常用结尾方法QueryChainWrapper都可以调用.page(pageObj)// 分页查询返回Page对象.list()// 查询所有符合条件数据List集合.one()// 查询一条数据.count()// 查询总条数返回Long