Sprint Boot 学习笔记

常见问题

数据库相关

  1. 未配置数据库时,启动项目会报错,报错提示如:Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

解决方法:

  1. application.properties中配置数据库连接信息。
1
2
3
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
  1. 在 DemoApplication 类中添加@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class}),再运行项目即不会报错。
  2. pom.xml中关于数据库的依赖注释掉,再运行项目即不会报错。

创建项目

创建 Spring Boot 项目

以下两种创建方式基本一致,均是使用官方提供的项目初始化工具实现。

通过 IDEA 创建

  1. 新建项目选择 Spring Initializr 项目
  2. 填写项目名称和存储位置
  3. 选择项目语言 Java
  4. 选择项目类型 Maven
  5. 填写具体项目信息
  6. 选择 JDKJava 版本
  7. 选择打包方式
  8. 选择项目依赖为 Sprint Web, MySQL Driver, Spring Data JPA
  9. 选择创建即可

通过官方网站创建

  1. 访问 Spring Initializr 网站
  2. 选择项目类型为 Maven
  3. 选择项目语言为 Java
  4. 选择Sprint Boot的版本
  5. 填写项目信息
  6. 选择项目框架为 Sprint Web, MySQL Driver, Spring Data JPA
  7. 点击 Generate 按钮
  8. 下载项目压缩包,解压后导入到 IDEA 中

项目基础

项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─sleny
│ │ │ └─demo
│ │ │ ├─controller
│ │ │ ├─converter
│ │ │ ├─dao
│ │ │ ├─dto
│ │ │ └─service
│ │ └─resources
│ │ ├─static
│ │ └─templates
│ └─test
│ └─java
│ └─com
│ └─sleny
│ └─demo
└─target
├─classes
│ └─com
│ └─sleny
│ └─demo
│ ├─controller
│ ├─converter
│ ├─dao
│ ├─dto
│ └─service
├─generated-sources
│ └─annotations
├─generated-test-sources
│ └─test-annotations
└─test-classes
└─com
└─sleny
└─demo

目录说明

  • src/main/java 存放 Java 源代码
  • src/main/resources 存放资源文件
  • src/test/java 存放测试源代码
  • src/test/resources 存放测试资源文件
  • target/classes 存放编译后的 Java 文件
  • target/test-classes 存放编译后的测试 Java 文件
  • target/generated-sources 存放自动生成的源代码
  • target/generated-test-sources 存放自动生成的测试源代码
  • controller: 控制器,用于接收用户请求并调用 service 层处理业务逻辑
  • service: 服务层,用于处理业务逻辑
    • xxSerivce: 接口,用于显示实现类中所有的方法
    • xxServiceImpl: 实现类,用于实现接口中定义的方法
      • @Service: 用于将当前类注入到 Spring 容器中
      • @Autowired: 用于将其他类注入到当前类中,官方不推荐字段注入,可以使用构造方法。
      • @Override: 用于标记当前方法为重写方法
      • @Transactional: 用于标记当前方法为事务方法,用于处理业务逻辑(update方法时进行注解)
  • converter: 转换器,用于将 DTO 转换为实体对象
  • dao: 数据访问层,用于操作数据库
    • @Entity: 用于标记当前类为实体类
    • @Table: 用于标记当前类对应的表
    • @Id: 用于标记当前字段为主键
    • @Column: 用于标记当前字段对应的数据库列
    • @GeneratedValue: 用于标记当前字段的自增策略
    • Repository: 接口,用于定义数据库操作方法,继承JpaRepository
      • @Repository: 是Spring框架中一个专用的注解,用于标记数据访问层的组件。可以让Spring自动检测和管理数据访问组件,并提供一致的异常处理机制,使其成为Spring IoC容器管理的一个Bean
  • dto: 数据传输对象,用于封装数据,即定义返回给前端的数据类型。一般情况下与vo相同,当存在不同时,vo不建议隐去。
  • static: 存放静态资源文件,如:js, css, img等
  • templates: 存放模板文件,如:html, jsp等;如果前后端分离,则该目录可以不使用。

