Springboot学习笔记3.28

news2025/5/15 16:01:01

目录

实战第六课:文章分类开发

新增文章分类:

具体实现: 

查询文章分类:

具体实现:

获取文章分类的详情

更新文章分类: 

注意点:

​编辑

对校验规则进行分组:

学习时的疑惑:

1.@Notempty和@NotNull的区别是啥

1. @NotNull

2. @NotEmpty

3. 区别

4. 补充说明

 实战第七课:文章管理接口实现

新增文章:

 自定义校验:

具体实现: 

文章列表查询(条件分页):

具体实现:

1.Controller层

2.service层

​编辑

3.Mapper层

​编辑 总结:注意这一课我们学习了分页查询和条件分支(动态SQL)的实现这是很重要的知识点。

 一些疑惑: 

1.在service中为什么为啥不直接用as填充数据?

实战第八课:文件上传

​编辑 具体实现:

 如何上传到阿里云服务器?


实战第六课:文章分类开发

新增文章分类:

 

具体实现: 

1.Controller层需要对传过来的json数据先进行@RequestBody处理,将其转化为Java对象,然后在@Validated处理,校验参数是否合法(即分类名和分类别名不能为空)

2.service层,注意要为category对象通过ThreadLocal添加createUser属性,不然为空会报错;

 3.Mapper层Insert数据:

查询文章分类:

具体实现:

1.Controller层。

2.实体类,注意@NotEmpty不仅查明是否为Null还会查明是否为空。@JsonFormat可以在实体转化为json数据后指定格式。在前面学的@JsonIgnore可以忽略在实体转化为Json时忽略属性;

3.service层,记得把ID也传过去:

4.Mapper层:

获取文章分类的详情

获取文章详情就不写了,和上面几乎一样;

更新文章分类: 

注意点:

1.前端传来的Json数据通过@RequestBody转为category对象。@前端传来的参数通过@Validated来校验;

对校验规则进行分组:

1.如何定义分组?在实体类里面定义接口。

如何对校验项进行分组?通过groups属性进行赋值;

如何使用指定分组校验?给@validated注解的Value属性赋值,如下我们将其给了update校验组:

注意默认校验组是Default。 

学习时的疑惑:

1.@Notempty和@NotNull的区别是啥

@NotEmpty@NotNull 是 Java 中常用的注解,主要用于数据校验,但它们的作用和应用场景有所不同。

1. @NotNull
  • 定义@NotNull 是一个校验注解,用于检查某个字段是否为 null。如果字段值为 null,则校验失败。

  • 作用范围:可以应用于任何类型的字段,包括基本数据类型(如 intdouble 等)、包装类(如 IntegerDouble 等)、对象类型(如 String、自定义对象等)。

  • 示例

    public class User {
        @NotNull(message = "用户名不能为空")
        private String username;
    }

    如果 usernamenull,校验会失败,并抛出异常(通常由校验框架处理)。

2. @NotEmpty
  • 定义@NotEmpty 是一个校验注解,用于检查某个字段是否为空。它不仅检查字段是否为 null,还会检查集合、数组、字符串等是否为空。

  • 作用范围:通常用于集合(如 ListSet)、数组、字符串等类型。对于字符串,它会检查字符串是否为 null 或长度为 0;对于集合和数组,它会检查是否为 null 或长度为 0

  • 示例

    public class User {
        @NotEmpty(message = "用户名不能为空")
        private String username;
    
        @NotEmpty(message = "用户角色不能为空")
        private List<String> roles;
    }
    • 如果 usernamenull 或长度为 0(即空字符串),校验失败。

    • 如果 rolesnull 或为空集合(roles.size() == 0),校验失败。

3. 区别
  • 校验内容

    • @NotNull 只检查字段是否为 null,不关心字段的具体内容。

    • @NotEmpty 除了检查字段是否为 null,还会检查内容是否为空(如字符串长度为 0,集合或数组为空)。

  • 适用场景

    • @NotNull 适用于所有类型的字段,尤其是那些不能为 null 的字段。

    • @NotEmpty 更适合用于集合、数组和字符串等类型,确保它们不仅不为 null,而且有实际内容。

