springboot3项目练习详细步骤(第三部分:文章管理模块)

目录

发布文章

接口文档

 业务实现

自定义参数校验

项目参数要求 

实现思路 

实现步骤

文章列表(条件分页)

接口文档 

业务实现 

mapper映射 

更新文章

 接口文档

 业务实现

获取文章详情 

接口文档 

业务实现 

删除文章 

接口文档 

业务实现 


文章管理业务表结构

发布文章

接口文档

 业务实现

创建ArticleController类并完成请求的方法

@RestController
@RequestMapping("/article")
public class ArticleController {

    @Autowired
    private ArticleService articleService; //注入ArticleService接口

    @PostMapping
    public Result add(@RequestBody Article article){
        articleService.add(article);
        return Result.success();
    }
}

创建ArticleService接口并完成方法

public interface ArticleService {
    //新增文章
    void add(Article article);
}

创建ArticleServiceimpl接口实现类并完成方法

@Service
public class ArticleServiceimpl implements ArticleService {

    @Autowired
    private ArticleMapper articleMapper; //注入ArticleMapper接口
    @Override
    public void add(Article article) {
        //补充id属性值 用于添加到create_usera字段中
        Map<String,Object> map = ThreadLocalUtil.get();
        Integer id = (Integer) map.get("id");
        article.setCreateUser(id);

        articleMapper.add(article);
    }
}

创建ArticleMapper接口并完成方法

@Mapper
public interface ArticleMapper {

    //添加文章
    @Insert("insert into article(title,content,cover_img,state,category_id,create_user,create_time,update_time)" +
            " values(#{title},#{content},#{coverImg},#{state},#{categoryId},#{createUser},now(),now())")
    void add(Article article);
}

运行请求查看 

 数据库中查看已添加成功

自定义参数校验

    已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解) 

项目参数要求 

实现思路 

  1. 自定义注解State
  2. 自定义校验数据的类StateValidation 实现ConstraintValidator接口
  3. 在需要校验的地方使用自定义注解 

 实现步骤

 在Article实体类中对能满足校验要求的成员变量进行校验

在ArticleController接口中对方法参数使用@Validated注解 

但对于state变量参数已有的注解不能满足所有的校验需求,所以需要对其使用自定义参数校验。

新建anno包,在包下新定义State注解,并完善定义注解的代码

@Documented //元注解 用于抽取自定义的注解到帮助文档
@Target({ElementType.FIELD}) //元注解 自定义的标注用在哪些地方 FIELD表示在变量属性上标注
@Retention(RetentionPolicy.RUNTIME) //元注解 用于标识自定义的注解会在哪一阶段保留 RUNTIME表示运行阶段
@Constraint(validatedBy = {}) //用于指定谁给自定义的注解定义参数校验规则
public @interface State {

    //message用于提供校验失败后的提示信息
    String message() default "'state参数的值只能是已发布或者草稿";

    //用于指定分组
    Class<?>[] groups() default {};

    //负载 获取到State注解的附如信息
    Class<? extends Payload>[] payload() default {};
}

新建validation包,在包下定义StateValidation校验规则类,并完善校验规则代码

public class StateValidation implements ConstraintValidator<State,String> { //接口的泛型:<会给哪个注解提供校验规则,校验的数据类型>

    /**
     *参数解释:
     *
     * value:将来要校验的数据
     * context
     * return: 如果返回false则校验不通过, 如果返回true则校验通过
     */

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        //提供校验规则
        if(value == null){
            return false;
        }

        if(value.equals("已发布") || value.equals("草稿")){
            return true;
        }
        return false; //其余情况返回false
    }
}

 再回到State注解中完善要指定的校验规则

到实体类中在需要的成员变量使用该自定义注解用于达到注解参数校验的目的

文章列表(条件分页)

接口文档 

业务实现 

创建PageBean实体类 

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

编写ArticleController中的请求的方法

    @GetMapping
    public Result<PageBean<Article>> list(Integer pageNum,
                                          Integer pageSize,  //使用@RequestParam(required = false)可以使参数设置为可传入也可不传入
                                          @RequestParam(required = false) String categoryId,
                                          @RequestParam(required = false) String state){

        PageBean<Article> pb = articleService.list(pageNum,pageSize,categoryId,state);
        return Result.success(pb);
    }