常用注解

  • @SpringBootApplication: 用于标记当前类为 Spring Boot 项目的启动类。
  • @RestController: 用于标记当前类为控制器,并使用@ResponseBody标记当前方法为返回 JSON 数据的方法。
  • @RequestMapping: 用于标记当前方法为请求映射方法。
  • @GetMapping: 用于标记当前方法为 GET 请求方法。
  • @PostMapping: 用于标记当前方法为 POST 请求方法。
  • @PutMapping: 用于标记当前方法为 PUT 请求方法。
  • @DeleteMapping: 用于标记当前方法为 DELETE 请求方法。
  • @RequestParam: 用于标记当前方法为请求参数方法。
  • @PathVariable: 用于标记当前方法为路径参数方法。
  • @RequestBody: 用于处理HTTP请求体,通常用于接收JSON或XML格式的数据,Spring将尝试将请求体映射到相应的Java对象中。
  • @RequestParam: 用于从HTTP请求中提取查询参数或表单参数。
    • required: 用于标记当前参数是否必须存在。
    • defaultValue: 用于标记当前参数的默认值。
    • name: 用于标记当前参数的名称。
  • @Component: 用于将当前类注入到 Spring 容器中。
    • @Service
    • @Repository / @Mapper
    • @Controller
  • @Data: lombok的专属注解,需要引入其依赖
    1
    2
    3
    4
    5
    <!-- 如果在springboot的父工程中,已经集成了lombok并指定了版本号,引入依赖时就不需要指定version -->
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    </dependency>
    • @AllArgsConstructor: 用于标记当前类为全参构造函数。
    • @NoArgsConstructor: 用于标记当前类为无参构造函数。
    • 在编译时期,会自动生成getter/setter, equals, hascode, toString等方法
  • ConfigurationProperties: 批量将外部属性配置注入到Bean对象的属性中
    • prefix: 用于标记当前类对应的属性前缀(即配置文件中的前缀)
      1
      2
      3
      4
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      </dependency>

常用依赖

MyBatis Plus

依赖

1
2
3
4
5
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.7</version>
</dependency>

配置

  1. 在application.yml文件中添加以下配置,以启用MyBatis Plus的日志功能。
    1
    2
    3
    4
    5
    6
    mybatis-plus:
    configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    global-config:
    db-config:
    id-type: auto
  2. 并在Spring Boot启动类中添加@MapperScan注解,以指定Mapper接口所在的包路径。
    1
    2
    3
    4
    5
    6
    7
    @SpringBootApplication
    @MapperScan("com.example.demo.mapper")
    public class DemoApplication {
    public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
    }
    }

编码

  1. 创建一个实体类User.java,用于映射数据库表的字段。
    1
    2
    3
    4
    5
    6
    7
    @Data  // lombok的专属注解,用于简化代码
    public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    }
  2. 创建一个Mapper接口UserMapper.java,用于定义数据库操作的方法。
    1
    2
    3
    public interface UserMapper extends BaseMapper<User> {
    // 定义自定义查询方法
    }
  3. 创建一个Service接口,用于定义业务逻辑的方法。
    1
    2
    3
    public interface UserService {
    // 定义业务逻辑方法
    }
  4. 创建一个Service实现类,用于实现Service接口的方法,在Service实现类中,使用MyBatis Plus提供的CRUD方法,实现对数据库的增删改查操作。
    1
    2
    3
    4
    5
    6
    7
    8
    @Service
    public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    public User getUserById(Long id) {
    return userMapper.selectById(id);
    }

常用注解

  • @TableName: 用于标记当前类对应的表名。
  • @TableId: 用于标记当前类对应的表的主键字段。
  • @TableField: 用于标记当前类对应的表的字段。
  • @TableLogic: 用于标记当前类对应的表的字段是否逻辑删除。
  • @Select: 用于标记当前方法为查询方法。
  • @Insert: 用于标记当前方法为插入方法。
  • @Update: 用于标记当前方法为更新方法。
  • @Delete: 用于标记当前方法为删除方法。
  • @Param: 用于标记当前方法为参数方法。
  • @Result: 用于标记当前方法为结果方法。
  • @Results: 用于标记当前方法为结果集方法。
  • @One: 用于标记当前方法为一对一关系方法。
  • @Many: 用于标记当前方法为一对多关系方法。
  • @Transactional: 用于标记当前方法为事务方法。