4. 补充说明
  • @NotBlank:这是另一个与 @NotEmpty 类似的注解,但只适用于字符串。它不仅检查字符串是否为 null 或空字符串,还会检查字符串是否只包含空白字符(如空格、制表符等)。例如:

    @NotBlank(message = "用户名不能为空或空白")
    private String username;

    如果 usernamenull、空字符串或只包含空白字符(如 " "),校验失败。

  • 框架支持:这些注解通常由校验框架(如 Hibernate Validator)提供支持,用于在运行时自动校验字段值。

总结来说,@NotNull@NotEmpty 的主要区别在于 @NotEmpty 会进一步检查字段的内容是否为空,而 @NotNull 只检查是否为 null

 实战第七课:文章管理接口实现

新增文章:

 自定义校验:

具体实现: 

1.自定义注解State,这个注解要有message、group、payload三个方法,其他的元注解要看明白它的作用,如Constraint它指明包含校验规则的类,Target指明可以在哪些部分使用,Retention指明可以保留在哪些运行阶段:

 2.包含效验规则的类,需要实现constraintValidator接口,注意<1,2>前后两个参数的作用。重写isValid方法提供效验规则:

 3.此时我们就可以用这个自定义的效验注解用于参数校验,它会阻挡不是“草稿”和“已发送”的参数。

文章列表查询(条件分页):

具体实现:

1.Controller层

注意前端传来的参数里categoryId和State是不一定会传的,所以要给他们加@RequestParam(requird=false)这个注解标明可能不会传。 

我们还设置了一个PageBean实体类用于存储页面数据,里面包含数据条数和数据。

2.service层

1.首先在service层我们要创建一个PageBean对象用于返回数据。

2.开启分页查询插件PageHelper,这个插件可以帮助进行分页查询,也就是在SQL语句后插入limit a,b。注意开启这个插件后,Mapper执行SQL语句返回的是Page<>对象而非List<>对象,需要进行强转否则数据不对。

3.调用Mapper,注意获取用户ID,用户只能查询自己的文章。

3.Mapper层

由于在Mapper里直接实现动态SQL是很复杂的,所以我们使用映射配置文件实现动态SQL。

注意namespace指明映射的是哪个Mapper类,id指明映射的方法,resultType指返回的实体类。

还要注意语法:

<mapper namespace="com.itheima.mapper.ArticleMapper">
    <!--映射配置文件实现动态SQL-->
    <select id="list" resultType="com.itheima.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>

 总结:注意这一课我们学习了分页查询和条件分支(动态SQL)的实现这是很重要的知识点。

 一些疑惑: 

1.在service中为什么为啥不直接用as填充数据?

虽然 as 是一个 List<Article>,但它实际上是通过 PageHelper 分页插件处理后的结果。PageHelper 会将查询结果包装成一个特殊的 Page 类型对象(继承自 ArrayList),这个对象不仅包含了分页数据,还提供了额外的分页信息,如总记录数、总页数等。因此,直接使用 Page 对象来填充 PageBean 是更合理的选择。

实战第八课:文件上传

 具体实现:

创建一个新的Controller类用于文件上传。在这里我们使用Multipartfile实现文件上传。注意使用UUID产生一个随机的uid避免文件名重复导致覆盖。

 如何上传到阿里云服务器?

1.在阿里云创建好oss对象存储的bucket

2. 建立依赖并且创建阿里云上传文件的工具类,注意四个属性endpoint,ACCESS_KEY_ID,SECRET_ACCESS_KEY,bucket_name的意义和用处:

3.Controller层调用工具类方法,注意传入文件的输入流,通过MultipartFile类的方法:

 成功~

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

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

相关文章

【CSS3】05-定位 + 修饰属性

