当前位置: 首页 > news >正文

Springboot学习笔记3.28

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

新增文章分类:

 

具体实现: 

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

 成功~

相关文章:

  • TestNG简介
  • 吴恩达深度学习复盘(4)神经网络的前向传播
  • Linux中的权限管理
  • git clone 提示需要登录 github
  • #Linux内存管理# 在32bit Linux中,内核空间的线性映射的虚拟地址和物理地址是如何换算的?
  • PWA 进阶教程(三): 如何在 PWA 中实现后台同步
  • mediacodec服务启动时加载media_codecs.xml
  • MySql面试总结(五)
  • 关于修改 vue Element admin、若依, 等后台管理系统模板的一些全局样式问题:
  • 这样看数组
  • 【TS学习】(19)TS中的类
  • 机器学习(八):K-Means聚类原理与实战
  • CSS3学习教程,从入门到精通, 化妆品网站 HTML5 + CSS3 完整项目(26)
  • Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件详解
  • bilibili全链路压测改造之全链自动化测试实践
  • ZLMediaKit 源码分析——[3] ZLToolKit 中EventPoller之网络事件处理
  • Jmeter操作(数据库)
  • 讯投 QMT 使用小技巧 -如何判断今天是不是交易日
  • Java 流程控制关键字全解析:break、continue 与 goto 的深度实践指南
  • uniapp APP端在线升级(简版)
  • 上海杨浦:鼓励龙头企业与高校共建创新联合体,最高支持200万元
  • 何谓“战略稳定”:“长和平”的实现基础与机制
  • 十大券商看后市|A股中枢有望逐步震荡抬升,把握结构性行情
  • 让胖东来“自闭”的玉石生意,究竟水有多深?
  • 马鞍山市原常务副市长黄化锋一审获刑11年,涉案金额三千余万元
  • 韩国执政党总统候选人更换方案被否决,金文洙候选人资格即刻恢复