编写ArticleService接口的方法

    //条件分页列表查询
    PageBean<Article> list(Integer pageNum, Integer pageSize, String categoryId, String state);
}

在pom文件导入pagehelper插件依赖用于完成分页查询 

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

编写ArticleServiceimpl接口实现类的方法

    @Override
    public PageBean<Article> list(Integer pageNum, Integer pageSize, String categoryId, String state) {
        //定义pageBean对象
        PageBean<Article> pb = new PageBean<>();

        //开启分页查询 PageHelper
        PageHelper.startPage(pageNum,pageSize);

        //添加id参数 调用mapper接口的方法
        Map<String,Object> map = ThreadLocalUtil.get();
        Integer id = (Integer) map.get("id");

        List<Article> arlist = articleMapper.list(id,categoryId,state);
        //page中提供了方法可以获取pagehelper分页查询后,得到的总记录条数和当前页数
        Page<Article> p = (Page<Article>) arlist;

        //将page对象获取的记录和条数添加到pagebean对象中
        pb.setTotal(p.getTotal());
        pb.setItems(p.getResult());

        return  pb; //返回pagebean对象
    }

编写ArticleMapper接口的方法 

    //条件分页列表查询
    List<Article> list(Integer id, String categoryId, String state);

mapper映射 

由于参数 categoryId和state参数为非必填,所以这里sql需要用到sql映射文件来写动态sql

在resource目录下创建和mapper包一样的结构目录

目录结构要和mapper接口目录相同

配置文件名称要和接口名称相同

编写sql映射配置文件

<?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接口的路径全类名要相同   -->
<mapper namespace="com.springboot.springboot_test.mapper.ArticleMapper">
<!-- 编写动态sql
select标签的
id参数要和mapper接口的方法名称一致
resultType 返回值类型要和实体类名称一致-->
    <select id="list" resultType="com.springboot.springboot_test.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= #{id}
        </where>
    </select>
    
</mapper>

运行请求查看

 

更新文章

 接口文档

 业务实现

编写ArticleController中的请求的方法

    @PutMapping
    public Result update(@RequestBody @Validated Article article){
        articleService.update(article);
        return Result.success();
    }

编写ArticleService接口的方法

    //更新文章
    void update(Article article);

编写ArticleServiceimpl接口实现类的方法

    @Override
    public void update(Article article) {
        articleMapper.update(article);
    }

编写ArticleMapper接口的方法

    //更新文章
    @Update("update article set title = #{title},content = #{content},cover_img = #{coverImg},state = #{state}, " +
            "category_id = #{categoryId},update_time = now() where id = #{id}")
    void update(Article article);

运行请求查看

 

获取文章详情 

接口文档 

业务实现 

编写ArticleController中的请求的方法

    @GetMapping("/detail")
    public Result detail(Integer id){
        Article ar = articleService.findById(id);

        return Result.success(ar);
    }

编写ArticleService接口的方法

    //查看文章详情
    Article findById(Integer id);

编写ArticleServiceimpl接口实现类的方法

    @Override
    public Article findById(Integer id) {
        Article ar = articleMapper.findById(id);
        return ar;
    }

编写ArticleMapper接口的方法

    //查看文章详情
    @Select("select * from article where id =#{id}")
    Article findById(Integer id);

 运行请求查看

删除文章 

接口文档 

业务实现 

编写ArticleController中的请求的方法

    @DeleteMapping
    public Result delete(Integer id){
        articleService.delete(id);
        return Result.success();
    }

编写ArticleService接口的方法

    //删除文章
    void delete(Integer id);

编写ArticleServiceimpl接口实现类的方法

    @Override
    public void delete(Integer id) {
        articleMapper.delete(id);
    }

编写ArticleMapper接口的方法

    //删除文章
    @Delete("delete from article where id = #{id}")
    void delete(Integer id);

运行请求查看

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony实战开发——WLAN驱动框架介绍及适配方法

