3.5、对象查询
这里我再提一下,在我们根据id查找对象的时候,我先去缓存中就查找,如果缓存中没有再去数据库中查找。
拿map的key去查找。
@Override public Article findById(Integer articleId) { Article article = articleMap.get(articleId); if (article == null) { Article art = articleMapper.getById(articleId); return art; } return article; }
实现类完整代码:TagServiceImpl.java
package com.blog.personalblog.service.Impl; import com.blog.personalblog.bo.ArticleBO; import com.blog.personalblog.entity.Article; import com.blog.personalblog.mapper.ArticleMapper; import com.blog.personalblog.service.ArticleService; import com.github.pagehelper.PageHelper; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * @author: SuperMan * @create: 2021-12-01 */ @Log4j2 @Service public class ArticleServiceImpl implements ArticleService { @Autowired ArticleMapper articleMapper; /** * key:文章id * value: 文章 */ Map<Integer, Article> articleMap = new LinkedHashMap<>(); @Override @PostConstruct public void init() { List<Article> articleList = articleMapper.findAll(); try { for(Article article : articleList) { articleMap.put(article.getId(), article); } log.info("文章缓存数据加载完成"); } catch (Exception e) { log.error("文章缓存数据加载失败!", e.getMessage()); } } @Override public List<Article> getArticlePage(ArticleBO articleBO) { int pageNum = articleBO.getPageNum(); int pageSize = articleBO.getPageSize(); PageHelper.startPage(pageNum,pageSize); List<Article> articleList = articleMapper.getArticlePage(articleBO); return articleList; } @Override public void saveArticle(Article article) { articleMapper.createArticle(article); articleMap.put(article.getId(), article); } @Override public void updateArticle(Article article) { articleMapper.updateArticle(article); articleMap.put(article.getId(), article); } @Override public void deleteArticle(Integer articleId) { articleMapper.deleteArticle(articleId); articleMap.remove(articleId); } @Override public Article findById(Integer articleId) { Article article = articleMap.get(articleId); if (article == null) { Article art = articleMapper.getById(articleId); return art; } return article; } }
4、数据库查询接口实现
新建ArticleMapper.java
接口:
这个没有什么好讲的和以前几乎一样,我就直接展示代码了
package com.blog.personalblog.mapper; import com.blog.personalblog.bo.ArticleBO; import com.blog.personalblog.entity.Article; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; /** * @author: SuperMan * @create: 2021-12-01 */ @Repository public interface ArticleMapper { /** * 查询所有的文章列表 * @return */ List<Article> findAll(); /** * 创建文章 * @param article * @return */ int createArticle(Article article); /** * 修改文章 * @param article * @return */ int updateArticle(Article article); /** * 分类列表(分页) * @param articleBO * @return */ List<Article> getArticlePage(@Param("articleBO") ArticleBO articleBO); /** * 删除文章 * @param id */ void deleteArticle(Integer id); /** * 根据id查找分类 * @param id * @return */ Article getById(Integer id); }
5、编写数据库xml
这个的重点我在实现类中也已经讲过了,其余的都是正常的增删改的sql语句了。
新建一个ArticleMapper.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.ArticleMapper"> <resultMap id="BaseResultMap" type="com.blog.personalblog.entity.Article"> <result column="id" jdbcType="INTEGER" property="id"/> <result column="author" jdbcType="VARCHAR" property="author"/> <result column="title" jdbcType="VARCHAR" property="title"/> <result column="user_id" jdbcType="INTEGER" property="userId"/> <result column="category_id" jdbcType="INTEGER" property="categoryId"/> <result column="content" jdbcType="VARCHAR" property="content"/> <result column="views" jdbcType="BIGINT" property="views"/> <result column="total_words" jdbcType="BIGINT" property="totalWords"/> <result column="commentable_id" jdbcType="INTEGER" property="commentableId"/> <result column="art_status" jdbcType="INTEGER" property="artStatus"/> <result column="description" jdbcType="VARCHAR" property="description"/> <result column="image_url" jdbcType="VARCHAR" property="imageUrl"/> <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/> <result column="categoryname" jdbcType="VARCHAR" property="categoryName"></result> <collection property="tagList" ofType="com.blog.personalblog.entity.Tag"> <id column="sid" property="id"/> <result column="tag_name" property="tagName"/> <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/> </collection> </resultMap> <sql id="Base_Column_List"> id, author, title, user_id, category_id, content, views, total_words, commentable_id, art_status, description, image_url, create_time, update_time </sql> <select id="findAll" resultMap="BaseResultMap"> select <include refid="Base_Column_List"/> from person_article </select> <select id="getArticlePage" resultMap="BaseResultMap" parameterType="com.blog.personalblog.bo.ArticleBO"> SELECT a.*, tag.article_id, tag.tag_id, s.id AS sid, u.category_name categoryname, s.tag_name FROM person_article a left join person_category u on a.category_id = u.category_id left join person_article_tag tag on a.id = tag.article_id left join person_tag s on s.id = tag.tag_id <where> <if test="articleBO.title != null"> and a.title like '%${articleBO.title}%' </if> <if test="articleBO.categoryId != null"> and a.category_id = #{articleBO.categoryId} </if> <if test="articleBO.artStatus != null"> and a.art_status = #{articleBO.artStatus} </if> </where> </select> <insert id="createArticle" parameterType="com.blog.personalblog.entity.Article" useGeneratedKeys="true" keyProperty="id"> INSERT INTO person_article (author, title, user_id, category_id, content, views, total_words, commentable_id, art_status, description, image_url) VALUES(#{author}, #{title}, #{userId}, #{categoryId}, #{content}, #{views}, #{totalWords}, #{commentableId}, #{artStatus}, #{description}, #{imageUrl}) </insert> <update id="updateArticle" parameterType="com.blog.personalblog.entity.Tag"> update person_article <set> author = #{author}, title = #{title}, user_id = #{userId}, category_id = #{categoryId}, views = #{views}, total_words = #{totalWords}, commentable_id = #{commentableId}, art_status = #{artStatus}, description = #{description}, image_url = #{imageUrl} </set> WHERE id = #{id} </update> <delete id="deleteArticle" parameterType="java.lang.Integer"> delete from person_article where id = #{id, jdbcType=INTEGER} </delete> <select id="getById" resultType="com.blog.personalblog.entity.Article"> select * from person_article where id = #{id} </select> </mapper>
6、编写接口层
新建一个文章的接口类:ArticleController.java
package com.blog.personalblog.controller; import com.blog.personalblog.bo.ArticleBO; import com.blog.personalblog.config.page.PageRequest; import com.blog.personalblog.config.page.PageResult; import com.blog.personalblog.entity.Article; import com.blog.personalblog.service.ArticleService; import com.blog.personalblog.util.JsonResult; 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-12-01 */ @Api(tags = "文章管理") @RestController @RequestMapping("/article") public class ArticleController { @Autowired ArticleService articleService; /** * 文章列表 * @param articleBO * @return */ @ApiOperation(value = "文章列表") @PostMapping("list") public JsonResult<Object> listPage(@RequestBody @Valid ArticleBO articleBO) { List<Article> articleList = articleService.getArticlePage(articleBO); PageInfo pageInfo = new PageInfo(articleList); PageRequest pageRequest = new PageRequest(); pageRequest.setPageNum(articleBO.getPageNum()); pageRequest.setPageSize(articleBO.getPageSize()); PageResult pageResult = PageUtil.getPageResult(pageRequest, pageInfo); return JsonResult.success(pageResult); } /** * 添加文章 * @return */ @ApiOperation(value = "添加文章") @PostMapping("/create") public JsonResult<Object> articleCreate(@RequestBody @Valid Article article) { articleService.saveArticle(article); return JsonResult.success(); } /** * 修改文章 * @return */ @ApiOperation(value = "修改文章") @PostMapping("/update") public JsonResult<Object> articleUpdate(@RequestBody @Valid Article article) { articleService.updateArticle(article); return JsonResult.success(); } /** * 删除文章 * @return */ @ApiOperation(value = "删除文章") @DeleteMapping("/delete/{id}") public JsonResult<Object> articleDelete(@PathVariable(value = "id") int id) { articleService.deleteArticle(id); return JsonResult.success(); } /** * 根据文章id查找 * @param id * @return */ @ApiOperation(value = "根据文章id查找") @PostMapping("/getArticle/{id}") public JsonResult<Object> getArticleById(@PathVariable(value = "id") int id) { Article article = articleService.findById(id); return JsonResult.success(article); } }
以上的功能都是文章基本的东西,后面我们还会修改和添加功能,具体的会在第二篇进行补充和完善。
二、测试
接下来启动我们的项目,我们测试一下我们的接口,先能保证接口都是通的,才能进行下一步的操作。
1、添加文章接口测试
打开PostMan
,我们新建一个文章管理的文件夹,当然你也可以选择在Swagger
接口中进行测试,我们这里用Postman进行测试。
我们将添加的参数以JSON的格式进行传参。
打开数据库,查看有没有添加成功
2、修改文章接口测试
修改接口基本上和添加的参数一致,就是比添加多了一个文章id,我们要修改那一篇文章要告诉后台的服务,才能进行相关的修改。
再新建 一个修改文章的接口。再看一下数据库有没有修改
3、删除文章接口测试
删除的很简单,就是要删除哪一篇文章传入个id就可以了。
我们这里使用@DeleteMapping
请求方式看一下数据库中的数据已经成功的删除了
4、查询接口测试
查询的接口我们会有参数进行查询的,同时还带有分页查询。
这个查询牵连的表比较多,我们要确保分类表和标签表里有值,然后还要在关联表中手动添加一些值,方便我们进行测试。(2)标签表:(3)文章表:我就以这个为例了,分类设置的为1(4)然后看关联表:
大家可以看到关联表中我一共放了两个值,文章id为1的有两个标签,由于我们关联表功能还没和文章连接,我们自己先搞点值测一测接口。这里说明文章有两个标签,就说明我们在查找出来的文章中会有两个标签进行展示。
新建一个请求接口:
我们先测试以下什么参数都不传,将所有的数据都查询出来。
看下返回的数据,标签确实有两条数据,说明我们写的没有问题。然后下面再多添加几条数据,进行参数的测试。我们查询title标题的模糊查询,看是否能查出来。
看确实查询出来了,而且只查出来这一条符合条件的,说明我们的条件查询也是对的,还有剩下的两个参数大家自己测一测吧,我就不一一列举了。
好啦!这一篇文章写了很长时间,搞了一个元旦,新的一年大家努力啊!麻烦大家给点个赞吧。
在这里我收集下大家的反馈!