做一个Springboot文章分类模块

目录

文章分类

1、新增文章分类

前言

代码编写

测试

2、 文章分类列表

前言

代码编写

测试

3、获取文章列表详情

前言

代码实现

测试

4、更新文章分类

前言

代码实现

测试

5、删除文章分类

前言

代码实现

测试

分页查询

文章列表条件分页

前言

代码编写

测试


文章分类

1、新增文章分类

前言

继续承接springboot课设

新增一个文章分类首先就要查询数据库中是否已经存在该分类。其他的就没什么好说的,有了上两篇博客编写代码的经验,这次的应该就挺容易了

代码编写

Controller

@RestController
public class CategoryController {@Autowiredprivate CategoryService categoryService;@PostMappingpublic Result category(@RequestBody @Validated Category category){String categoryName = category.getCategoryName();if (StringUtils.hasLength(categoryService.selectByName(categoryName))){return Result.error("分类重复");}categoryService.category(category);return Result.success();}}

Service

@Service
public class CategoryServiceImpl implements CategoryService {@Autowiredprivate CategoryMapper categoryMapper;@Overridepublic String selectByName(String categoryName) {return categoryMapper.selectByName(categoryName);}@Overridepublic void category(Category category) {Map<String,Object> map = ThreadLocalUtil.get();Integer createId = (Integer) map.get("id");category.setCreateUser(createId);categoryMapper.category(category);}
}

mapper

    @Select("select * from category where category_name = #{categoryName}")String selectByName(String categoryName);    @Insert("insert into category (category_name, category_alias, create_user, create_time, update_time) " +"value(#{categoryName},#{categoryAlias},#{createUser},now(),now())")void category(Category category);

测试

当数据为空时

当数据重复时 

2、 文章分类列表

前言

获取文章分类的这个列表,也就是说响应的结果data就是一个list集合,即Result返回的就是Result<List<Category>>

发起这个请求那么就开始查询分类列表,不需要参数,那么Controller空参就可以了

注:这里为什么与新增文章分类的接口都是/category?不会冲突吗?

        不会,是因为那个新增的接口的请求方式是post请求,而查询文章列表的请求方式是get请求。因此虽然url的名字一样,但由于请求方式不同,它们实际上并不是同一个接口。

@JsonFormat注解可以更改时间显示的格式

代码编写

Controller

    @GetMappingpublic Result<List<Category>> list(){List<Category> categoriesList = categoryService.list();return Result.success(categoriesList);}

Service

    @Overridepublic List<Category> list() {Map<String,Object> map = ThreadLocalUtil.get();Integer userId = (Integer) map.get("id");return categoryMapper.list(userId);}

Mapper

    @Select("select * from category where create_user = #{userId}")List<Category> list(Integer userId);

测试

3、获取文章列表详情

前言

就是根据id查询分类,getById

get请求携带的参数直接就在url上,如localhost:8888/category/detail?id=6

代码实现

Controller

    @GetMapping("/detail")public Result<Category> detail(Integer id){Category category = categoryService.detail(id);return Result.success(category);}

Service

    @Overridepublic Category detail(Integer id) {return categoryMapper.detail(id);}

Mapper

    @Select("select * from category where id = #{id}")Category detail(Integer id);

测试

4、更新文章分类

前言

        前端传递一个category类,修改原本的数据,应用put请求。这里直接根据id修改,但是如果故意选一个不存在的分类id,那就会出现错误。所以可以用Spring Vaildation来加一个@NotNull来标注一下,但这样又会出出现的新的问题,新增分类的接口就无法使用了。因为新增分类不需要填写id,id是数据库自增的,但是此时没有id就无法通过参数校验,所以要使用新的方法,分组校验。

分组校验:把校验项进行归类分组,在完成不同的功能时,校验指定组中的验项

代码实现

