⭐ 作者简介:码上言
⭐ 代表教程:Spring Boot + vue-element 开发个人博客项目实战教程
项目部署视频
https://www.bilibili.com/video/BV1sg4y1A7Kv/?vd_source=dc7bf298d3c608d281c16239b3f5167b
文章目录
前言
前面我们已经把用户功能完成了,包括接入Swagger
文档、代码接口调试等操作,基础的东西还是要经常的练习,接下来我们要完成博客文章的分类功能,正如我们在创建文章的时候会选择文章属于哪一类,是Java还是C还是前端等相关的文章,这个需要我们进行单独的管理,尽量减少多表的关联。
一、分页插件Pagehelper
由于分类可能比较多,我们页面不可能全部展示出来,所以我们要使用数据分页,目的就是使数据不全部展示出来,影响页面的美观和布局,分页重要的就是第几页和一页展示几条数据的展示由于我们使用的是Mybatis所以我们来借助它的分页插件来完成分页,首先要将分页插件引入到我们项目中。
官方网址:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md
1、引入依赖
我们把下面的依赖复制到pom.xml
文件中添加依赖,别忘了刷新Maven
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.0</version> </dependency>
如果下载不下来的话还可以手动下载jar包进行引入。
你可以从下面的地址中下载最新版本的 jar 包
● https://oss.sonatype.org/content/repositories/releases/com/github/pagehelper/pagehelper/
● https://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/
由于使用了sql 解析工具,你还需要下载 jsqlparser.jar(需要和PageHelper 依赖的版本一致) :
● https://repo1.maven.org/maven2/com/github/jsqlparser/jsqlparser/
2、配置分页插件
然后到我们的配置文件application.yml
中添加分页插件的配置。
pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql
现在我们就可以在我们的项目中使用了。
3、分页请求类封装
我们将这个请求的类进行封装,因为这个是公共的分页请求,在以后的功能中还会用到,所以我们将请求类进行分装,这个是前端给我们传过来的参数,一共就两个属性,一个是页数,另一个是一页的数量。
我们在工具包config
包中再建一个page
包,然后把分页的类放在这个page包中。
新建一个请求类:PageRequest.java
package com.blog.personalblog.util; import lombok.Data; /** * 分页请求 * * @author: SuperMan * @create: 2021-11-22 */ @Data public class PageRequest { /** * 页码 */ private int pageNum; /** * 每页的数据条数 */ private int pageSize; }
4、分页返回类封装
我们在page包下再建一个返回类,主要放我们分页查询返回的数据。
新建一个分页返回类:PageResult.java
package com.blog.personalblog.config.page; import lombok.Data; import java.util.List; /** * 分页返回类 * * @author: SuperMan * @create: 2021-11-22 */ @Data public class PageResult { /** * 当前页码 */ private int pageNum; /** * 每页数量 */ private int pageSize; /** * 记录总数 */ private long totalSize; /** * 页码总数 */ private int totalPages; /** * 存放返回数据 */ private List<?> result; }
二、分类功能代码实现
总的添加的类如下:
1、添加实体类
首先新建一个分类的实体类为:Category.java
类,代码和数据库字段对应即可。
package com.blog.personalblog.entity; import lombok.Data; import java.time.LocalDateTime; /** * 博客分类 * * @author: SuperMan * @create: 2021-11-21 */ @Data public class Category { /** * 主键id */ private Integer categoryId; /** * 分类名称 */ private String categoryName; /** * 创建时间 */ private LocalDateTime createTime; /** * 更新时间 */ private LocalDateTime updateTime; }
2、添加业务接口
和用户的一样,在我们创建的service
包中,创建一个CategoryService.java
类,具体干嘛的可以去看用户实现的那一篇,我这里不再多说,现在主要是多写代码。
package com.blog.personalblog.service; import com.blog.personalblog.entity.Category; import com.blog.personalblog.config.page.PageRequest; import java.util.List; /** * 博客分类实现接口 * * @author: SuperMan * @create: 2021-11-21 */ public interface CategoryService { /** * 获取所有的分类(分页) * @return */ List<Category> getCategoryPage(PageRequest pageRequest); /** * 新建分类 * @param category * @return */ int saveCategory(Category category); /** * 修改分类 * @param category * @return */ int updateCategory(Category category); /** * 删除分类 * @param categoryId */ void deleteCategory(Integer categoryId); /** * 根据分类id查找分类 * @param categoryId * @return */ Category findById(Integer categoryId); }
3、添加业务接口实现类
然后和用户一样,在Impl
包中新建一个接口的实现类为CategoryServiceImpl.java
,主要实现的分类管理的增删改查等操作。基本上和用户表的一样就是查询是分页查询要注意。
package com.blog.personalblog.service.Impl; import com.blog.personalblog.entity.Category; import com.blog.personalblog.mapper.CategoryMapper; import com.blog.personalblog.service.CategoryService; import com.blog.personalblog.config.page.PageRequest; import com.github.pagehelper.PageHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * 博客分类实现类 * * @author: SuperMan * @create: 2021-11-21 */ @Service public class CategoryServiceImpl implements CategoryService { @Autowired CategoryMapper categoryMapper; @Override public List<Category> getCategoryPage(PageRequest pageRequest) { int pageNum = pageRequest.getPageNum(); int pageSize = pageRequest.getPageSize(); PageHelper.startPage(pageNum,pageSize); List<Category> categoryList = categoryMapper.getCategoryPage(); return categoryList; } @Override public int saveCategory(Category category) { return categoryMapper.create(category); } @Override public int updateCategory(Category category) { return categoryMapper.update(category); } @Override public void deleteCategory(Integer categoryId) { categoryMapper.delete(categoryId); } @Override public Category findById(Integer categoryId) { Category category = categoryMapper.getById(categoryId); if (category == null) { return null; } return category; } }
这个里面重点就是分页的接口实现,通过我们前端传过来的两个值,使用PageHelper插件进行分页。不懂得可以去官方文档看看。
4、数据库查询接口实现
紧接着我们在mapper
包中新建一个分类的mapper。
CategoryMapper.java
package com.blog.personalblog.mapper; import com.blog.personalblog.entity.Category; import org.springframework.stereotype.Repository; import java.util.List; /** * 博客分类数据接口 * * @author: SuperMan * @create: 2021-11-21 */ @Repository public interface CategoryMapper { /** * 创建 * @param category * @return */ int create(Category category); /** * 修改 * @param category * @return */ int update(Category category); /** * 分类列表(分页) * @return */ List<Category> getCategoryPage(); /** * 删除 * @param id */ void delete(Integer id); /** * 根据id查找分类 * @param id * @return */ Category getById(Integer id); }
5、编写数据库xml
我们在resources
文件下的mapper
文件夹中新建一个CategoryMapper.xml
文件。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.blog.personalblog.mapper.CategoryMapper"> <resultMap id="BaseResultMap" type="com.blog.personalblog.entity.Category"> <result column="category_id" jdbcType="INTEGER" property="categoryId"/> <result column="category_name" jdbcType="VARCHAR" property="categoryName"/> <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/> </resultMap> <select id="getCategoryPage" resultMap="BaseResultMap"> select * from person_category </select> <insert id="create" parameterType="com.blog.personalblog.entity.Category" useGeneratedKeys="true" keyProperty="categoryId"> INSERT INTO person_category (category_name) VALUES(#{categoryName}) </insert> <update id="update" parameterType="com.blog.personalblog.entity.Category"> update person_category <set> category_name = #{categoryName} </set> WHERE category_id = #{categoryId} </update> <delete id="delete" parameterType="java.lang.Integer"> delete from person_category where category_id = #{categoryId, jdbcType=INTEGER} </delete> <select id="getById" resultType="com.blog.personalblog.entity.Category"> select category_id from person_category where category_id = #{categoryId} </select> </mapper>
6、编写接口层
最后写我们的controller
层,这里我们先对分页返回的数据进行处理一下,我们在util包
中新建一个分页工具为:PageUtil.java
package com.blog.personalblog.util; import com.blog.personalblog.config.page.PageRequest; import com.blog.personalblog.config.page.PageResult; import com.github.pagehelper.PageInfo; /** * 分页工具类 * * @author: SuperMan * @create: 2021-11-22 */ public class PageUtil { /** * 分页信息封装 * @param pageRequest * @param pageInfo * @return */ public static PageResult getPageResult(PageRequest pageRequest, PageInfo<?> pageInfo){ PageResult pageResult = new PageResult(); pageResult.setPageNum(pageInfo.getPageNum()); pageResult.setPageSize(pageInfo.getPageSize()); pageResult.setTotalSize(pageInfo.getTotal()); pageResult.setTotalPages(pageInfo.getPages()); pageResult.setResult(pageInfo.getList()); return pageResult; } }
这个主要是把返回的数据都封装到PageResult
返回类中,里面含有分页的信息和数据列表。
接下来编写我们的controller
,基本上和用户的一样,除了分页的列表。别忘了加上Swagger
接口。
package com.blog.personalblog.controller; import com.blog.personalblog.entity.Category; import com.blog.personalblog.service.CategoryService; import com.blog.personalblog.util.JsonResult; import com.blog.personalblog.config.page.PageRequest; import com.blog.personalblog.config.page.PageResult; import com.blog.personalblog.util.PageUtil; import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; /** * 分类管理接口 * * @author: SuperMan * @create: 2021-11-21 */ @Api(tags = "分类管理") @RestController @RequestMapping("/category") public class CategoryController { @Autowired CategoryService categoryService; /** * 分页查询列表 * @param pageRequest * @return */ @PostMapping("list") public JsonResult<Object> listPage(@RequestBody @Valid PageRequest pageRequest) { List<Category> categoryList = categoryService.getCategoryPage(pageRequest); PageInfo pageInfo = new PageInfo(categoryList); PageResult pageResult = PageUtil.getPageResult(pageRequest, pageInfo); return JsonResult.success(pageResult); } /** * 添加分类 * @return */ @ApiOperation(value = "添加分类") @PostMapping("/create") public JsonResult<Object> categoryCreate(@RequestBody @Valid Category category) { int isStatus = categoryService.saveCategory(category); if (isStatus == 0) { return JsonResult.error("添加分类失败"); } return JsonResult.success(); } /** * 修改分类 * @return */ @ApiOperation(value = "修改分类") @PostMapping("/update") public JsonResult<Object> categoryUpdate(@RequestBody @Valid Category category) { int isStatus = categoryService.updateCategory(category); if (isStatus == 0) { return JsonResult.error("修改分类失败"); } return JsonResult.success(); } /** * 删除 * @return */ @ApiOperation(value = "删除分类") @PostMapping("/delete/{id}") public JsonResult<Object> categoryDelete(@PathVariable(value = "id") int id) { categoryService.deleteCategory(id); return JsonResult.success(); } }
三、测试
分类功能功能已经实现,接下来大家可以自己用postman
进行测试这四个接口是否有错误,和用户的基本一致。
这里我只说明一下查询的接口,我们需要传入两个参数。大家多添加几条分类进行分页测试。好啦,这一篇就到这里了,文章分类功能已经基本上完成。添加、修改、删除留给大家自己测一测。麻烦大家给点点赞啊!来点动力哈哈