说明:
(1)本篇博客需要注意的点:
● 使用PageHelper分页插件,来实现分页功能;即,重点就是在Spring Boot项目中,使用PageHelper分页插件;
● 然后,我们需要根据接口的要求,来决定后台怎么编写;
● 有关PageHelper插件,尤其是Page对象和PageInfo对象,可以参考【附加:PageHelper分页插件的:Page和PageInfo的区别;】;
目录
(3)本篇博客,重点是如何在Spring Boot项目中,使用PageHelper分页插件;
1.在CategoryController中,编写后台目录列表的方法:listCategoryForAdmin()方法;
2.在CategoryServiceImpl实现类中,编写分页查询的方法listForAdmin();然后在CategoryService接口中,反向生成方法的声明;
(1)在CategoryServiceImpl实现类中,编写分页查询的方法listForAdmin();
(2)然后在CategoryService接口中,反向生成方法的声明;
3.在CategoryMapper接口中,定义查询所有分类目录的方法selectList();然后在CategoryMapper.xml中编写方法的SQL;
(1)在CategoryMapper接口中,定义查询所有分类目录的方法selectList();
(2)在CategoryMapper.xml中编写方法的SQL;
一:先看下接口文档和接口说明;
(1)后台的【分类列表(平铺)】接口:对应的界面效果;
通过项目演示,可以看到,【分类列表(平铺)】接口,主要的任务就是完成分页的功能;
……………………………………………………
(2)后台的【分类列表(平铺)】接口:接口文档要求;
该接口的返回内容:
{ "status": 10000, "msg": "SUCCESS", "data": { "total": 19, "list": [ { "id": 3, "name": "新鲜水果", "type": 1, "parentId": 0, "orderNum": 1, "createTime": "2019-12-17T17:17:00.000+0000", "updateTime": "2019-12-28T09:11:26.000+0000" }, { "id": 5, "name": "海鲜水产", "type": 1, "parentId": 0, "orderNum": 2, "createTime": "2019-12-17T17:17:00.000+0000", "updateTime": "2019-12-28T08:25:20.000+0000" }, { "id": 6, "name": "精选肉类", "type": 1, "parentId": 0, "orderNum": 3, "createTime": "2019-12-17T17:17:00.000+0000", "updateTime": "2019-12-28T08:25:21.000+0000" }, { "id": 9, "name": "冷饮冻食", "type": 1, "parentId": 0, "orderNum": 4, "createTime": "2019-12-20T05:45:28.000+0000", "updateTime": "2019-12-28T08:25:22.000+0000" }, { "id": 10, "name": "蔬菜蛋品", "type": 1, "parentId": 0, "orderNum": 5, "createTime": "2019-12-20T05:45:28.000+0000", "updateTime": "2019-12-28T08:25:23.000+0000" }, { "id": 27, "name": "美味菌菇", "type": 1, "parentId": 0, "orderNum": 7, "createTime": "2019-12-20T05:45:28.000+0000", "updateTime": "2020-02-10T15:20:36.000+0000" }, { "id": 4, "name": "橘子橙子", "type": 2, "parentId": 3, "orderNum": 1, "createTime": "2019-12-17T17:17:00.000+0000", "updateTime": "2019-12-28T08:25:10.000+0000" }, { "id": 7, "name": "螃蟹", "type": 2, "parentId": 5, "orderNum": 1, "createTime": "2019-12-17T17:17:00.000+0000", "updateTime": "2019-12-28T08:25:15.000+0000" }, { "id": 17, "name": "冰淇淋", "type": 2, "parentId": 9, "orderNum": 1, "createTime": "2019-12-17T17:17:00.000+0000", "updateTime": "2019-12-28T08:25:18.000+0000" }, { "id": 16, "name": "牛羊肉", "type": 2, "parentId": 6, "orderNum": 1, "createTime": "2019-12-17T17:17:00.000+0000", "updateTime": "2019-12-28T08:25:18.000+0000" } ], "pageNum": 1, "pageSize": 10, "size": 10, "startRow": 1, "endRow": 10, "pages": 2, "prePage": 0, "nextPage": 2, "isFirstPage": true, "isLastPage": false, "hasPreviousPage": false, "hasNextPage": true, "navigatePages": 8, "navigatepageNums": [ 1, 2 ], "navigateFirstPage": 1, "navigateLastPage": 2 } }
通过接口返回内容,可以看到【分类列表(平铺)】接口,是无差别的查询imooc_mall_category表,同时加入了分页功能;而且,可以看到,其要求接口的返回内容中的data需要是一个PageInfo分页对象;
二:分页技术,分析;
(1)以前接触过的分页查询;
以前在介绍Mybatis和Mybatis-Plus的时候,介绍过分页查询;可以先去快速看看;
(1)在Mybatis中:在介绍Mybatis的时候,【MyBatis进阶五:PageHelper分页插件;】介绍了一款可以用在Mybatis上的一款分页插件PageHelper(PS:这个插件不隶属于Mybatis,只是别人针对Mybatis开发的一款插件);
……………………………………………………
(2)我们在【SSM开发书评网7:项目准备与SSM整合五:Mybatis-Plus简介;SSM整合Mybatis-Plus;】中,介绍了在Spring MVC项目中,配置Mybatis-Plus,以及Mybatis-Plus的分页插件;
(3)在【SSM开发书评网12:图书列表分页及查询二:图书分页查询(1);(Dao和Service部分;使用技术是Mybatis-Plus分页查询;)】及后面几篇博客,介绍了Mybatis-Plus分页插件的具体应用;
(2)根据接口要求,分页功能分析;
因为,接口文档中要求,返回中的data,需要是一个【PageInfo对象,序列化JSON】;所以,可以使用PageHelper分页插件(具体是使用PageHelper中的PageInfo对象),来完成这个需求;
……………………………………………………
有关,PageHelper中的Page对象和PageInfo对象的区别,可以参考【附加:PageHelper分页插件的:Page和PageInfo的区别;】;
(3)本篇博客,重点是如何在Spring Boot项目中,使用PageHelper分页插件;
本篇博客的分页,采用的就是PageHelper这个分页插件;只是,我们之前介绍PageHelper的时候,是在纯Mybatis项目中,使用的;而,本篇博客就是在Spring Boot项目中使用PageHelper分页插件;
这二者基本上是一样的,只是在引入依赖等处存在略微的差别;
二:正式开发;
1.在CategoryController中,编写后台目录列表的方法:listCategoryForAdmin()方法;
/** * 后台的,分类目录列表 * @param pageNum * @param pageSize * @return */ @ApiOperation("后台分类目录列表") @GetMapping("/admin/category/list") @ResponseBody public ApiRestResponse listCategoryForAdmin(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize) { PageInfo pageInfo = categoryService.listForAdmin(pageNum, pageSize); return ApiRestResponse.success(pageInfo); }
说明:
(1)url,请求方式,参数,要符合接口要求;
(2)因为这儿只有两个个参数,参数不多,所以没有使用JavaBean接受,而是直接用方法参数去接收了;
(3)因为,接口返回中,data数据,要求是PageInfo对象;所以,如果一切成功时,ApiRestResponse统一返回对象的data,我们设为PageInfo;
(4)service层的查询数据方法,在下一部分介绍;
2.在CategoryServiceImpl实现类中,编写分页查询的方法listForAdmin();然后在CategoryService接口中,反向生成方法的声明;
(1)在CategoryServiceImpl实现类中,编写分页查询的方法listForAdmin();
/** * 查询所有的目录分类数据,并包装成PageInfo分页对象; * @param pageNum * @param pageSize * @return */ @Override public PageInfo listForAdmin(Integer pageNum, Integer pageSize) { //设置分页的:当前页,每一页的记录数; // 然后,查询结果先按照type排序(从小到大排序);如果type相同,就按照order_num排序; PageHelper.startPage(pageNum, pageSize, "type,order_num"); //调用Dao层的方法,去查询 List<Category> categoryList = categoryMapper.selectList(); //得到PageInfo对象 PageInfo pageInfo = new PageInfo(categoryList); return pageInfo; }
说明:
(1)这儿使用到了PageHelper分页插件;主要使用到了其中的PageInfo对象;所以,为了使用PageHelper分页插件,我们需要在pom.xml中引入PageHelper分页插件的依赖;
<!--pagehepler分页插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.13</version> </dependency>
(2)Dao层的selectList()方法,是查询所有目录分类数据;具体内容,在下一部分介绍;
……………………………………………………
(2)然后在CategoryService接口中,反向生成方法的声明;
3.在CategoryMapper接口中,定义查询所有分类目录的方法selectList();然后在CategoryMapper.xml中编写方法的SQL;
(1)在CategoryMapper接口中,定义查询所有分类目录的方法selectList();
……………………………………………………
(2)在CategoryMapper.xml中编写方法的SQL;
<select id="selectList" resultMap="BaseResultMap"> select <include refid="Base_Column_List"></include> from imooc_mall_category </select>
说明:
(1)这个SQL很简单,就是查询所有分类目录数据;
4.启动项目,测试;
PS:后台的【分类列表(平铺)】接口需要是管理员用户登录,才能操作;
为了方便观察,把调用接口返回的data数据,复制出来,通过一个json.cn这个接口格式化在线工具,看一下;
其实,我们接口返回这些数据后,交给前端就行了;前端会根据这些数据,组织显示;