SSM-Springboot笔记(2)- SpringBoot常用开发技能

1 SpringBoot常用开发技能

1.1 项目架构

  • 创建项⽬
  • 配置启动类
  • 建⽴对应的包,先建⽴这些包,其他⽤到再补充
controller
service
mapper
domain
utils

1.2 开发HTTP接⼝GET请求

GET请求
场景:⼀般的查询接⼝就是get请求
注解:@GetMapping = @RequestMapping(method = RequestMethod.GET)
⼀个顶两的注解

@GetMapping = @RequestMapping(method = RequestMethod.GET)
@PostMapping = @RequestMapping(method = RequestMethod.POST)
@PutMapping = @RequestMapping(method = RequestMethod.PUT)
@DeleteMapping = @RequestMapping(method = RequestMethod.DELETE)

示例:视频列表查询

  • 实体类:Video
public class Vedio implements Serializable {private Integer id;private String title;private String summary;private Integer price;private String coverImg;private Date createTime;public Vedio() {}public Vedio(Integer id, String title) {this.id = id;this.title = title;this.createTime = new Date();}
// 省get、set、tostring方法
  • mapper类:VideoMapper
@Repository
public class VideoMapper {private static Map<Integer, Vedio> videoMap = new HashMap<>();/*** 模拟数据*/static {videoMap.put(1, new Vedio(1 , "东邪西毒"));videoMap.put(2, new Vedio(2 , "精武英雄"));videoMap.put(3, new Vedio(3 , "霸王别姬"));videoMap.put(4, new Vedio(4 , "南极大冒险"));videoMap.put(5, new Vedio(5 , "变形金刚"));videoMap.put(6, new Vedio(6 , "流浪地球"));}// 获取视频列表public List<Vedio> listVideo() {List<Vedio> list = new LinkedList<>();list.addAll(videoMap.values());return list;}
}
  • service类,包括接口和实现类
    接口类: VideoService
public interface VideoService {List<Vedio> listVideo();
}

实现类:VideoServiceImpl

@Service
public class VideoServiceImpl implements VideoService {@Autowired  // 自动注入VideoMapperprivate VideoMapper videoMapper;@Overridepublic List<Vedio> listVideo() {return videoMapper.listVideo();}
}
  • Controller类:VideoController
@RestController
@RequestMapping("/app/v1/video")
public class VideoController {@Autowired  // 自动注入VideoService实现类private VideoService videoService;@RequestMapping("list")public Object getList() {return videoService.listVideo();}
}

测试:

  • 启动程序
  .   ____          _            __ _ _/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/  ___)| |_)| | | | | || (_| |  ) ) ) )'  |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot ::                (v2.6.2)2022-01-12 14:11:05.388  INFO 20464 --- [           main] c.j.s.Springbootdemo2Application         : No active profile set, falling back to default profiles: default
2022-01-12 14:11:06.005  INFO 20464 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2022-01-12 14:11:06.011  INFO 20464 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-01-12 14:11:06.011  INFO 20464 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.56]
2022-01-12 14:11:06.068  INFO 20464 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-01-12 14:11:06.068  INFO 20464 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 646 ms
2022-01-12 14:11:06.315  INFO 20464 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-01-12 14:11:06.321  INFO 20464 --- [           main] c.j.s.Springbootdemo2Application         : Started Springbootdemo2Application in 1.198 seconds (JVM running for 1.959)
  • 访问接口

1.3 制定统⼀接⼝返回协议

实际开发中通过⾃定义返回对象,统⼀协议,能够有效的避免开发中协议不统一导致的许多问题,而且还能提供工作的效率。

  • 自定义返回信息对象(务必生成get、set方法)