本文介绍定位和CSS中的修饰属性。 目录 1. 定位 1.1 相对定位 1.2 绝对定位 1.3 定位居中 1.4 固定定位 1.5 z-index堆叠层级 2. 修饰属性 2.1 垂直对齐方式 vertical-align 2.2 过渡属性 2.3 透明度 opacity 2.4 光标类型 cursor 1. 定位 灵活改变盒子在网页中的位…

如何屏蔽mac电脑更新提醒,禁止系统更新

最烦mac的系统更新提醒了&#xff0c;过几天就是更新弹窗提醒&#xff0c;现在可以直接禁掉了&#xff0c;眼不见心不乱&#xff0c;不然一升级&#xff0c;开发环境全都不能用了&#xff0c;那才是最可怕的&#xff0c;屏蔽的方法也很简单&#xff0c;就是屏蔽mac系统更新的请…

Rclone同步Linux数据到google云盘

文章目录 Rclone管理云存储Rclone安装和使用说明安装rclone配置rclone连接到云盘基本备份命令高级备份选项自动化备份加密备份&#xff08;可选&#xff09;恢复数据常见云存储服务名称注意事项 googleCloud 平台中操作OAuth权限请求页面&#xff08;OAuth同意屏幕&#xff09;…

AI人工智能-Jupyter NotbookPycharm:Py开发

安装 命令&#xff1a; pip install jupyter 启动 命令&#xff1a; jupyter notebook 启动成功后&#xff0c;下面网址会默认自动打开当前用户的根目录。 其实这个页面显示的内容&#xff0c;是我们电脑目录C:\Users\当前用户\下的文件夹 我们平常做实验&#xff0c;希望在…

DDR简介

一、什么是DDR&#xff1f; DDR SDRAM&#xff08;Double Data Rate Synchronous DYNAMIC RAM&#xff09;中文名是&#xff1a;双倍数据速率同步动态随机存储器。 传统的SDRAM只在时钟信号的上升沿传输数据&#xff0c;而DDR可以同时在时钟的上升沿和下降沿传输数据&#xf…

VRRP(虚拟路由器冗余协议)、虚拟路由器、master路由器、backup路由器

VRRP(虚拟路由器冗余协议) 1、介绍 虚拟路由冗余协议 VRRP (Virtual Router Redundancy Protocol)通过把几台路由设备联合组成一台虚拟的路由设备&#xff0c;将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时&#xff0c;VRRP机制能够选举…

多模态RAG实践:如何高效对齐不同模态的Embedding空间?

目录 多模态RAG实践&#xff1a;如何高效对齐不同模态的Embedding空间&#xff1f; 一、为什么需要对齐Embedding空间&#xff1f; 二、常见的对齐方法与关键技术点 &#xff08;一&#xff09;对比学习&#xff08;Contrastive Learning&#xff09; &#xff08;二&#…

vue中的 拖拽

拖拽总结 实现方式特点适用场景HTML5 原生拖拽 API✅ 直接使用 dataTransfer 进行数据传输 ✅ 兼容性好&#xff08;大部分浏览器支持&#xff09; ✅ 适合简单的拖拽场景低代码平台、表单生成器、组件拖拽Vue/React 组件库&#xff08;如 Vue Draggable、SortableJS&#xff…

Linux进程间通信(1)

1.IPC 1.什么是IPC&#xff1f; Inter Process Communication 2.进程间通信常用的几种方式 1&#xff0c;管道通信&#xff1a;有名管道&#xff0c;无名管道 2&#xff0c;信号- 系统开销小 3&#xff0c;消息队列-内核的链表 4&#xff0c;信号量-计数器 5&#xff0c;共享…

Scala相关知识学习总结3

包 - 包声明&#xff1a;和Java类似&#xff0c;作用是区分同名类、管理类命名空间。Scala包名只能含数字、字母等&#xff0c;不能数字开头、不能用关键字。 - 包说明&#xff1a;有类似Java的包管理风格&#xff0c;也有独特嵌套风格。嵌套风格有两个特点&#xff0c;一是&…

Opencv计算机视觉编程攻略-第七节 提取直线、轮廓和区域

