做一个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.mzph.cn/news/142963.shtml

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

相关文章

第 19 章 网络编程

网络可以使不同物理位置上的计算机达到资源共享和通信的目的&#xff0c;在Java中也提供了专门的网络开发程序包--java.net&#xff0c;以方便开发者进行网络程序的开发&#xff0c;本章将讲解TCP与UDP程序开发 19.1 网络编程简介 将地理位置不同的、具有独立功能的多台计算机…

三菱PLC小项目系列—传送带多地控制

目录 一、项目描述 二、IO口分配 三、项目程序 四、总结 一、项目描述 化工厂中有传送带进行原料传送加工&#xff0c;当按下启动按钮SB1或者SB2&#xff0c;电机M1接通控制传送带运转&#xff0c;直至按下停止按钮SB3&#xff0c;电机停止并使传送带停止运行。 二、IO口分…

远程创建分支本地VScode看不到分支

在代码存放处右击&#xff0c;点击Git Bash Here 输入git fetch–从远程仓库中获取最新的分支代码和提交历史 就OK啦&#xff0c;现在分支可以正常查看了

关于SpannableStringBuilder使用ClickableSpan导致内存泄漏

在对text文字部分设置点击事件就要用到ClickableSpan&#xff0c;但是这个会导致内存泄漏&#xff0c;在回调onClick方法中设置跳转代码会导致我们的activity无法被释放。 在activity的onDestroy方法中即使使用SpannableStringBuilder的removespan和clear方法都没用。 可以使用…

Failed to restart networking.service: Unit networking.service not found.

虚拟机Vmware中的Ubuntu20.0没有网络,ifconfig命令没有IP 如果在VMware中运行的Ubuntu 20.04虚拟机没有网络,并且ifconfig命令没有显示IP地址,你可以采取以下几个步骤来诊断和解决问题: 确认虚拟机网络设置: 确保虚拟机的网络适配器是开启的,并且配置正确。确认是否选择…

多行业用户齐聚,2023 IoTDB 用户大会详细议程更新!

上周我们官宣了 2023 IoTDB 用户大会举办的消息&#xff0c;获得了多方小伙伴们积极的响应&#xff0c;作为第一次线下大会&#xff0c;我们已经开始期待与大家线下相见&#xff01; 为了回应大家对于大会内容的期待&#xff0c;我们火速把更加详细的议程“搬运”来啦~ 20 位大…

【Java】集合(一)单列集合List

1.集合 可以动态保存任意多个对象&#xff0c;并提供了一系列的操作对象的方法&#xff1a;add、remove、set、get等。 2.集合框架体系 分为两大类&#xff1a; 单列集合和双列集合 3.List接口基本介绍 List接口是Collection接口的子接口 List集合类中元素有序&#xff0…

前后端设置跨域问题