在实体类中添加

    @NotNull(groups = Update.class)private Integer id;//主键ID@NotNull()@NotEmptyprivate String categoryName;//分类名称@NotNull()@NotEmptyprivate String categoryAlias;//分类别名public interface Add extends Default{}public interface Update extends Default{}

Controller

    @PutMapping()public Result updateCategory(@RequestBody @Validated(Category.Update.class) Category category){categoryService.updateCategory(category);return Result.success();}

Service

    @Overridepublic void updateCategory(Category category) {categoryMapper.updateCategory(category);}

Mapper

    @Update("update category set category_name=#{categoryName},category_alias=#{categoryAlias}" +",update_time = now() where id = #{id}")void updateCategory(Category category);

测试

5、删除文章分类

前言

这个就更没什么可说的了

代码实现

Controller

    @DeleteMapping()public Result deleteCategory(Integer id){categoryService.deleteCategory(id);return Result.success();}

Service

    @Overridepublic void deleteCategory(Integer id) {categoryMapper.deleteCategory(id);}

Mapper

    @Delete("delete from category where id = #{id}")void deleteCategory(Integer id);

测试


分页查询

文章列表条件分页

前言

做分页查询通常需要一个类似的对象

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean <T>{private Long total;//总条数private List<T> items;//当前页数据集合
}

         将来后台会将查询好的对象封装到这个对象中。为什么要单独设计一个对象?先看响应数据的例子

        由于前端需要一个total参数,来表示此时有多少条信息,而这个参数如果放在items中,也就是文章里面,这是并不合适的。因此需要的独自将文章和这个total参数加起来合成一个新的对象来完成这个需求

        在请求中中有四个参数,num和size是必填的,剩下两个参数前面@RequestParam(required = false) ,这样即使不携带这两个参数也不会报错

        categoryId和state前端可能不会发送过来,所以后端的sql不能写死,要写成动态sql,因此要使用xml映射文件。

开启分页查询需要引入一个依赖PageHelper

        <!-- PageHelper --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version></dependency>

底层原理就是会自动地将pageNum和pageSize拼接到sql语句后面并加上limit,因此mapper里传递地参数就不再次需要传递pageNum和pageSize。

如果你不想使用PageHelper插件那就得把这两个参数传递进mapper里面自己写limit分页sql了

代码编写

Controller

    @GetMappingpublic Result<PageBean<Article>> list(Integer pageNum,Integer pageSize,@RequestParam(required = false) Integer categoryId,@RequestParam(required = false) String state){PageBean<Article> pb = articleService.list(pageNum,pageSize,categoryId,state);return Result.success(pb);}

Service

