SpringBoot实战第三天

今天主要完成了:

新增棋子分类

棋子分类列表

获取棋子分类详情

更新棋子分类

更新棋子分类和添加棋子分类_分组校验

新增棋子

新增棋子参数校验

棋子分类列表查询(条件分页)

先给出分类实体类

@Data
public class Category {private Integer id;//主键ID@NotEmptyprivate String categoryName;//分类名称(赛季全名)@NotEmptyprivate String categoryAlias;//分类别名(赛季版本号)private Integer createUser;//创建人IDprivate LocalDateTime createTime;//创建时间private LocalDateTime updateTime;//更新时间
}

新增棋子分类

接口文档

 

读接口文档,需求就是一个@Insert,但是发现接口文档没有考虑到可能会有重复分类的创建,我认为重复分类的创建是不合适的,所以我做了一个分类存在检测以防止重复分类的出现

基本属于User新建的小修小改,直接上代码

Controller层

    @PostMappingpublic Result add(@RequestBody @Validated Category category){String init_name = category.getCategoryName();Category incategory = categoryService.getCategoryByNAME(init_name);if (incategory == null){        categoryService.add(category);return Result.success();} else {return Result.error("棋子分类已存在!");}}

写了一个条件判断来防止重复分类的出现,用json里给的分类名查分类是否存在

Service层

    @Overridepublic void add(Category category) {Map<String,Object> map = ThreadLocalUtil.get();Integer id  = (Integer) map.get("id");category.setCreateTime(LocalDateTime.now());category.setUpdateTime(LocalDateTime.now());category.setCreateUser(id);categoryMapper.add(category);}@Overridepublic Category getCategoryByNAME(String init_name) {Category c = categoryMapper.getCategoryByNAME(init_name);return c;}

一个新增一个查询,为了达成给分类写入创建人相关信息,还是老方法,从ThreadLocal里面取

Mapper层

    @Insert("insert into category(category_name,category_alias,create_user,create_time,update_time) " +"values(#{categoryName},#{categoryAlias},#{createUser},#{createTime},#{updateTime}) ")void add(Category category);@Select("Select * from category where category_name = #{init_name}")Category getCategoryByNAME(String init_name);

 搞定

棋子分类列表

接口文档

 可以看到,这次不需要接入任何参数,返回的是一个棋子分类列表,区别不大,开搞!

ps:突然发现接口文档要求的时间格式跟直接捞出来的localdatatime格式不一样,这是个问题

Controller层

    @GetMappingpublic Result<List<Category>> list(){List<Category> categoryList = categoryService.list();return Result.success(categoryList);}

Service层

    @Overridepublic List<Category> list() {Map<String,Object> map = ThreadLocalUtil.get();Integer id  = (Integer) map.get("id");return categoryMapper.list(id);}

老规矩,ThreadLocal拿用户信息 

Mapper层

    @Select("select * from category where create_user = #{id}")List<Category> list(Integer id);

解决给出时间格式需修改问题 

在实体类中用 @JsonFormat接口

    private LocalDateTime createTime;//创建时间@JsonFormat(pattern = TIME_REGEXP)private LocalDateTime updateTime;//更新时间

RT,相应的也更新了我的正则文件

    public static final String TIME_REGEXP = "^yyyy-MM-dd HH:mm:ss";

搞定收工 

 

获取棋子分类详情

接口文档

 

阅读接口文档,通过分类ID获取分类全部信息,再多考虑下非法ID输入就行

Controller层

    @GetMapping("detail")public Result<Category> getDetail(Integer id){Category category = categoryService.getCategoryByID(id);if (category == null){return Result.error("查询分类不存在!");}else {return Result.success(category);}}

做了个简单逻辑判断来确保查询的分类是存在的 

Service层

    @Overridepublic Category getCategoryByID(Integer init_ID) {return categoryMapper.getCategoryByID(init_ID);}

Mapper层

    @Select("Select * from category where id = #{init_ID}")Category getCategoryByID(Integer init_ID);

 顺手修改下新增棋子接口

