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类的方法:
成功~