@Overridepublic PageBean<Article> list(Integer pageNum, Integer pageSize, Integer categoryId, String state) {//1、创建PageBean对象PageBean<Article> pb = new PageBean<>();//2、开启分页查询PageHelper.startPage(pageNum,pageSize);//3、调用mapperMap<String,Object> map = ThreadLocalUtil.get();Integer userId = (Integer) map.get("id");List<Article> as = articleMapper.list(userId,categoryId,state);//Page中提供了方法,可以获取PageHelper分页查询后,得到的总记录条数和当前页数据Page<Article> p = (Page<Article>) as;//把数据填充到PageBean对象中pb.setTotal(p.getTotal());pb.setItems(p.getResult());return pb;}

之所以要把list强转一下是因为Page是List的一个实现类。在多态中,父类无法调用子类的方法,只有强转成子类才可以调用子类中的特有的方法。 

Mapper

    List<Article> list(Integer userId, Integer categoryId, String state);

映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wal.bigevent.mapper.ArticleMapper"><select id="list" resultType="com.wal.bigevent.pojo.Article">select * from article<where><if test="categoryId != null">category_id = #{categoryId}</if><if test="state!=null">and state = #{state}</if>and create_user = #{userId}</where></select>
</mapper>

测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/174182.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty Review - 核心组件扫盲

文章目录 PreNetty Reactor 的工作架构图CodePOMServerClient Netty 重要组件taskQueue任务队列scheduleTaskQueue延时任务队列Future异步机制Bootstrap与ServerBootStrapgroup()channel()option()与childOption()ChannelPipelinebind()优雅地关闭EventLoopGroupChannleChannel…

ts学习02-数据类型

新建index.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </h…

【数据结构】经典单链表OJ题!!

学习完单链表&#xff0c;习题就成了最好的巩固方式 目录 1.链表分割:思路&#xff1a;代码实现&#xff1a; 2.随机链表的复制:思路1&#xff1a;代码实现&#xff1a;思路2&#xff1a;代码实现&#xff1a; 3.环形链表:3.1环形链表1:思路&#xff1a;代码实现&#xff1a; 3…

Redis的特性以及使用场景

分布式发展历程参考 陈佬 http://t.csdnimg.cn/yYtWK 介绍redis Redis&#xff08;Remote Dictionary Server&#xff09;是一个基于客户端-服务器架构的在内存中存储数据的中间件&#xff0c;属于NoSQL的一种。它可以用作数据库、缓存/会话存储以及消息队列。 作为一种内存数…

Apache Airflow (三) :Airflow WebUI操作介绍

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

KB / KiB,MB / MiB,GB / GiB,… 的区别是什么?

GB和GiB&#xff1a;https://www.zhihu.com/question/24601215 1 显存容量指的是显存能够存储的数据量&#xff0c;单位是GB&#xff0c;显存容量越大 按照目前计算机存储来说&#xff0c;还是应该遵循二进制 严格意义上来讲&#xff0c;1 GB (Gigabyte)10^9 KB&#xff0c;而…

Unity随笔:C#运行时

Unity是如何编译运行C#的 &#xff08;1&#xff09;Unity会通过编译器将C#脚本编译成IL指令。 Unity会通过Roslyn来对C#代码进行编译&#xff0c;生成中间IL指令集。 当我们每次修改或者添加新的C#代码文件&#xff0c;Unity界面的右下角会出现短暂的“转圈”现象。这就意味…

Vue3-TypeScript-Threejs:导入外部的glb格式3D模型

一、直接上代码&#xff0c;在vue3-typescript-threejs 项目 导入外部的glb格式3D模型 极简代码&#xff0c;快速理解 <template><div ref"container"></div></template><script lang"ts" setup>import { onMounted, ref …

datax 搭建使用

文章目录 datax 环境搭建使用一、解压文件二、配置 json 文件三、执行命令 datax 环境搭建使用 用于全量同步 一、解压文件 将包上传至服务器 输入命令&#xff1a; tar -zxvf datax.tar.gz -C /opt/module/ 将包 解压到 /opt/module 目录 解压完之后&#xff0c;不需要任何…

NOIP 2017 宝藏----Java题解

目录 NOIP 2017 宝藏 题目描述 输入描述: 输出描述: 输入 输出 说明 输入 输出 说明 备注: 代码实现&#xff1a; NOIP 2017 宝藏 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO For…

Meta开源支持1000多种语言的文本转语音与语音识别大语言模型

据不完全统计,地球上有超过7000多种语言,而现在的大语言模型仅仅只涉及到了主流的100多种语言。相对全球7000多种语言来讲,这仅仅只是其中的一小部分。如何让全球的人获益,把大语言模型扩展到更多的语言上,一直是大语言模型研究的重点。Meta发布了涵盖 1406 种语言的预训练…

修改Openwrt软路由的web端口

如何修改openwrt路由器的web访问端口号&#xff1f; 在OpenWrt路由器上&#xff0c;如何修改Web访问端口号&#xff0c;通常涉及到修改HTTP服务器的配置文件。默认情况下&#xff0c;OpenWrt使用的HTTP服务器是uHTTPd。 以下是修改Web访问端口号的步骤&#xff1a; 一、通过…