由于这个按ID查询棋子和新增棋子接口用的按分类名查询实际上效果一样,为了提高代码复用率,把新增棋子接口的查询直接改成按ID查询,如下:

    @PostMappingpublic Result add(@RequestBody @Validated Category category){Integer init_ID = category.getId();Category incategory = categoryService.getCategoryByID(init_ID);if (incategory == null){        categoryService.add(category);return Result.success();} else {return Result.error("棋子分类已存在!");}}

(别忘了删除其他基层的按分类名查询) 

 

 

更新棋子分类

接口文档

 

 读接口文档,注意下参数校验和身份验证就行

先看Controller层

    @PutMappingpublic Result update(@RequestBody @Validated Category incategory){Category category = categoryService.getCategoryByID(incategory.getId());if (category == null){return Result.error("要修改的分类不存在!");}else {Integer userID = category.getCreateUser();Map<String,Object> map = ThreadLocalUtil.get();Integer id_user  = (Integer) map.get("id");if (userID.equals(id_user)){categoryService.update(incategory);return Result.success();}else {return Result.error("您所要更改的分类不属于您!");}}}

先对要更改的分类存不存在进行验证,如果存在在进行身份验证,都验证通过了就可以进行修改操作了

Service层

    @Overridepublic void update(Category category) {category.setUpdateTime(LocalDateTime.now());categoryMapper.update(category);}

Mapper层

    @Update("update category set category_name = #{categoryName} , category_alias = #{categoryAlias} , update_time = #{updateTime} where id = #{id}")void update(Category category);

对了,要在实体类中给id加一个@NotNull注解来验证

    @NotNullprivate Integer id;//主键ID

搞定收工 

 

更新棋子分类和添加棋子分类_分组校验

由于我们在刚刚写修改棋子分类的时候给ID加上了notnull的注解,导致了在每次检验CateGory对象的时候都会检验id是否为null,而我们在写新增分类的时候由于id是会自增的所以我们并没有传入棋子id。这时,刚刚的更改会导致新增分类接口无法正常使用,为了解决这个问题,我们就要用到分组校验

分组校验

把校验项进行归类分组,在完成不同功能的时候,校验指定组中的校验项

步骤

1.定义分组

使用接口来定义分组

例如我们要给category加add和update两个分组,我们就可以在其实体类中定义如下两个分组

    public interface Add{}public interface Update{}
2.定义校验项时指定归属的分组

如下例:

    @NotNull(groups = Update.class)private Integer id;//主键ID@NotEmpty(groups = {Update.class,Add.class})private String categoryName;//分类名称@NotEmpty(groups = {Update.class,Add.class})private String categoryAlias;//分类别名

可以看到,分组可以同时指定多个,用{}来承接 

