1. SpringBoot快速上手
1.1 SpringBoot介绍
- Spring Boot是由Pivotal团队提供的基于Spring的全新框架,旨在简化Spring应用的初始搭建和开发过程。
- Spring Boot是所有基于Spring开发项目的起点。
- Spring Boot就是尽可能地简化应用开发的门槛,让应用开发、测试、部署变得更加简单。
1.2 SpringBoot的特点
- 遵循“
约定优于配置
”的原则,只需要很少的配置或使用默认的配置。 - 能够使用内嵌的
Tomcat、Jetty
服务器,不需要部署war文件。 - 提供定制化的启动器Starters,简化Maven配置,开箱即用。
- 纯Java配置,没有代码生成,也不需要XML配置。
- 提供了生产级的服务监控方案,如安全监控、应用监控、健康检测等。
2. SpringBoot Controller
2.1 Web入门
- Spring Boot将传统
Web开发
的mvc、json、tomcat
等框架整合,提供了spring-boot-starter-web
组件,简化了Web应用配置。 - 创建SpringBoot项目勾选
Spring Web
选项后,会自动将spring-boot-starter-web组件加入到项目中。 - spring-boot-starter-web
启动器
主要包括web、webmvc、json、tomcat等
基础依赖组件,作用是提供Web开发场景所需的所有底层依赖。 - webmvc为Web开发的基础框架,json为JSON数据解析组件,tomcat为自带的容器依赖。
2.2 控制器
Spring Boot提供了@Controller
和@RestController
两种注解来标识此类负责接收和处理HTTP请求。
如果请求的是页面和数据
,使用@Controller注解
即可;如果只是请求数据
,则可以使用@RestController
注解。
@Controller的用法
- 示例中返回了hello页面和name的数据,在前端页面中可以通过${name}参数获取后台返回的数据并显示。
- @Controller通常与Thymeleaf模板引擎结合使用。
@RestController的用法
- 默认情况下,@RestController注解会将返回的对象数据转换为JSON格式。
2.3 路由映射
- @RequestMapping注解主要负责URL的路由映射。它可以添加在Controller类或者具体的方法上。
- 如果添加在Controller类上,则这个Controller中的所有路由映射都将会加上此映射规则,如果添加在方法上,则只对当前方法生效。
- @RequestMapping注解包含很多属性参数来定义HTTP的请求映射规则。常用的属性参数如下:
value
: 请求URL的路径,支持URL模板、正则表达式
method
: HTTP请求方法
consumes
: 请求的媒体类型(Content-Type),如application/json
produces
: 响应的媒体类型
params,headers
: 请求的参数及请求头的值
2.4 Method匹配
- HTTP请求
Method
有GET、POST、PUT、DELETE
等方式。HTTP支持的全部Method - @RequestMapping注解提供了method参数指定请求的Method类型,包括
RequestMethod.GET、RequestMethod.POST、RequestMethod.DELETE、RequestMethod.PUT
等值,分别对应HTTP请求的Method
- Method匹配也可以使用
@GetMapping、@PostMapping
等注解代替。
使用示例:
package com.example.gaokespringboot.controller;
import com.example.gaokespringboot.entity.User;
import org.springframework.web.bind.annotation.*;
/**
* @author py
* @date 2022-10-05 14:48
*/
@RestController
public class ParamsController {
@RequestMapping(value = "/getTest1", method = RequestMethod.GET)
//http://localhost:8080/getTest1
public String getTest1(){
return "GET请求";
}
//传入参数
@RequestMapping(value = "/getTest2", method = RequestMethod.GET)
//http://localhost:8080/getTest2?nickname=XXX&phone=XXX
public String getTest2(String nickname, String phone){
System.out.println("nickname:" + nickname);
System.out.println("phone:" + phone);
return "GET请求";
}
//@RequestParam注解:参数映射,如果使用则必须传递参数
@RequestMapping(value = "/getTest3", method = RequestMethod.GET)
//http://localhost:8080/getTest3?nickname=XXX
public String getTest3(@RequestParam("nickname") String name){
System.out.println("nickname:" + name);
return "GET请求";
}
@RequestMapping(value = "/postTest1", method = RequestMethod.POST)
public String postTest1(){
return "POST请求";
}
@RequestMapping(value = "/postTest2", method = RequestMethod.POST)
public String postTest2(String nickname, String phone){
System.out.println("nickname:" + nickname);
System.out.println("phone:" + phone);
return "POST请求";
}
//使用User对象进行封装
@RequestMapping(value = "/postTest3", method = RequestMethod.POST)
public String postTest3(User user){
System.out.println(user);
return "POST请求";
}
//@RequestBody注解:接收前端传递的json数据
@RequestMapping(value = "/postTest4", method = RequestMethod.POST)
public String postTest4(@RequestBody User user){
System.out.println(user);
return "POST请求";
}
@GetMapping("/test/**")
public String test() {
return "通配符请求";
}
}
3. SpringBoot文件上传+拦截器
3.1 文件上传
- Spring Boot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。
- 要更改这个默认值需要在配置文件(如application.properties)中加入两个配置
- 当表单的enctype="multipart/form-data"时,可以使用MultipartFile 获取上传的文件数据,再通过transferTo方法将其写入到磁盘中
package com.example.gaokespringboot.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
/**
* @author py
* @date 2022-10-08 19:54
*/
@RestController
public class FileUploadController {
@PostMapping("/upload")
public String up(String nickname, MultipartFile photo, HttpServletRequest request) throws IOException {
//获取图片名称
System.out.println(nickname);
//获取图片原始名称
System.out.println(photo.getOriginalFilename());
//获取文件类型
System.out.println(photo.getContentType());
//获取文件路径
String path = request.getServletContext().getRealPath("/upload");
System.out.println(path);
saveFile(photo, path);
return "上传成功";
}
public void saveFile(MultipartFile photo, String path) throws IOException {
//判断存储目录是否存在,如果不存在则创建
File dir = new File(path);
if (!dir.exists()) {
//创建目录
dir.mkdir();
}
File file = new File(path + photo.getOriginalFilename());
photo.transferTo(file);
}
}
3.2 拦截器
- 拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现。总结起来,拦截器大致有以下几种使用场景:
- 权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回登录页面。
- 性能监控:有时系统在某段时间莫名其妙很慢,可以通过拦截器在进入处理程序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间
- 通用行为:读取
cookie
得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有提取Locale、Theme
信息等,只要是多个处理程序都需要的,即可使用拦截器实现。 - Spring Boot定义了
HandlerInterceptor
接口来实现自定义拦截器的功能
HandlerInterceptor接口定义了preHandle、postHandle、afterCompletion
三种方法,通过重写这三种方法实现请求前、请求后等操作
拦截器定义
拦截器注册
4. RESTful+Swagger
4.1 Restful
Restful介绍
- RESTful是目前流行的互联网软件服务架构设计风格。
- REST(Representational State Transfer,表述性状态转移)一词是由Roy Thomas Fielding在2000年的博士论文中提出的,它定义了互联网软件服务的架构原则,如果一个架构符合
REST原则
,则称之为RESTful架构
。 - REST并不是一个标准,它更像一组客户端和服务端交互时的架构理念和设计原则,基于这种架构理念和设计原则的
Web API
更加简洁,更有层次。
RESTful的特点
- 每一个
URI
代表一种资源 - 客户端使用
GET、POST、PUT、DELETE
四种表示操作方式的动词对服务端资源进行操作:GET用于获取资源,POST用于新建资源(也可以用于更新资源),PUT用于更新资源,DELETE用于删除资源。 - 通过操作资源的表现形式来实现服务端请求操作。
- 资源的表现形式是
JSON或者HTML
。 - 客户端与服务端之间的交互在请求之间是
无状态的
,从客户端到服务端的每个请求都包含必需的信息。
RESTful API
- 符合RESTful规范的Web API需要具备如下两个关键特性:
安全性:安全的方法被期望不会产生任何副作用,当我们使用GET操作获取资源时,不会引起资源本身的改变,也不会引起服务器状态的改变。
幂等性:幂等的方法保证了重复进行一个请求和一次请求的效果相同(并不是指响应总是相同的,而是指服务器上资源的状态从第一次请求后就不再改变了),在数学上幂等性是指N次变换和一次变换相同。
HTTP Method
HTTP提供了POST、GET、PUT、DELETE
等操作类型对某个Web资源进行Create、Read、Update和Delete
操作。
一个HTTP请求除了利用URI标志目标资源之外,还需要通过HTTP Method指定针对该资源的操作类型,一些常见的HTTP方法及其在RESTful风格下
的使用
HTTP
状态码就是服务向用户返回的状态码和提示信息,客户端的每一次请求,服务都必须给出回应,回应包括HTTP状态码和数据两部分。- HTTP定义了40个标准状态码,可用于传达客户端请求的结果。状态码分为以下5个类别:
1xx
:信息,通信传输协议级信息
2xx
:成功,表示客户端的请求已成功接受
3xx
:重定向,表示客户端必须执行一些其他操作才能完成其请求
4xx
:客户端错误,此类错误状态码指向客户端
5xx
:服务器错误,服务器负责这写错误状态码 RESTful API中使用HTTP状态码
来表示请求执行结果的状态,适用于REST API设计的代码以及对应的HTTP方法。
Spring Boot实现RESTful API
-
Spring Boot提供的
spring-boot-starter-web
组件完全支持开发RESTful API
,提供了与REST操作方式(GET、POST、PUT、DELETE)
对应的注解。
@GetMapping
:处理GET请求,获取资源。
@PostMapping
:处理POST请求,新增资源。
@PutMapping
:处理PUT请求,更新资源。
@DeleteMapping
:处理DELETE请求,删除资源。
@PatchMapping
:处理PATCH请求,用于部分更新资源。 -
在RESTful架构中,每个网址代表一种资源,所以
URI
中建议不要包含动词,只包含名词即可,而且所用的名词往往与数据库的表格
名对应。
用户管理模块API示例:
用法示例:
package com.example.gaokespringboot.controller;
import com.example.gaokespringboot.entity.User;
import org.springframework.web.bind.annotation.*;
/**
* @author py
* @date 2022-10-12 15:20
*/
@RestController
public class UserController {
@GetMapping("/user/{id}")
public String getUserById(@PathVariable int id) {
System.out.println(id);
return "根据id获取用户信息";
}
@PostMapping("/user")
public String save(User user) {
return "添加用户";
}
@PutMapping("/user")
public String update(User user) {
return "更新用户";
}
@DeleteMapping("/user/{id}")
public String deleteById(@PathVariable int id) {
System.out.println(id);
return "根据id删除用户";
}
}
4.2 Swagger
什么是Swagger
- Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化
RESTful风格的Web服务,是非常流行的API表达工具
。 - Swagger能够自动生成完善的
RESTful API
文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。
- 在Spring Boot项目中集成Swagger同样非常简单,只需在项目中引入
springfox-swagger2
和springfox-swagger-ui
依赖即可。
配置Swagger
package com.example.gaokespringboot.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @author py
* @date 2022-10-12 15:39
*/
@Configuration //告诉Spring容器,这个类是一个配置类
@EnableSwagger2 //启用Swagger2功能
public class SwaggerConfig {
/**
* 配置Swagger2相关的Bean
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com"))//com包下所有API都交给swagger2管理
.paths(PathSelectors.any()).build();
}
/**
* 此处主要是API文档页面显示信息
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("演示项目API") //标题
.description("演示项目") //描述
.version("1.0") //版本
.build();
}
}
Spring Boot 2.6.X
后与Swagger有版本冲突问题,需要在application.properties
中加入以下配置:
- 启动项目访问 http://127.0.0.1:8080/swagger-ui.html ,即可打开自动生成的可视化测试页面
Swagger常用注解
- Swagger提供了一系列注解来描述接口信息,包括接口说明、请求方法、请求参数、返回信息等
5 MybatisPlus
5.1 ORM介绍
ORM(Object Relational Mapping,对象关系映射)
是为了解决面向对象与关系数据库存在的互不匹配现象的一种技术。- ORM通过使用描述对象和数据库之间映射的元数据将程序中的对象自动持久化到关系数据库中。
- ORM框架的
本质
是简化编程中操作数据库的编码。
5.2 MybatisPlus介绍
MyBatis
是一款优秀的数据持久层ORM框架
,被广泛地应用于应用系统。- MyBatis能够非常灵活地实现
动态SQL
,可以使用XML或注解来配置和映射原生信息,能够轻松地将Java的POJO
(Plain Ordinary Java Object,普通的Java对象)与数据库中的表和字段进行映射关联。
MyBatis-Plus是一个 MyBatis 的增强工具,在 MyBatis 的基础上做了增强,简化了开发。
添加依赖
<!-- MybatisPlus依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<!-- mysql驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 数据连接池druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
全局配置
- 配置数据库相关信息
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://:localhost:3306/gaokedb?useSSL=false
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driverClassName=com.mysql.jdbc.Driver
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
- 添加@MapperScan注解
@SpringBootApplication
@MapperScan("com.example.gaokespringboot.mapper")
public class GaokeSpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(GaokeSpringbootApplication.class, args);
}
}
- Mybatis CRUD注解
MybatisPlus注解
@TableName
,当表名与实体类名称不一致时,可以使用@TableName注解进行关联。@TableField
,当表中字段名称与实体类属性不一致时,使用@TableField进行关联@TableId
,用于标记表中的主键字段,MybatisPlus也提供了主键生成策略。