1. WLAN 驱动框架概述 WLAN 是基于 HDF(Hardware Driver Foundation)驱动框架开发的模块&#xff0c;该模块可实现跨操作系统迁移、自适应器件差异、模块化拼装编译等功能。从而降低 WLAN 驱动开发的难度&#xff0c;减少 WLAN 驱动移植和开发的工作量。 本文主要分析 WLAN 驱…

gif压缩大小但不改变画质怎么做?分享5个压缩GIF原理~

GIF&#xff08;图形互换格式&#xff09;是网络上广泛使用的一种图像格式&#xff0c;因其支持动画而备受欢迎。然而&#xff0c;随着动画越来越复杂和高分辨率&#xff0c;GIF 文件大小也随之增加&#xff0c;可能导致加载速度变慢和带宽消耗增加。在这篇文章中&#xff0c;我…

easypoi动态表头导出数据

需求&#xff1a;动态导出某年某月用户和用户评分数据信息&#xff0c;表头(序号、姓名、用户姓名)&#xff0c;数据(所有用户对应的评分以及平均分)&#xff1b; 分析&#xff1a;1、表头除过序号、姓名&#xff0c;用户姓名要动态生成&#xff1b; 2、用户评分信息要和表头中…

Nginx+GateWay

目录 Nginx nginx如何配置负载均衡 负载均衡有哪些策略 1、轮询&#xff08;默认&#xff09; 2、指定权重 3、ip_hash&#xff08;客户端ip绑定&#xff09; 4、least_conn&#xff08;最少连接&#xff09; 5、fair 6、url_hash Nginx为什么效率高 gateway 使用gat…

Lobe Chat–在线AI对话聊天机器人,一键部署,免费开源

Lobe Chat 现代化设计的开源 ChatGPT/LLMs 聊天应用与开发框架 支持语音合成、多模态、可扩展的&#xff08;function call&#xff09;插件系统 一键免费拥有你自己的 ChatGPT/Gemini/Claude/Ollama 应用 项目演示 支持多种模型接口 支持语音输入输出 支持云端同步 丰富多彩非…

1013: 哈希表(开放定址法处理冲突)

解法&#xff1a; 线性探测是一种解决哈希冲突的方法&#xff0c;当发生哈希冲突时&#xff0c;它会依次往后查找空的槽位&#xff0c;直到找到一个空的槽位或者达到数组的末尾。 下面是处理哈希冲突的线性探测的步骤&#xff1a; 创建一个哈希表&#xff0c;里面包含一定数量的…

Ps 滤镜:视频

Ps菜单&#xff1a;滤镜/视频 Filter/Video “视频”滤镜子菜单中包含了“NTSC 颜色”和“逐行”两个滤镜。 这两个滤镜都是针对视频和电视播放的特定需求设计的。 “逐行”滤镜主要解决交错视频的视觉问题&#xff0c;而“NTSC 颜色”滤镜则确保色彩在电视播放时的兼容性和准确…

一文带你了解OSPF 七种LSA类型,很全!

大家好&#xff0c;今天我们 带大家了解一下OSPF的七种LSA类型。 在OSPF&#xff08;开放式最短路径优先&#xff09;协议中&#xff0c;LSA&#xff08;链路状态通告&#xff09;是一种至关重要的数据格式&#xff0c;专门用于描述路由信息。它包含了路由器或网络的各种状态信…

编写一个C#程序,实现音乐文件的播放功能

一、作业要求 要求1&#xff1a; 1. 程序应能够读取MP3文件&#xff0c;并播放其中的音频。 2. 程序应能够处理可能出现的异常&#xff0c;如文件不存在、文件读取错误等。 3. 程序应具有良好的用户界面&#xff0c;方便用户进行操作。 4. 程序应具有良好的兼容性&#xf…

VK6932 SOP32数码屏驱动IC抗干扰数显芯片高稳定LED驱动 原厂FAE支持

产品型号&#xff1a;VK6932 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP32 工程服务&#xff0c;技术支持&#xff01; 概述 VK6932是一种数码管或点阵LED驱动控制专用芯片&#xff0c;内部集成有3线串行接口、数据锁存器、LED 驱动等电路。SEG脚接LED阳…