3.校验时指定要校验的分组
 public Result add(@RequestBody @Validated(Category.Add.class) Category category){public Result update(@RequestBody @Validated(Category.Update.class) Category incategory){
小优化

校验分组存在如下两条规则

1.如果某个校验项没有指定分组,则默认属于Defult分组

2.分组之间可以继承,A extends B,则A中继承B中所有的校验项目

那么我们可以对上例进行如下优化:

我们可以看到add和update的唯一区别就是对于ID非空的检验,所以我们可以让其他所有校验直接进入Defult组,并让我们自定义的两个分组都继承Defult组,add独立的划入对于ID的飞控检查

@Data
public class Category {@NotNull(groups = Update.class)private Integer id;//主键ID@NotEmptyprivate String categoryName;//分类名称@NotEmptyprivate String categoryAlias;//分类别名private Integer createUser;//创建人ID@JsonFormat(pattern = TIME_REGEXP)private LocalDateTime createTime;//创建时间@JsonFormat(pattern = TIME_REGEXP)private LocalDateTime updateTime;//更新时间public interface Add extends Default {}public interface Update extends Default {}

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

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

相关文章

[UI5 常用控件] 06.Splitter,ResponsiveSplitter

文章目录 前言1. Splitter1.1 属性 2. ResponsiveSplitter 前言 本章节记录常用控件Splitter,ResponsiveSplitter。主要功能是分割画面布局。 其路径分别是&#xff1a; sap.ui.layout.Splittersap.ui.layout.ResponsiveSplitter 1. Splitter 1.1 属性 orientation &#x…

【QT+QGIS跨平台编译】之二十八:【Protobuf+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、Protobuf介绍二、文件下载三、文件分析四、pro文件4.1 libprotobuf4.2 libprotobuf-lite4.3 libprotoc4.4 protocApp五、编译实践一、Protobuf介绍 Protocol Buffers(简称 Protobuf)是由 Google 开发的一种数据序列化协议,就像 XML 或 JSON 一样,但是它更小、…

DevOps落地笔记-17|度量指标:寻找真正的好指标?

前面几个课时端到端地介绍了软件开发全生命周期中涉及的最佳实践&#xff0c;经过上面几个步骤&#xff0c;企业在进行 DevOps 转型时技术方面的问题解决了&#xff0c;这个时候我们还缺些什么呢&#xff1f;事实上很多团队和组织在实施 DevOps 时都专注于技术&#xff0c;而忽…

【Linux网络编程三】Udp套接字编程(简易版服务器)

【Linux网络编程三】Udp套接字编程(简易版服务器&#xff09; 一.创建套接字二.绑定网络信息1.构建通信类型2.填充网络信息①网络字节序的port②string类型的ip地址 3.最终绑定 三.读收消息1.服务器端接收消息recvfrom2.服务器端发送消息sendto3.客户端端发送消息sendto4.客户端…

TCP 了解

参考&#xff1a;4.2 TCP 重传、滑动窗口、流量控制、拥塞控制 | 小林coding TCP报文 其中比较重要的字段有&#xff1a;&#xff08;1&#xff09;序号&#xff08;sequence number&#xff09;&#xff1a;Seq序号&#xff0c;占32位&#xff0c;用来标识从TCP源端向目的端发…

利用IP地址精准定位服务

在数字化时代&#xff0c;IP地址已成为连接我们与网络世界的纽带之一。通过IP地址&#xff0c;我们可以追踪用户的位置信息&#xff0c;实现精准定位服务。本文将探讨如何利用IP地址精准定位服务&#xff0c;为个人和企业带来便利和价值。 一、什么是IP地址精准定位服务&#…

JDK、JRE、JVM三者关系详解

java开发工具包 java运行环境 java开发工具 Java 运行环境 Java虚拟机 java核心类库 JDK是java开发工具包&#xff0c;包含了编写、编译、运行、调试java程序所需的所有工具和组件。它拥有JRE所拥有的一切&#xff0c;还有编译器和工具&#xff0c;能够创建和编译程序。 …

【FPGA】高云FPGA之IP核的使用->PLL锁相环

FPGA开发流程 1、设计定义2、设计输入3、分析和综合4、功能仿真5、布局布线6、时序仿真7、IO分配以及配置文件&#xff08;bit流文件&#xff09;的生成8、配置&#xff08;烧录&#xff09;FPGA9、在线调试 1、设计定义 使用高云内置IP核实现多路不同时钟输出 输入时钟50M由晶…

IDEA创建SpringBoot+Mybatis-Plus项目

IDEA创建SpringBootMybatis-Plus项目 一、配置Maven apache-maven-3.6.3的下载与安装&#xff08;详细教程&#xff09; 二、创建SpringBoot项目 在菜单栏选择File->new->project->Spring Initializr&#xff0c;然后修改Server URL为start.aliyun.com&#xff0c…

【图像文本化】Base64编解码OpenCV4中 Mat 对象

学习《OpenCV应用开发&#xff1a;入门、进阶与工程化实践》一书 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; 前言 很多时候在开发中&#xff0c;需要保存图像为文本形式&#xff0c;以便于存储与传输。最常见的就是把图像文件编码为Ba…

C# CAD交互界面-自定义工具栏(二)

运行环境 vs2022 c# cad2016 调试成功 一、引用 acdbmgd.dllacmgd.dllaccoremgd.dllAutodesk.AutoCAD.Interop.Common.dllAutodesk.AutoCAD.Interop.dll using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.T…

spring boot学习第十篇:elastic search必须使用用户名密码授权后才能访问、在java代码中操作索引

前提条件&#xff1a;安装好了elastic search服务&#xff0c;参考&#xff1a;elastic search入门_ubuntu elasticsearch 密码-CSDN博客 1、配置elastic search必须使用用户名密码授权才能访问 1.1开启x-pack验证 修改config目录下面的elasticsearch.yml文件&#xff0c;添…

VM 虚拟机和容器技术之间有什么区别?

随着云计算技术的不断发展&#xff0c;虚拟机和容器技术作为两种常见的虚拟化技术&#xff0c;被广泛应用于云计算领域。虽然虚拟机和容器技术都是虚拟化技术&#xff0c;但它们之间存在一些重要的区别。本文将详细介绍虚拟机和容器技术的区别&#xff0c;以便读者更好地了解这…

亚信安慧AntDB推动技术创新与满足用户需求

随着互联网技术的迅猛发展&#xff0c;大数据时代的到来&#xff0c;数据库的需求不断增长。在这样的背景下&#xff0c;国产分布式数据库正逐渐崭露头角&#xff0c;AntDB作为其中的重要代表&#xff0c;也积极参与到了这场竞争中。作为国内的技术创新者&#xff0c;AntDB不仅…

【Git】常见代码冲突及处理

常见的Git冲突场景及解决方案如下&#xff1a; 场景&#xff1a;同时修改同一行代码或同一文件的不同部分。 原因&#xff1a;两个开发者对同一行代码或同一文件的不同部分进行了修改。 解决方案&#xff1a;手动解决冲突&#xff0c;合并两个版本的代码。 # 拉取最新代码 git …

【Mybatis】从0学习Mybatis(2)

前言 本篇文章是从0学习Mybatis的第一篇文章&#xff0c;由于篇幅太长CSDN会限流&#xff0c;因此我打算分开两期来写&#xff0c;这是第二期&#xff01;第一期在这儿&#xff1a;【Mybatis】从0学习Mybatis&#xff08;1&#xff09;-CSDN博客 1.什么是ResultMap结果映射&am…

常用技术网站,maven,git,ideal,java,mysql,Oracle,vue等

常用技术网站 前言pom依赖引用网址&#xff08;maven&#xff09;代码管理工具&#xff08;码云&#xff09;ideal插件下载地址流程图设计工具 前言 本文主要用来记录开发过程中可能会用到的技术资料网站&#xff0c;方便各位码友进行资料查询和资料获取。 pom依赖引用网址&a…

模拟栈(数组实现)

题目 实现一个栈&#xff0c;栈初始为空&#xff0c;支持四种操作&#xff1a; push x – 向栈顶插入一个数x&#xff1b;pop – 从栈顶弹出一个数&#xff1b;empty – 判断栈是否为空&#xff1b;query – 查询栈顶元素。 现在要对栈进行M个操作&#xff0c;其中的每个操作…

从小白到入门webrtc音视频通话

0. 写在前面 先会骑车&#xff0c;再研究为什么这么骑&#xff0c;才是我认为学习技术的思路&#xff0c;底部付了demo例子&#xff0c;根据例子上面的介绍即可运行。 1. 音视频通话要用到的技术简介 websocket 介绍&#xff1a;1. 服务器可以向浏览器推送信息&#xff1b;2…

C#,河豚算法(Blowfish Algorithm)的加密、解密源代码

Bruce Schneier 1 河豚算法&#xff08;Blowfish Algorithm&#xff09; 河豚算法&#xff08;Blowfish Algorithm&#xff09;是1993年11月由Bruce Schneier设计的一个完全开源的算法。 Blowfish算法是一个分组长度为64位、密钥长度可变的对称分组密码算法。 Blowfish算法具…