前端 const {defineConfig} require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServer: { //记住&#xff0c;别写错了devServer//设置本地默认端口 选填port: 8080,proxy: { //设置代理&#xff0c;必…

Django知识

目录 一.request对象方法 1.request.method 2.request.POST 3.request.GET 4.request.FILES 5.request.path 二.FBV与CBV引入 1.FBV 2.CBV (1)路由 (2)视图 3.详解 (1)FBV (2)CBV (3)小结 三.CBV源码剖析 1.as_view方法 &#xff08;1&#xff09;路由对应函…

Android Audio实战——音量设置Hal(二十)

本来上一篇分析音量设置中对于 setCurrentGainIndex 方法我们分析到了 native 层就没有往下分析,但这这里还有准备再看看下面的流程。 一、源码分析 1、android_media_AudioSystem.cpp 源码位置:frameworks/base/core/jni/android_media_AudioSystem.cpp static jint and…

smt贴片加工上料错误怎么控制?

SMT贴片加工上料错误怎么控制&#xff1f;电子行业的持续创新挑战着该行业各个层次的供应商&#xff0c;以制造出在尺寸和性能方面具有越来越强大功能的设备。在这种情况下&#xff0c;电路板的设计开发与实际生产之间的差距是趋于增加&#xff0c;特别是因为设计人员通常没有与…

Ubuntu20.04 安装 Matlab R2021a

1. 压缩包分卷解压缩 将下载下来的压缩包分卷解压缩 Ubuntu自带的archive会解压出错&#xff0c;不适用于分卷解压。 需要下载7zip &#xff08;sudo apt-get install 走起&#xff09; zip -F xxx.zip --out XXX.zip # xxx为主文件名 # XXX.zip为输出路径&#xff0c;上面的…

【git】git本地仓库命令操作详解

这篇文章主要是针对git的命令行操作进行讲解&#xff0c;工具操作的基础也是命令行&#xff0c;如果基本命令操作都不理解&#xff0c;就算是会工具操作&#xff0c;真正遇到问题还是一脸懵逼 1.操作逻辑图 本地仓库的命令操作关系图 2.基本命令操作 1.1建立一个gittest01文…

二维码智慧门牌管理系统升级解决方案:标准地址ID查询服务:高效、精准

文章目录 前言一、解决查询效率低下的问题二、提高信息精准度三、应用案例 前言 随着城市的发展和信息化步伐的加快&#xff0c;二维码智慧门牌管理系统已成为各大城市管理部门和企事业单位的必备工具。然而&#xff0c;实际应用中存在一些问题&#xff0c;如查询效率低下、信…

navicat导入已有sql表过程

已知我有一个外部的sql表&#xff0c;如图&#xff1a; 想要将其导入navicat并运行。 看一下我的navicat&#xff0c; navicat里已有的数据库并没有library&#xff0c;所以需要建立一个同名的library数据库来存储library.sql文件。 具体步骤如下&#xff1a; 在“本地连接”…

「Verilog学习笔记」优先编码器Ⅰ

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 分析编码器的功能表&#xff1a; 当使能El1时&#xff0c;编码器工作&#xff1a;而当E10时&#xff0c;禁止编码器工作&#xff0c;此时不论8个输入端为何种状态&…

U盘格式化数据恢复软件EasyRcovery2024免费版

出差办公&#xff0c;我习惯将所有的文件都拷贝到U盘里随身携带&#xff0c;这样就省去了带电脑的麻烦。U盘虽然方便携带&#xff0c;但也有一个致命的缺陷&#xff0c;就是删除的文件会被彻底清理&#xff0c;而不是保存在回收站。一旦不小心将U盘格式化&#xff0c;对我来说就…

C++入门(1)

目录 一、什么是C 1、C关键字(C98) 2、C兼容C 二、C程序预处理指令 三、命名空间 1、命名冲突 第一种&#xff1a; 第二种&#xff1a; 2、域作用限定符 3、实现命名空间 4、命名空间冲突 5、访问命名空间 6、命名空间“std” 四、输入输出 1、定义 2、自动识…

目标检测——Yolo系列(YOLOv1/2/v3/4/5/x/6/7/8)

目标检测概述 什么是目标检测&#xff1f; 滑动窗口&#xff08;Sliding Window&#xff09; 滑动窗口的效率问题和改进 滑动窗口的效率问题&#xff1a;计算成本很大 改进思路 1&#xff1a;使用启发式算法替换暴力遍历 例如 R-CNN&#xff0c;Fast R-CNN 中使用 Selectiv…

通过京东商品ID获取京东优惠券信息,京东优惠券信息接口,京东优惠券API接口,接口说明接入方案

京东商品详情API接口的作用是通过接口获取京东平台上商品的详细信息&#xff0c;包括商品的标题、价格、描述、图片、库存等信息。该接口可以供开发者或第三方使用&#xff0c;以便在自己的应用程序、网站或平台中展示和销售京东的商品。 Java请求示例 import java.io.Buffer…