Springboot学习笔记3.28
目录
实战第六课:文章分类开发
新增文章分类:
具体实现:
查询文章分类:
具体实现:
获取文章分类的详情
更新文章分类:
注意点:
编辑
对校验规则进行分组:
学习时的疑惑:
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,则校验失败。 -
作用范围:可以应用于任何类型的字段,包括基本数据类型(如
int、double等)、包装类(如Integer、Double等)、对象类型(如String、自定义对象等)。 -
示例:
public class User {@NotNull(message = "用户名不能为空")private String username; }如果
username为null,校验会失败,并抛出异常(通常由校验框架处理)。
2. @NotEmpty
-
定义:
@NotEmpty是一个校验注解,用于检查某个字段是否为空。它不仅检查字段是否为null,还会检查集合、数组、字符串等是否为空。 -
作用范围:通常用于集合(如
List、Set)、数组、字符串等类型。对于字符串,它会检查字符串是否为null或长度为0;对于集合和数组,它会检查是否为null或长度为0。 -
示例:
public class User {@NotEmpty(message = "用户名不能为空")private String username;@NotEmpty(message = "用户角色不能为空")private List<String> roles; }-
如果
username为null或长度为0(即空字符串),校验失败。 -
如果
roles为null或为空集合(roles.size() == 0),校验失败。
-
3. 区别
-
校验内容:
-
@NotNull只检查字段是否为null,不关心字段的具体内容。 -
@NotEmpty除了检查字段是否为null,还会检查内容是否为空(如字符串长度为0,集合或数组为空)。
-
-
适用场景:
-
@NotNull适用于所有类型的字段,尤其是那些不能为null的字段。 -
@NotEmpty更适合用于集合、数组和字符串等类型,确保它们不仅不为null,而且有实际内容。
-
4. 补充说明
-
@NotBlank:这是另一个与@NotEmpty类似的注解,但只适用于字符串。它不仅检查字符串是否为null或空字符串,还会检查字符串是否只包含空白字符(如空格、制表符等)。例如:@NotBlank(message = "用户名不能为空或空白") private String username;如果
username为null、空字符串或只包含空白字符(如" "),校验失败。 -
框架支持:这些注解通常由校验框架(如 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类的方法:
成功~

相关文章:
Springboot学习笔记3.28
目录 实战第六课:文章分类开发 新增文章分类: 具体实现: 查询文章分类: 具体实现: 获取文章分类的详情 更新文章分类: 注意点: 编辑 对校验规则进行分组: 学习时的疑惑…...
【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. 定位 灵活改变盒子在网页中的位…...
C 语言测验
C 语言测验 引言 C 语言作为一种历史悠久且广泛使用的编程语言,自1972年由Dennis Ritchie在贝尔实验室发明以来,一直是计算机科学领域的基石。C 语言以其高效、灵活、可移植的特点,在操作系统、嵌入式系统、游戏开发等多个领域占据着重要地位。为了帮助读者深入了解C语言,…...
如何屏蔽mac电脑更新提醒,禁止系统更新
最烦mac的系统更新提醒了,过几天就是更新弹窗提醒,现在可以直接禁掉了,眼不见心不乱,不然一升级,开发环境全都不能用了,那才是最可怕的,屏蔽的方法也很简单,就是屏蔽mac系统更新的请…...
tcp的粘包拆包问题,如何解决?
TCP的粘包和拆包问题是由于TCP协议面向流的特性导致数据边界不明确,解决方案需在应用层明确数据包边界。以下是具体解决方法: 1. 固定长度消息(Fixed-Length Protocol) 实现方式:每个数据包长度固定,不足…...
Rclone同步Linux数据到google云盘
文章目录 Rclone管理云存储Rclone安装和使用说明安装rclone配置rclone连接到云盘基本备份命令高级备份选项自动化备份加密备份(可选)恢复数据常见云存储服务名称注意事项 googleCloud 平台中操作OAuth权限请求页面(OAuth同意屏幕)…...
AI人工智能-Jupyter NotbookPycharm:Py开发
安装 命令: pip install jupyter 启动 命令: jupyter notebook 启动成功后,下面网址会默认自动打开当前用户的根目录。 其实这个页面显示的内容,是我们电脑目录C:\Users\当前用户\下的文件夹 我们平常做实验,希望在…...
DDR简介
一、什么是DDR? DDR SDRAM(Double Data Rate Synchronous DYNAMIC RAM)中文名是:双倍数据速率同步动态随机存储器。 传统的SDRAM只在时钟信号的上升沿传输数据,而DDR可以同时在时钟的上升沿和下降沿传输数据…...
Kubernetes 入门篇之 Node 安装与部署
上篇记录了Master节点的安装与部署,本篇记录一下node的安装与部署。 1. 基础环境配置 关闭防火墙与交换分区(swap),关闭selinux,配置yum源参考上篇;启用 IPv4 数据包转发 和 iptables 网络过滤参考上篇&a…...
企业数据治理实践:“七剑” 合璧,释放数据价值
在数字化转型的浪潮中,数据已成为企业的核心资产,其治理水平直接关乎企业的竞争力和可持续发展能力。数据模型治理、元数据治理、数据质量治理、数据标准治理、主数据治理、数据安全治理以及数据服务平台治理,共同构成了企业数据治理的关键体…...
VRRP(虚拟路由器冗余协议)、虚拟路由器、master路由器、backup路由器
VRRP(虚拟路由器冗余协议) 1、介绍 虚拟路由冗余协议 VRRP (Virtual Router Redundancy Protocol)通过把几台路由设备联合组成一台虚拟的路由设备,将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时,VRRP机制能够选举…...
基本元素定位(findElement方法)
通过ID定位:使用元素的ID属性进行定位,是最简单和最常用的方法,因为ID在页面上是唯一的。 //定位百度的搜索框元素,并且输入数据(ID定位)-唯一 chromeDriver.findElement(By.id("kw")).sendKeys("腾讯课堂")…...
多模态RAG实践:如何高效对齐不同模态的Embedding空间?
目录 多模态RAG实践:如何高效对齐不同模态的Embedding空间? 一、为什么需要对齐Embedding空间? 二、常见的对齐方法与关键技术点 (一)对比学习(Contrastive Learning) (二&#…...
Cesium 核心思想及基础概念应用
文章目录 Cesium 基础理解(一)1. 场景(Scene)2. 查看器(Viewer)3. 相机(Camera)4. 实体(Entity)5. 图元(Primitive)6. 数据加载与解析…...
vue中的 拖拽
拖拽总结 实现方式特点适用场景HTML5 原生拖拽 API✅ 直接使用 dataTransfer 进行数据传输 ✅ 兼容性好(大部分浏览器支持) ✅ 适合简单的拖拽场景低代码平台、表单生成器、组件拖拽Vue/React 组件库(如 Vue Draggable、SortableJSÿ…...
Linux进程间通信(1)
1.IPC 1.什么是IPC? Inter Process Communication 2.进程间通信常用的几种方式 1,管道通信:有名管道,无名管道 2,信号- 系统开销小 3,消息队列-内核的链表 4,信号量-计数器 5,共享…...
Scala相关知识学习总结3
包 - 包声明:和Java类似,作用是区分同名类、管理类命名空间。Scala包名只能含数字、字母等,不能数字开头、不能用关键字。 - 包说明:有类似Java的包管理风格,也有独特嵌套风格。嵌套风格有两个特点,一是&…...
Opencv计算机视觉编程攻略-第七节 提取直线、轮廓和区域
第七节 提取直线、轮廓和区域 1.用Canny 算子检测图像轮廓2.用霍夫变换检测直线;3.点集的直线拟合4.提取连续区域5.计算区域的形状描述子 图像的边缘区域勾画出了图像含有重要的视觉信息。正因如此,边缘可应用于目标识别等领域。但是简单的二值边缘分布图…...
中和农信:让金融“活水”精准浇灌乡村沃土
2025年政府工作报告首提“投资于人”概念,并22次提及“金融”,强调要着力抓好“三农”工作,深入推进乡村全面振兴;一体推进地方中小金融机构风险处置和转型发展;扎扎实实落实促进民营经济发展的政策措施,切…...
背包DP总结
牛客周赛 Round 81 E.建筑入门 知识点:完全背包,完全背包的路径转移以及回溯 由题意可以推导出,下层麻将的数字一定大于上层数字,所以我们可以假设一个最基础的麻将塔,也就是: 1 2 2 3 3 3 … 形如这样的&…...
Labview信号采集与多功能分析系统(可仿真)
1.摘要 《Labview信号采集与多功能分析系统》可以实时分析信号的时域特征,例如信号的均值、方差、峰值、峭度等。系统可以进行信号的自相关与互关分析。此系统也可以分析信号的频域特征,包括快速傅里叶变换后的时频特征、短时傅里叶变换STFT后的时频域特…...
【C#使用S7.NET库读取和写入西门子PLC变量】
C#使用S7.NET库读取和写入西门子PLC变量 前言使用S7.NET库读取使用S7.NET库写入 前言 本来想用Wincc的接口给读和写Wincc,但是速度实在太感人了,所以不如直接读和写PLC的变量,这种方式速度瞬间快了不知道多少倍(经测试4000个变量…...
蓝桥杯 游戏 6251 单调队列
传送门 0游戏 - 蓝桥云课 有了单调队列,在求解答案时:当我们需要对最大值的列表和最小值的列表进行俩俩组合,如果直接用两个f0r循环进行匹配,那么时间复杂度太大,容易超时。我们可以进行一个推导,假设最大…...
[250331] Paozhu 发布 1.9.0:C++ Web 框架,比肩脚本语言 | DeaDBeeF 播放器发布 1.10.0
目录 Paozhu 发布 1.9.0:C Web 框架,快速开发,比肩脚本语言DeaDBeeF 音乐播放器发布 1.10.0 版本! Paozhu 发布 1.9.0:C Web 框架,快速开发,比肩脚本语言 Paozhu (炮竹🧨) 是一个功…...
einsum函数
理解专家并行,需要了解einsum函数 import torch# 设置输入张量的维度:s 3 tokens, e 2 experts, c 2 capacity, m 4 embedding dim s, e, c, m 3, 2, 2, 4# 1. 输入 token 的嵌入向量 (s, m) reshaped_input torch.tensor([[1.0, 1.0, 1.0, 1.0],…...
gitee 配置git上传
Git入门?查看 帮助 , Visual Studio / TortoiseGit / Eclipse / Xcode 下如何连接本站, 如何导入仓库 简易的命令行入门教程: Git 全局设置: 以 176fuguM2项目为例 git config --global user.name "堕落圣甲虫" git config --global user.email "11…...
【电子通识】为什么电子元件的规格书常常要看英文版本
在我们查看电子器件规格书的时候,如果有中文版本和英文版本两种供我们选择,那我们常常需要查看英文版本,大家有想过这是为什么吗? 为什么英文规格书很重要? 电子元件规格书(Datasheet)常以英文版…...
Scala基础知识5
面向对象 Scala 的面向对象思想和 Java 的面向对象思想和概念是一致的。 Scala 中语法和 Java 不同,补充了更多的功能。 1.Scala包 基本语法:package 包名 Scala 包的三大作用(和 Java 一样) 1.区分相同名字的类。 2.当类很多…...
【图像处理基石】什么是RAW格式?
在图像处理中,RAW格式是一种未经处理、记录了相机传感器原始数据的图像文件格式。它保留了相机传感器捕捉到的全部原始信息,未经任何压缩或处理,因此被称为“原始数据”(Raw)。以下是关于RAW格式的详细解释:…...
AI Agent 实战:搭建个人在线旅游助手
AI Agent 实战:搭建个人在线旅游助手 本次实验中,我们将继续探索 Agent 的提示词,学习更加规范的提示词撰写方法。 本实验中你将掌握的知识点 使用 Dify 构建 Agent 的方法结构化的提示词撰写技巧变量的使用方法 1. 准备 在新建 Agent 之…...