/*** 业务返回信息类*/
public class RetData {/*** 业务返回码,默认:0:成功,-1:失败*/private int code;   // 业务返回码/*** 业务数据*/private Object data;    // 业务数据/*** 返回信息*/private String message; // 状态信息public RetData(){}public RetData(int code, Object data, String message) {this.code = code;this.data = data;this.message = message;}/*** 无参返回成功,默认返回码*/public static RetData RetSuccess() {return new RetData(0, null, "success");}/*** 有参返回成功,默认返回码* @param data* @return*/public static RetData RetSuccess(Object data) {return new RetData(0, data, "success");}/*** 无参返回错误,默认返回码* @return*/public static RetData RetError() {return new RetData(-1, null, "unknow error");}/*** 默认返回码带错误信息* @param msg* @return*/public static RetData RetError(String msg) {return new RetData(-1, null, msg);}/*** 自定义返回码带错误信息* @param code* @param msg* @return*/public static RetData RetError(int code, String msg) {return new RetData(code, null, msg);}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}
  • 在VideoController类中使用RetData返回
    @RequestMapping("list")public Object getList() {return RetData.RetSuccess(videoService.listVideo()); // 使用RetData返回}
  • 重启程序并访问接口,返回结果如下:
    code:业务返回码
    data:业务数据
    message:返回信息
{"code": 0,"data": [{"id": 1,"title": "东邪西毒","summary": null,"price": null,"coverImg": null,"createTime": "2022-01-12T06:43:36.907+00:00"},{"id": 2,"title": "精武英雄","summary": null,"price": null,"coverImg": null,"createTime": "2022-01-12T06:43:36.907+00:00"},{"id": 3,"title": "霸王别姬","summary": null,"price": null,"coverImg": null,"createTime": "2022-01-12T06:43:36.907+00:00"},{"id": 4,"title": "南极大冒险","summary": null,"price": null,"coverImg": null,"createTime": "2022-01-12T06:43:36.907+00:00"},{"id": 5,"title": "变形金刚","summary": null,"price": null,"coverImg": null,"createTime": "2022-01-12T06:43:36.907+00:00"},{"id": 6,"title": "流浪地球","summary": null,"price": null,"coverImg": null,"createTime": "2022-01-12T06:43:36.907+00:00"}],"message": "success"
}

1.4 开发HTTP接⼝POST请求

POST请求-form表单
场景:表单提交,如果不⽤细分PUT/DELETE⽅法,则都可以⽤POST
注解:@PostMapping = @RequestMapping(method = RequestMethod.POST)
测试:

  • 编写UserController类
@RestController
@RequestMapping("/app/v1/user")
public class UserController {@PostMapping("login")public RetData login(String username, String pwd) {System.out.println("username:" + username + ",pwd:" + pwd);return RetData.RetSuccess("");}
}
  • 启动程序
  • 采用参数形式

能够正常接收post提交的参数

  • 采用form表单形式

也能够正常接收post提交的参数

实际开发中,参数数量比较多,通常我们会用对象接收参数,修改UserController如下:

@RestController
@RequestMapping("/app/v1/user")
public class UserController {@PostMapping("login")public RetData login(User user) {System.out.println("user:" + user.toString());return RetData.RetSuccess("");}
}

再次使用form表达形式提交

程序依然能够正常接收post提交的参数

user:User{id=null, username='tom', password='8888'}

但实际开发中,接口一般都是以json形式提交参数,提交方式如下:

此时程序无法正常接收数据

user:User{id=null, username='null', password='null'}

为了正常接收json形式的参数,需要在对象参数前面加注解:@RequestBody
注意:参数名字与对象属性名称保持一致

    @PostMapping("login")public RetData login(@RequestBody User user) {System.out.println("user:" + user.toString());return RetData.RetSuccess("");}

这样才能正常的接收

user:User{id=null, username='fanny', password='123456'}

开发示例:账号密码提交登录接⼝,form表单形式

  • Mapper类:UserMapper
@Repository
public class UserMapper {private static Map<String, User> userMap = new HashMap<>();static {userMap.put("jackyan", new User(1, "jackyan", "123456"));userMap.put("lucy", new User(2, "lucy", "888888"));userMap.put("tom", new User(3, "tom", "666666"));userMap.put("fancy", new User(4, "fancy", "555555"));}public User login(String username, String password) {User user = userMap.get(username);if (user == null) {return null;} else if (user.getPassword().equals(password)) {return user;}return null;}
}
  • Service类
    接口类:UserService
public interface UserService {public String login(String username, String password);
}

实现类:

@Service
public class UserServiceImpl implements UserService {// 模拟保存用户sessionprivate static Map<String, User> sessionMap = new HashMap<>();@Autowiredprivate UserMapper userMapper;@Overridepublic String login(String username, String password) {User user = userMapper.login(username, password);if (user == null) {return null;}String token = UUID.randomUUID().toString();// 保存用户sessionsessionMap.put(token, user);return token;}
}
  • Controller类:UserController
@RestController
@RequestMapping("/app/v1/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("login")public RetData login(@RequestBody User user) {String token = userService.login(user.getUsername(), user.getPassword());if (token == null) {return RetData.RetError("用户名或密码错误!");}return RetData.RetSuccess(token);}
}
  • 测试

登录成功

登录失败

1.5 RequestBody对象数组提交接⼝

POST请求-RequestBody⽅式
开发示例:新增视频json对象,章数组提交

  • Video类增加章列表信息
    private List<Chapter> chapterList;
  • 新增Chapter类
/*** 视频章信息*/
public class Chapter {private Integer id;private Integer videoId;private String title;public Chapter() {}public Chapter(Integer id, Integer videoId, String title) {this.id = id;this.videoId = videoId;this.title = title;}
// 省略set、get、tostring方法
  • 编写Controller类测试
    @PostMapping("save_video")public RetData saveVideo(@RequestBody Video video) {return RetData.RetSuccess(video);}
  • 测试,发送数据
{"id":1001,"title":"精武英雄","chapterList":[{"id":10001,"title": "日本求学"},{"id":10002,"title": "回国探师"},{"id":10003,"title": "比武切磋"}]
}
  • 测试结果
{"code": 0,"data": {"id": 1001,"title": "精武英雄","summary": null,"price": null,"coverImg": null,"createTime": null,"chapterList": [{"id": 10001,"videoId": null,"title": "日本求学"},{"id": 10002,"videoId": null,"title": "回国探师"},{"id": 10003,"videoId": null,"title": "比武切磋"}]},"message": "success"
}

1.6 定制JSON字段

springboot中自带jackson相关包,可以用来定制化处理实体类字段相关信息:
指定字段不返回:@JsonIgnore
指定⽇期格式:@JsonFormat(pattern="yyyy-MM-dd hh:mm:ss",locale="zh",timezone="GMT+8")
空字段不返回:@JsonInclude(Include.NON_NULL)
指定别名:@JsonProperty

    @JsonProperty("cover_img") // 给字段取别名private String coverImg;@JsonFormat(pattern="yyyy-MM-dd hh:mm:ss",locale="zh",timezone="GMT+8")@JsonProperty("create_time")private Date createTime;@JsonProperty("chapter_list")
    @JsonIgnore // 该字段不返回private String password;
最后编辑于:2024-10-27 14:57:15


喜欢的朋友记得点赞、收藏、关注哦!!!

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

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

相关文章

Android在kts中使用navigation及Args

Android在kts中使用navigation及Args 前言&#xff1a; ​ 之前在项目中使用过navigation&#xff0c;但都是以Groory的方式&#xff0c;最近一年多使用kts后忍不住把项目都改成kts的方式&#xff0c;不过其中也遇到不少坑&#xff0c;今天就讲解一下如何在kts中使用navigati…

MyBatis缓存详解(一级缓存、二级缓存、缓存查询顺序)

固态硬盘缺陷&#xff1a;无法长时间使用&#xff0c;而磁盘只要不消磁&#xff0c;只要不受到磁影响&#xff0c;就可以长期使用&#xff0c;因此绝大多数企业还是使用磁盘来存储数据 像mysql这种关系型数据库中的数据存储在磁盘中&#xff0c;为方便查询&#xff0c;减少系统…

springboot襄阳华侨城奇幻度假区服务平台-计算机毕业设计源码93560

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3 开发技术 1.3.1 B/S架构 1.3.2 Spring Boot框架 1.3.3 Java语言 1.3.4 MySQL数据库 1.4论文章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 登录流程 2.2.2数据删除流程 2.3 系统…

2024年好用不踩雷的8款图纸加密软件推荐!CAD图纸加密软件!

在2024年&#xff0c;随着信息安全需求的提升&#xff0c;特别是对于设计、建筑、制造等行业的CAD图纸保护&#xff0c;图纸加密软件的选择尤为重要。以下推荐了8款优质的CAD图纸加密软件&#xff0c;这些软件不仅提供了强大的加密功能&#xff0c;还在易用性和兼容性方面表现出…

创新业态下金融头部机构在 FICC 平台建设上的思考与实践

近年来&#xff0c;FICC 投资交易呈现活跃多元态势&#xff0c;创新转型稳步推进。FICC 平台电子化方兴未艾&#xff0c;是机构提升服务效率和质量的一大着力点。因此&#xff0c;在 FICC 平台建设上&#xff0c;许多机构都进行了深入研究&#xff0c;积累了丰富的实践经验。 …

MongoDB快速入门

MongoDB 概念 什么是 MongoDB MongoDB 是在2007年由DoubleClick公司的几位核心成员开发出的一款分布式文档数据库&#xff0c;由C语言编写。 目的是为了解决数据大量增长的时候系统的可扩展性和敏捷性。MongoDB要比传统的关系型数据库简单很多。 在MongoDB中数据主要的组织…

Spring boot 配置文件的加载顺序

Spring Boot 在启动时会扫描以下位置的 application.properties 或者 application.yml 文件作为全局配置文件&#xff1a; –file:./config/–file:./–classpath:/config/–classpath:/以下是按照优先级从高到低的顺序&#xff0c;如下所示&#xff1a; Spring Boot 会全部扫…

医院信息化与智能化系统(10)

医院信息化与智能化系统(10) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

自由学习记录(15)

Java注解 else if的省略问题&#xff08;可能看花&#xff09; else if也是取最近的if连通&#xff0c;看上去加了{}就可以正常执行了&#xff0c;缩进要命&#xff0c;不提示真容易看错&#xff0c; 组合数公式和数组参数 在 C 中&#xff0c;数组作为函数参数时&#xff0c;…

【课件分享】蓝光光盘及光驱团标解读

关注我们 - 数字罗塞塔计划 - 10月26日&#xff0c;非常感谢陶光毅老师携特邀嘉宾许斌老师和游泳总能够在百忙之中抽空莅临数字罗塞塔计划直播间&#xff0c;为大家带来蓝光光盘及光驱团标解读。作为标准的起草者&#xff0c;你们的专业见解和宝贵经验&#xff0c;让我们对T/CE…

Lucas带你手撕机器学习——SVM支持向量机

#1024程序员节&#xff5c;征文# 支持向量机&#xff08;SVM&#xff09;的详细讲解 什么是SVM&#xff1f; 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种用于分类和回归的监督学习算法。它的主要任务是从给定的数据中找到一个最佳的决策…

Windows/Linux(服务器)查看显卡的名称

文章目录 1. 使用 nvidia-smi&#xff08;适用于 NVIDIA 显卡&#xff09;2. 使用 wmic 命令&#xff08;Windows&#xff09; 1. 使用 nvidia-smi&#xff08;适用于 NVIDIA 显卡&#xff09; 如果服务器上安装了 NVIDIA 驱动程序&#xff0c;可以使用 nvidia-smi 工具来查看…

vue使用xlsx以及file-saver进行下载xlsx文件以及Unit8Array、ArrayBuffer、charCodeAt的使用

先说Unit8Array、ArrayBuffer、charCodeAt的使用下面会用到这三个 Unit8Array&#xff1a;数组类型表示一个 8 位无符号整型数组&#xff0c;创建时内容被初始化为 0。创建完后&#xff0c;可以以对象的方式或使用数组下标索引的方式引用数组中的元素。 new Uint8Array(); //…

Docker中如何控制服务启动顺序实现探讨

文章目录 一、Docker概述二、Docker三剑客1. Compose2. Machine3. Swarm 三、简要需求1. 样例工程2. 代码模块3. 调用方向4. 期望启动顺序 四、思路分析1.各走各路1.&#xff09;docker-compose -f指定不同配置文件2.&#xff09;docker-compose up -d service-name指定服务名3…

【CSS in Depth 2 精译_055】8.3 伪类 :is() 和 :where() 的正确打开方式

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第三部分 现代 CSS 代码组织】 ✔️【第八章 层叠图层及其嵌套】 ✔️ 8.1 用 layer 图层来操控层叠规则&#xff08;上篇&#xff09; 8.1.1 图层的定义&#xff08;上篇&#xff09;8.1.2 图层的…

巡飞单机多旋翼无人机技术详解

巡飞单机多旋翼无人机技术是一种集成了多种先进技术的无人机系统&#xff0c;它具备自主飞行、长续航、高精度控制以及多任务负载能力等特点。以下是对巡飞单机多旋翼无人机技术的详细解析&#xff1a; 一、机架与结构设计 1.材料选择&#xff1a;为了确保无人机能够承载足够…

cmake命令使用

有关cmake的入门简介可参见 CMake入门教程_cmake静态test.c编译-CSDN博客 本文是进一步对cmake常用命令做进一步详述 配置项目 cmake_minimum_required 作用 配置cmake最低版本 用法 cmake_minimum_required(VERSION 3.0) project 作用&#xff1a;设置预设变量 PROJEC…

深度学习(一)基础:神经网络、训练过程与激活函数(1/10)

深度学习基础&#xff1a;神经网络、训练过程与激活函数 引言&#xff1a; 深度学习作为机器学习的一个子领域&#xff0c;近年来在人工智能的发展中扮演了举足轻重的角色。它通过模仿人脑的神经网络结构&#xff0c;使得计算机能够从数据中学习复杂的模式和特征&#xff0c;…

dmsql日志分析工具部署与使用DM8/DM7

dmsql日志分析工具部署与使用DM8/DM7 1 环境介绍2 JAVA 环境变量配置2.1 Os Kylin 10 JAVA 环境变量配置2.2 Windos7 JAVA环境变量配置 3 数据库配置3.1 数据库初始化参数3.2 数据库创建表 4 配置DMLOG日志分析工具4.1 Kylin v10 配置DMLOG日志分析工具4.2 执行日志分析4.3 Win…

linux面试题复习

前言 现在只是初版&#xff0c;很多格式我还没有改好&#xff0c;会慢慢修改订正。 可能用到的网址&#xff1a;在线 EXCEL 到 MARKDOWN 转换器。 参考了很多网上的面试题和外网上的面试题&#xff1a; 参考文档&#xff1a; 程序员的50大Linux面试问题及答案 Top 60 Linux …