SpringBoot
本篇文章是根据黑马程序员SpringBoot2全套视频教程出品的视频,学习所做的笔记🐰。
视频发布时间:2021.10.26
1. 快速上手SpringBoot
1.1 SpringBoot入门程序开发
SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程
1.1.1 S2pringBoot入门程序
1)创建新模块,选择Spring Initializr,并配置模块相关基础信息
2)选择当前模块需要使用的技术集
3)开发控制器类
4)运行自动生成的Application类
1.1.2 入门案列
最简SpringBoot程序所包含的基础文件
- pom.xml文件
- Application类
Spring程序与SpringBoot程序对比
注意:基于idea开发SpringBoot程序需要确保联网且能够加载到程序框架结构
1.1.3 隐藏指定文件/文件夹
Idea中隐藏指定文件或指定类型文件的步骤:
- Setting → File Types → Ignored Files and Folders
- 输入要隐藏的文件名,支持*号通配符
- 回车确认添加
1.2 SpringBoot简介
SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程
- Spring程序缺点
- 依赖设置繁琐
- 配置繁琐
- SpringBoot程序优点
- 起步依赖(简化依赖配置)
- 自动配置(简化常用工程相关配置)
- 辅助功能(内置服务器,……
1.2.1 简化依赖配置
parent
开发SpringBoot程序要继承spring-boot-starter-parent
spring-boot-starter-parent中定义了若干个依赖管理
继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突
继承parent的形式也可以采用引入依赖的形式实现效果
定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的
spring-boot-starter-parent各版本间存在着诸多坐标版本不同
starter
- SpringBoot中常见项目名称,定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的
- 开发SpringBoot程序需要导入坐标时通常导入对应的starter
- 每个不同的starter根据功能不同,通常包含多个依赖坐标
- 使用starter可以实现快速配置的效果,达到简化配置的目的
实际开发
- 使用任意坐标时,仅书写GAV中的G和A,V由SpringBoot提供,除非SpringBoot未提供对应版本V
- 如发生坐标错误,再指定Version(要小心版本冲突)
1.2.2 自动配置
引导类
1 |
|
- SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目
- SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean
1.2.3 辅助功能
内嵌tomcat
- 内嵌Tomcat服务器是SpringBoot辅助功能之一
- 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理
- 变更内嵌服务器思想是去除现有服务器,添加全新的服务器
Jetty比Tomcat更轻量级,可扩展性更强(相较于Tomcat),谷歌应用引擎(GAE)已经全面切换为Jetty
内置服务器的比较:
tomcat(默认) apache出品,粉丝多,应用面广,负载了若干较重的组件 jetty 更轻量级,负载性能远不及tomcat undertow 负载性能勉强跑赢tomcat
2. 基础配置
2.1 属性配置
配置位置:SpringBoot默认配置文件application.properties
修改服务器端口
server.port=80
关闭运行日志图标(banner)
spring.main.banner-mode=off
设置日志相关
logging.level.root=debug
SpringBoot内置属性查询
- https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties
- 官方文档中参考文档第一项:Application Properties
2.2 配置文件分类
SpringBoot提供了多种属性配置方式
- properties(传统格式/默认格式)
- yml(主流格式)
- yaml
SpringBoot配置文件加载顺序
application.properties > application.yml > application.yaml
- 配置文件间的加载优先级
- properties(最高)
- yml
- yaml(最低)
- 配置文件间的加载优先级
不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留
2.3 yaml文件
YAML文件扩展名
- .yml(主流)
- .yaml
yaml语法规则
大小写敏感
属性层级关系使用多行描述,每行结尾使用冒号结束
使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
# 表示注释
1
核心规则:数据前面要加空格与冒号隔开
2.4 yaml数据读取
方式一:
使用局部变量
使用@Value读取单个数据,属性名引用方式:${一级属性名.二级属性名……}
如果数据存在多层级,依次书写层级名称即可
缺点:需要定义多个变量
方式二
封装全部数据到Environment对象
- 使用Environment对象封装全部配置信息
- 使用@Autowired自动装配数据到Environment对象中
方式三
自定义对象封装指定数据
注意:
- 自定义对象中的变量名需要和配置文件中的变量名一致
- 封装类需要定义为Spring管理的bean,否则无法进行属性注入
- 使用@ConfigurationProperties注解绑定配置信息到封装类中
3. 整合第三方技术
3.1 整合junit
直接创建一个最简单的spring Initializer模块即可
- 导入测试对应的starter
- 测试类使用@SpringBootTest修饰
- 使用自动装配的形式添加要测试的对象
对SpringBootTest的解释:
类型:测试类注解
位置:测试类定义上方
作用:设置JUnit加载的SpringBoot启动类
范例:
1
2
3@SpringBootTest
class JunitInterApplicationTests {
}注意:如果测试类在SpringBoot启动类的包或子包中,可以省略启动类的设置,也就是省略classes的设定
1
2@SpringBootTest(classes = Springboot05JUnitApplication.class)
class Springboot07JUnitApplicationTests {}
- 测试类如果存在于引导类所在包或子包中无需指定引导类
- 测试类如果不存在于引导类所在的包或子包中需要通过classes属性指定引导类
3.2 整合MyBatis
①创建新模块,选择Spring初始化,并配置模块相关基础信息
②选择当前模块需要使用的技术集(MyBatis、MySQL)
③设置数据源参数
1 |
|
注意:SpringBoot版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区
④定义数据层接口与映射配置
1 |
|
⑤测试类中注入dao接口,测试功能
1 |
|
总结✍🏻:
勾选MyBatis技术,也就是导入MyBatis对应的starter
数据库连接相关信息转换成配置
数据库SQL映射需要添加@Mapper被容器识别到
3.3. 整合MyBatis-Plus
①创建新模块,选择Spring初始化,并配置模块相关基础信息
②只勾选Mysql的驱动,手动添加SpringBoot整合MyBatis-Plus的坐标,可以通过mvnrepository获取
1 |
|
③设置数据源参数
④定义数据层接口与映射配置
直接可以继承BaseMapper,不需要自己手动写常见的增删改查操作。不过需要注意BaseMapper
中的泛型需要和数据库中的表对应,否则差不多相关的表存在。解决办法可以在配置文件中进行相关配置。
总结✍🏻:
- 手工添加MyBatis-Plus对应的starter
- 数据层接口使用BaseMapper简化开发
- 需要使用的第三方技术无法通过勾选确定时,需要手工添加坐标
3.4 整合Druid
①按照整合mybatis的步骤,创建新模块
②手动添加SpringBoot整合Druid的坐标,可以通过mvnrepository获取
③设置数据源参数(直接打druid)
④定义数据层接口与映射配置
整合第三方技术通用方式:
- 导入对应的starter
- 根据提供的配置格式,配置非默认值对应的配置项
4.SSMP项目整合
需要导入的开发模块坐标有:Mysql,Mybatis-plus,Druid,Lombok
4.1 模块搭建
创建Spring Initializr, 自动导入Mysql坐标,手动添加Mybatis-plus,Druid,Lombok的坐标.
4.2 实体类开发
- 数据库创建相应的表
- Domain文件夹创建与数据库对应的实体类
- 利用Lombok的@Data注解自动实现相应的get方法和set方法
4.3 数据层开发【Mapper】
首先对配置文件进行配置(数据源环境、数据库id的自增策略)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 链接数据库
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
username: root
password: Fyl147258369
# Mybatis-plus的设置
mybatis-plus:
global-config:
db-config:
# 设置id是自增策略
id-type: auto
configuration:
# 打开日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl创建对应的接口Mapper(Dao)
将对应接口设置为Spring的对象,添加@Mapper注解
接口同时利用Mybatis-plus的封装,继承BaseMapper,可以省去常见的增删改查操作
制作测试类测试Mapper(Dao)功能是否有效
除去常见的增删改查操作,如果需要分页操作和查找操作,则还需要其他内容。
分页操作
分页操作需要设定分页对象IPage,以及对拦截器的设置。
1
2
3
4
5
6@Test
public void testgetPage(){
//分页除了定义Ipage对象,还需要对其利用拦截器进行实现
IPage<User> page = new Page(2,5);
System.out.println(userDao.selectPage(page,null));
}1
2
3
4
5
6
7
8
9
10
11
12@Configuration //需要此注解表明该类是一个配置类,Spring扫描到会加载其中内容
public class MpConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
//1. 定义 Mp 拦截器
MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
//2. 添加具体的拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());// 通过该配置表明新增了一个分页增强
return interceptor;
}
}拦截器的配置类似于AOP,需要什么功能在addInnerInterceptor.
查找操作
1
2
3
4
5
6
7@Test
public void testgetBy(){
String name = "王";//查询姓名中带有王的
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(name!=null,User::getName,name);//condition为true时,按照条件查询
userDao.selectList(queryWrapper);
}1.使用QueryWrapper对象封装查询条件
- 推荐使用LambdaQueryWrapper对象
- 所有查询操作封装成方法调用
- 查询条件支持动态条件拼装
4.4 业务层开发【Service】
service接口类定义
使用通用接口(ISerivce
)快速开发Service,通过继承的形式。则常见的利用增删改查的业务也不需要在其中定义 在通用类基础上做功能重载或功能追加
注意重载时不要覆盖原始操作,避免原始提供的功能丢失
service实现类定义【需要利用注解@Service表明】
- 使用通用实现类(ServiceImpl<M,T>)快速开发ServiceImpl
- 如果service接口有追加功能,则实现类中也需要实现接口并重写方法,通过利用Dao的Bean对象
service测试类
4.5 表现层开发【Controller】
编写表现层的类
- 需要利用注解@RestController表明
- 利用注解@RequestMapping(“/xxx”)定义类的路径
- 实现对应的功能函数,利用Service层的Bean对象
若是基于Restful进行表现层接口开发,则需要在每一个功能函数上通过注解表明是Restful中四种请求的某种请求,否则需要为每一个功能函数定义路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private IBookService bookService;
@GetMapping # Get请求
public List<Book> getAll(){
return bookService.list();
}
@PutMapping # Put请求
public Boolean update(@RequestBody Book book){ # 接收实体参数
return bookService.modify(book);
}
@DeleteMapping("/{id}")
public Boolean delete(@PathVariable Integer id){ # 接收路径变量
return bookService.delete(id);
}
}
- 基于Restful制作表现层接口
- 新增:POST
- 删除:DELETE
- 修改:PUT
- 查询:GET
- 接收参数
- 实体数据:@RequestBody
- 路径变量:@PathVariable
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!