# ssm - SpringBoot

# 1. SpringBoot 简介

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

# 1.1. SpringBoot 快速入门

image-20250804201100668

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>springboot-01-quickstart</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <!--指定了一个父工程,父工程中的东西在该工程中可以继承过来使用-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0</version>
    </parent>

    <!--JDK 的版本-->
    <properties>
        <java.version>8</java.version>
    </properties>

    <dependencies>
        <!--该依赖就是我们在创建 SpringBoot 工程勾选的那个 Spring Web 产生的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--这个是单元测试的依赖,我们现在没有进行单元测试,所以这个依赖现在可以没有-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--这个插件是在打包时需要的,而这里暂时还没有用到-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Application.java:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

访问:

GET http://localhost:8080/books/2

# 1.2. SpringBoot 工程快速启动

由于我们在构建 SpringBoot 工程时已经在 pom.xml 中配置了如下插件

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

所以我们只需要使用 Mavenpackage 指令打包就会在 target 目录下生成对应的 Jar 包。

注意:该插件必须配置,不然打好的 jar 包也是有问题的。

进入 jar 包所在位置,在 命令提示符 中输入如下命令,即可启动项目

jar -jar springboot_01_quickstart-0.0.1-SNAPSHOT.jar

# 1.3. SpringBoot 概述

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

大家已经感受了 SpringBoot 程序,回过头看看 SpringBoot 主要作用是什么,就是简化 Spring 的搭建过程和开发过程。

原始 Spring 环境搭建和开发存在以下问题:

  • 配置繁琐
  • 依赖设置繁琐

SpringBoot 程序优点恰巧就是针对 Spring 的缺点

  • 自动配置。这个是用来解决 Spring 程序配置繁琐的问题
  • 起步依赖。这个是用来解决 Spring 程序依赖设置繁琐的问题
  • 辅助功能(内置服务器,...)。
    • 我们在启动 SpringBoot 程序时既没有使用本地的 tomcat 也没有使用 tomcat 插件,而是使用 SpringBoot 内置的服务器。

接下来我们来说一下 SpringBoot 的起步依赖

  <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.5.0</version>
  </parent>

spring-boot-starter-parent 依赖

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.5.0</version>
  </parent>

spring-boot-dependencies 里配置了“所有”技术的坐标及版本
    <dependencies>
        <!--该依赖就是我们在创建 SpringBoot 工程勾选的那个 Spring Web 产生的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

spring-boot-starter-web 配置了 web 技术涉及的依赖坐标

starter

  • SpringBoot 中常见项目名称,定义了当前项目使用的所有项目坐标,以达到减少依赖配置的目的

parent

  • 所有 SpringBoot 项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的
  • spring-boot-starter-parent(2.5.0)与 spring-boot-starter-parent(2.4.6)共计57处坐标版本不同

实际开发

  • 使用任意坐标时,仅书写 GAV 中的 G 和 A,V 由 SpringBoot 提供

    • G:groupid
    • A:artifactId
    • V:version
  • 如发生坐标错误,再指定version(要小心版本冲突)

# 1.4. 切换 web 服务器

切换 web 服务器就需要将默认的 tomcat 服务器给排除掉

<!-- 排除 tomcat -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 添加 jetty 起步依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

# 2. 配置文件

# 2.1. 配置文件格式

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

application.properties

server.port=80

application.yml

server:
  port: 81

application.yaml

server:
  port: 82

注意:SpringBoot 程序的配置文件名必须是 application ,只是后缀名不同而已。

优先级: application.properties > application.yml > application.yaml

# 2.2. yaml 格式

YAML(YAML Ain't Markup Language),一种数据序列化格式。

优点:

  • 容易阅读
  • 容易与脚本语言交互
  • 以数据为核心,重数据轻格式

YAML 文件扩展名:

  • .yml (主流)
  • .yaml

语法规则:

  • 大小写敏感
  • 属性层级关系使用多行描述,每行结尾使用冒号结束
  • 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键), 空格的个数并不重要,只要保证同层级的左侧对齐即可。
  • 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
  • # 表示注释

数组格式:

hobbies:
  - game
  - football
  - basketball

# 2.3. yaml 配置文件数据读取

三种方式:

  • @Value 读单个值
  • Environment 对象 读整个配置文件
  • 自定义对象 读指定前缀的配置

配置文件:

server:
  port: 80

lesson: SpringBoot

enterprise:
  name: itcast
  age: 16
  tel: 4006184000
  subject:
    - Java
    - 前端
    - 大数据

@Value:

@RestController
@RequestMapping("books")
public class BookController {
    @Value("${lesson}")
    private String lesson;
    @Value("${enterprise.name}")
    private String enterprise_name;
    @Value("${enterprise.subject[0]}")
    private String enterprise_subject_0;

    @GetMapping
    public String getAll() {
        System.out.println("lesson: " + lesson);
        System.out.println("enterprise_name: " + enterprise_name);
        System.out.println("enterprise_subject_0: " + enterprise_subject_0);

        return "Hello, Spring MVC";
    }
}

Environment 对象:

@RestController
@RequestMapping("books")
public class BookController {

    @Autowired
    private Environment env;

    @GetMapping
    public String getAll() {
        System.out.println("lesson: " + env.getProperty("lesson"));
        System.out.println("enterprise.age: " + env.getProperty("enterprise.age"));
        System.out.println("enterprise.subject[1]: " + env.getProperty("enterprise.subject[1]"));

        return "Hello, Spring MVC";
    }
}

