SpringBoot

本篇文章是根据黑马程序员SpringBoot2全套视频教程出品的视频,学习所做的笔记🐰。

视频发布时间:2021.10.26

1. 快速上手SpringBoot

1.1 SpringBoot入门程序开发

SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程

1.1.1 S2pringBoot入门程序

1)创建新模块,选择Spring Initializr,并配置模块相关基础信息

image

2)选择当前模块需要使用的技术集

image

3)开发控制器类

image

4)运行自动生成的Application类

image

1.1.2 入门案列

  • 最简SpringBoot程序所包含的基础文件

    • pom.xml文件
    • Application类
  • Spring程序与SpringBoot程序对比

    image

    注意:基于idea开发SpringBoot程序需要确保联网且能够加载到程序框架结构

    image

1.1.3 隐藏指定文件/文件夹

image

Idea中隐藏指定文件或指定类型文件的步骤:

  1. Setting → File Types → Ignored Files and Folders
  2. 输入要隐藏的文件名,支持*号通配符
  3. 回车确认添加

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
2
3
4
5
6
@SpringBootApplication
public class Quickstart01Application {
public static void main(String[] args) {
SpringApplication.run(Quickstart01Application.class, args);
}
}
  • SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目
  • SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean

1.2.3 辅助功能

内嵌tomcat

  1. 内嵌Tomcat服务器是SpringBoot辅助功能之一
  2. 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理
  3. 变更内嵌服务器思想是去除现有服务器,添加全新的服务器

image

image

  • 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内置属性查询

2.2 配置文件分类

  1. SpringBoot提供了多种属性配置方式

    • properties(传统格式/默认格式)
    • yml(主流格式)
    • yaml
  2. SpringBoot配置文件加载顺序

    application.properties > application.yml > application.yaml
    
    • 配置文件间的加载优先级
      • properties(最高)
      • yml
      • yaml(最低)
  3. 不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留

2.3 yaml文件

  • YAML文件扩展名

    • .yml(主流)
    • .yaml
  • yaml语法规则

    • 大小写敏感

    • 属性层级关系使用多行描述,每行结尾使用冒号结束

    • 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)

    • 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)

    • # 表示注释

      1
          
  • 核心规则:数据前面要加空格与冒号隔开

  • yaml

2.4 yaml数据读取

方式一:

使用局部变量

  • 使用@Value读取单个数据,属性名引用方式:${一级属性名.二级属性名……}

  • 如果数据存在多层级,依次书写层级名称即可

    缺点:需要定义多个变量

方式二

封装全部数据到Environment对象

env
  1. 使用Environment对象封装全部配置信息
  2. 使用@Autowired自动装配数据到Environment对象中

方式三

自定义对象封装指定数据

dataclass

注意:

  • 自定义对象中的变量名需要和配置文件中的变量名一致
  • 封装类需要定义为Spring管理的bean,否则无法进行属性注入
  • 使用@ConfigurationProperties注解绑定配置信息到封装类中

3. 整合第三方技术

3.1 整合junit

直接创建一个最简单的spring Initializer模块即可

  1. 导入测试对应的starter
  2. 测试类使用@SpringBootTest修饰
  3. 使用自动装配的形式添加要测试的对象

对SpringBootTest的解释:

  • 类型:测试类注解

  • 位置:测试类定义上方

  • 作用:设置JUnit加载的SpringBoot启动类

  • 范例:

    1
    2
    3
    @SpringBootTest
    class JunitInterApplicationTests {
    }

    注意:如果测试类在SpringBoot启动类的包或子包中,可以省略启动类的设置,也就是省略classes的设定

    1
    2
    @SpringBootTest(classes = Springboot05JUnitApplication.class)
    class Springboot07JUnitApplicationTests {}
  1. 测试类如果存在于引导类所在包或子包中无需指定引导类
  2. 测试类如果不存在于引导类所在的包或子包中需要通过classes属性指定引导类

3.2 整合MyBatis

①创建新模块,选择Spring初始化,并配置模块相关基础信息

②选择当前模块需要使用的技术集(MyBatis、MySQL)

mybatis_inte

③设置数据源参数

1
2
3
4
5
6
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
username: root
password: Fyl147258369

注意:SpringBoot版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区

④定义数据层接口与映射配置

1
2
3
4
5
@Mapper
public interface UserDao {
@Select("select * from user where id = #{id}")
public List<User> getById(Integer id);
}

⑤测试类中注入dao接口,测试功能

1
2
3
4
5
6
7
8
9
10
11
12
@SpringBootTest
class MybatisInterApplicationTests {

@Autowired
public UserDao userDao;

@Test
void testgetById() {
System.out.println(userDao.getById(3));
}

}

总结✍🏻:

  1. 勾选MyBatis技术,也就是导入MyBatis对应的starter

  2. 数据库连接相关信息转换成配置

  3. 数据库SQL映射需要添加@Mapper被容器识别到

3.3. 整合MyBatis-Plus

①创建新模块,选择Spring初始化,并配置模块相关基础信息

②只勾选Mysql的驱动,手动添加SpringBoot整合MyBatis-Plus的坐标,可以通过mvnrepository获取

1
2
3
4
5
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>

③设置数据源参数

④定义数据层接口与映射配置

直接可以继承BaseMapper,不需要自己手动写常见的增删改查操作。不过需要注意BaseMapper中的泛型需要和数据库中的表对应,否则差不多相关的表存在。解决办法可以在配置文件中进行相关配置。

总结✍🏻:

  1. 手工添加MyBatis-Plus对应的starter
  2. 数据层接口使用BaseMapper简化开发
  3. 需要使用的第三方技术无法通过勾选确定时,需要手工添加坐标

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对象封装查询条件

  1. 推荐使用LambdaQueryWrapper对象
  2. 所有查询操作封装成方法调用
  3. 查询条件支持动态条件拼装

4.4 业务层开发【Service】

  • service接口类定义

    • 使用通用接口(ISerivce)快速开发Service,通过继承的形式。则常见的利用增删改查的业务也不需要在其中定义

    • 在通用类基础上做功能重载或功能追加

    • 注意重载时不要覆盖原始操作,避免原始提供的功能丢失

      Iservice

  • 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);
    }
    }
  1. 基于Restful制作表现层接口
  • 新增:POST
  • 删除:DELETE
  • 修改:PUT
  • 查询:GET
  1. 接收参数
  • 实体数据:@RequestBody
  • 路径变量:@PathVariable

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!