【Python】selenium爬虫常见用法和配置,以及常见错误和解决方法

欢迎来到《小5讲堂》 这是《Python》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言无执行文件代码报错信息错误路径手动下载自动下载 选项配置Ch…

js之遍历方法

先创建一个数组&#xff0c;然后使用for.in进行遍历&#xff0c;如下图所示sub代表下标并且遍历几次&#xff0c;arr代表数组 <script>let arr [1, 2, 3, 4, 5, 6];for (let sub in arr) {console.log(arr);}</script> 第二种方法则是for循环遍历&#xff0c;根据…

Transformer 解析 超级详细版

推荐学习视频 汉语自然语言处理-从零解读碾压循环神经网络的transformer模型(一)- 注意力机制-位置编码-attention is all you need_哔哩哔哩_bilibili 目录 首先下transformer和LSTM的最大区别是什么&#xff1f; 1.positional \ encoding, 即位置嵌入(或位置编码); 2 自注…

windows连接CentOS数据库或Tomcat报错,IP通的,端口正常监听

错误信息 数据库错误&#xff1a; ERROR 2003 (HY000): Cant connect to MySQL server on x.x.x.x (10060) Tomcat访问错误&#xff1a; 响应时间过长 ERR_CONNECTION_TIMED_OUT 基础排查工作 【以下以3306端口为例&#xff0c;对于8080端口来说操作是一样的&#xff0c;只需…

NM2-WRDUW施耐德电动机保护器EOCR-NM2

EOCR智能电动机保护器原产地为韩国&#xff0c;隶属于施耐德(韩国)电气有限公司工厂。此公司早起源于韩国三和SAMWHA株式会社&#xff0c;是早研发电子式电动机保护器厂家&#xff0c;产品涵盖过电流继电器EOCR-SS,EOCR-SE2,EOCR-AR&#xff0c;欠电流继电器EUCR&#xff0c;数…

3分钟快速了解VR全景编辑器

说到VR全景&#xff0c;想必大多数人都见过那种可以360旋转拖动观看的图片。虽然这种技术已经不算新鲜&#xff0c;如果你以为这就是VR全景的全部&#xff0c;那就大错特错了&#xff01; 上面看到的这种形式&#xff0c;只能算VR全景的第一层形态。现在的VR全景已经发展成为了…

LabVIEW自动机械变速器(AMT)开发

LabVIEW自动机械变速器&#xff08;AMT&#xff09;开发 在现代汽车工业中&#xff0c;提升车辆的自动化水平和驾驶体验是一个不断追求的目标。随着技术的发展&#xff0c;自动机械变速器&#xff08;AutomatedMechanical Transmission, AMT&#xff09;凭借其较高的能效和较低…

四、VGA项目:联合精简帧+双fifo+sobel算法 实现VGA显示

前言&#xff1a;该项目实际上是在很多基础的小练习上合成起来的&#xff0c;例如涉及到uart&#xff08;rs232&#xff09;的数据传输、双fifo流水线操作、VGA图像显示&#xff0c;本次内容在此基础上又增添了sobel算法&#xff0c;能实现图像的边沿监测并VGA显示。 文章目录…

你写的每条SQL都是全表扫描吗

你写的每条SQL都是全表扫描吗&#xff1f;如果是&#xff0c;那MySQL可太感谢你了&#xff0c;每一次SQL执行都是在给MySQL上压力、上对抗。MySQL有苦难言&#xff1a;你不知道索引吗&#xff1f;你写的SQL索引都失效了不知道吗&#xff1f;慢查询不懂啊&#xff1f;建那么多索…

Xinstall助力App地推监测,实现精准效果评估

在移动互联网时代&#xff0c;App的推广已经成为企业营销的重要手段。然而&#xff0c;如何有效地监测App地推效果&#xff0c;一直是广告主和开发者面临的难题。幸运的是&#xff0c;Xinstall作为国内专业的App全渠道统计服务商&#xff0c;为广告主和开发者提供了一站式的解决…
最新文章