自定义对象:

package org.example.domain;
@Component
@ConfigurationProperties(prefix = "enterprise")
public class Enterprise {
    private String name;
    private int age;
    private String tel;
    private String[] subject;

    // ... getters and setters
}


package org.example.controller;
@RestController
@RequestMapping("books")
public class BookController {

    @Autowired
    private Enterprise enterprise;

    @GetMapping
    public String getAll() {
        System.out.println(enterprise);

        return "Hello, Spring MVC";
    }
}

测试:

GET http://localhost/books

# 2.4. 多环境配置

# 2.4.1. yaml 文件

在 application.yml 中使用 --- 来分割不同的配置

# 设置启用的环境
spring:
  profiles:
    active: test  #表示使用的是开发环境的配置

# 通用配置
# ...

---

# 开发
spring:
  profiles: dev #给开发环境起的名字
server:
  port: 80

---

# 生产
spring:
  profiles: pro #给生产环境起的名字
server:
  port: 81

---

# 测试
spring:
  profiles: test #给测试环境起的名字
server:
  port: 82

# 2.4.2. properties 文件

为每个环境定义不同的配置文件

开发, application-dev.properties:

server.port=80

测试, application-test.properties:

server.port=81

SpringBoot 只会默认加载名为 application.properties 的配置文件, 所以需要在 application.properties 配置文件中设置启用哪个配置文件

application.properties:

spring.profiles.active=pro

# 2.4.3. 命令行启动参数设置

在 CMD 中运行 jar 时,可以通过命令参数 临时修改 配置文件中的配置:

java –jar xxx.jar –-spring.profiles.active=test

java –jar xxx.jar –-server.port=88

java –jar xxx.jar –-server.port=88 –-spring.profiles.active=test

配置的优先级:

  • https://docs.spring.io/spring-boot/reference/features/external-config.html#features.external-config

# 2.4.4. SpringBoot 使用 maven 的多环境配置

说明:

  • 在 pom.xml 定义多套环境的 变量,该变量可以在 application.yml 中使用

pom.xml

<profiles>
    <!--开发环境-->
    <profile>
        <id>dev</id>
        <properties>
            <active.profile>dev</active.profile>
        </properties>
        <!--设定是否为默认启动环境-->
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <!--测试环境-->
    <profile>
        <id>test</id>
        <properties>
            <active.profile>test</active.profile>
        </properties>
    </profile>
</profiles>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <encoding>UTF-8</encoding>
        <useDefaultDelimiters>true</useDefaultDelimiters>
    </configuration>
</plugin>

application.yml:

# 设置启用的环境
spring:
  profiles:
    active: ${active.profile}  #表示使用的是开发环境的配置

# 通用配置
# ...

---

# 开发
spring:
  profiles: dev #给开发环境起的名字
server:
  port: 80

---

# 测试
spring:
  profiles: test #给测试环境起的名字
server:
  port: 82

打包时,可以指定使用哪套环境:

mvn package -P dev

mvn package -P test

# 2.5. 配置文件分类

配置文件的优先级

# 类路径下
${root}/
    src/main/resources/application.yml          # 1
    src/main/resources/config/application.yml   # 2
    
    
# 文件系统中,与 jar 包同级
target/
    xxx.jar
    application.yml                             # 3
    target/config/application.yml               # 4

第 2 级,适合开发时覆盖配置

第 3、4 级,适合部署时覆盖类路径下的配置

# 3. SpringBoot 整合 junit

注意:

  • 引导类所在的包的全名 必须 测试类所在的包一致

示例:

@SpringBootTest
class Springboot05TestApplicationTests {
    @Autowired
    private BookService bookService;

    @Test
    void testSave() {
        bookService.save();
    }
}

# 4. SpringBoot 整合 mybatis

引入坐标:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>springboot-06-mybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0</version>
    </parent>

    <!--JDK 的版本-->
    <properties>
        <java.version>8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

在 application.yml 中设置 JDBC 和 数据源:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_db
    username: root
    password: 123456
    # 设置数据源连接池
    type: com.alibaba.druid.pool.DruidDataSource

编写 domain 和 dao:

package org.example.domain;

public class Book {
    private Integer id;
    private String name;
    private String type;
    private String description;
    // ...    
}


package org.example.dao;
@Mapper
public interface BookDao {
    @Select("select * from tbl_book where id = #{id}")
    public Book getById(Integer id);
}

测试:

@SpringBootTest
class Springboot06MybatisApplicationTests {

    @Autowired
    private BookDao bookDao;

    @Test
    void testGetById() {
        Book book = bookDao.getById(1);
        System.out.println(book);
    }
}

注意:

  • SpringBoot 版本低于2.4.3(不含),Mysql 驱动版本大于 8.0 时,需要在 url 连接串中配置时区 jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC,或在 MySQL 数据库端配置时区解决此问题

# 5. 案例

将 spring-ssm 的案例改造为 springboot-ssm

  1. pom.xml
  • 配置起步依赖,必要的资源坐标(druid)
  1. application.yml
  • 设置数据源、端口等
  1. 配置类
  • 全部删除
  1. dao
  • 设置 @Mapper
  1. 测试类

  2. 页面

  • 放置在 resources/static 目录中
本章目录