第七节 提取直线、轮廓和区域 1.用Canny 算子检测图像轮廓2.用霍夫变换检测直线&#xff1b;3.点集的直线拟合4.提取连续区域5.计算区域的形状描述子 图像的边缘区域勾画出了图像含有重要的视觉信息。正因如此&#xff0c;边缘可应用于目标识别等领域。但是简单的二值边缘分布图…

中和农信:让金融“活水”精准浇灌乡村沃土

2025年政府工作报告首提“投资于人”概念&#xff0c;并22次提及“金融”&#xff0c;强调要着力抓好“三农”工作&#xff0c;深入推进乡村全面振兴&#xff1b;一体推进地方中小金融机构风险处置和转型发展&#xff1b;扎扎实实落实促进民营经济发展的政策措施&#xff0c;切…

背包DP总结

牛客周赛 Round 81 E.建筑入门 知识点&#xff1a;完全背包&#xff0c;完全背包的路径转移以及回溯 由题意可以推导出&#xff0c;下层麻将的数字一定大于上层数字&#xff0c;所以我们可以假设一个最基础的麻将塔&#xff0c;也就是&#xff1a; 1 2 2 3 3 3 … 形如这样的&…

Labview信号采集与多功能分析系统(可仿真)

1.摘要 《Labview信号采集与多功能分析系统》可以实时分析信号的时域特征&#xff0c;例如信号的均值、方差、峰值、峭度等。系统可以进行信号的自相关与互关分析。此系统也可以分析信号的频域特征&#xff0c;包括快速傅里叶变换后的时频特征、短时傅里叶变换STFT后的时频域特…

【电子通识】为什么电子元件的规格书常常要看英文版本

在我们查看电子器件规格书的时候&#xff0c;如果有中文版本和英文版本两种供我们选择&#xff0c;那我们常常需要查看英文版本&#xff0c;大家有想过这是为什么吗&#xff1f; 为什么英文规格书很重要&#xff1f; 电子元件规格书&#xff08;Datasheet&#xff09;常以英文版…

Scala基础知识5

面向对象 Scala 的面向对象思想和 Java 的面向对象思想和概念是一致的。 Scala 中语法和 Java 不同&#xff0c;补充了更多的功能。 1.Scala包 基本语法&#xff1a;package 包名 Scala 包的三大作用&#xff08;和 Java 一样&#xff09; 1.区分相同名字的类。 2.当类很多…

【图像处理基石】什么是RAW格式?

在图像处理中&#xff0c;RAW格式是一种未经处理、记录了相机传感器原始数据的图像文件格式。它保留了相机传感器捕捉到的全部原始信息&#xff0c;未经任何压缩或处理&#xff0c;因此被称为“原始数据”&#xff08;Raw&#xff09;。以下是关于RAW格式的详细解释&#xff1a…

AI Agent 实战:搭建个人在线旅游助手

AI Agent 实战&#xff1a;搭建个人在线旅游助手 本次实验中&#xff0c;我们将继续探索 Agent 的提示词&#xff0c;学习更加规范的提示词撰写方法。 本实验中你将掌握的知识点 使用 Dify 构建 Agent 的方法结构化的提示词撰写技巧变量的使用方法 1. 准备 在新建 Agent 之…

【JavaScript】十四、轮播图

文章目录 实现一个轮播图&#xff0c;功能点包括&#xff1a; 自动播放鼠标经过暂时播放鼠标离开继续播放点击切换按钮手动切换 div盒子嵌套先写出静态HTML&#xff0c;再使用JS来修改样式和数据&#xff0c;渲染页面&#xff1a; <!DOCTYPE html> <html lang"…

2025 全球音乐 AI 大模型对决:技术革新引领商业变革浪潮

未来的世界声音&#xff1a; 音乐产业如今正被 AI 技术推动着&#xff0c;开启一场智能革命的全新篇章。无论是旋律的诞生&#xff0c;还是工业化编曲的流程&#xff0c;AI 大模型都在以飞快的速度改变着行业的基本逻辑架构。在中国&#xff0c;昆仑万维依靠 Mureka 系列产品在…