Spring Boot
1. 关于Spring Boot
Spring Boot框架主要解决了创建工程后需要进行繁琐的配置的问题,是一个“开箱即用”的框架,其核心思想是“约定大于配置”。
2. 创建Spring Boot工程
使用IntelliJ IDEA的创建向导中的Spring Initializer
即可创建Spring Boot工程。
在创建时,如果 https://start.spring.io 无响应,可尝试替换为 https://start.springboot.io。
在创建过程中,需要填写并关注的几项有:
- Group Id:组Id,通常是公司的域名倒序排列的结果,例如
cn.tedu
- Artifact Id:坐标Id,应该是此工程的名称,如果名称中有多个单词,应该使用减号分隔,例如
boot-demo
- Java Version:使用到的Java版本,目前推荐选择
8
- Package:项目的根包,默认是由以上填写的
Group Id
和Artifact Id
组成
注意:如果Artifact Id
中使用减号分隔了多个单词,在Package
中默认并没有分开,通常建议手动添加小数点(.
)进行分隔
注意:此处Package
决定了默认的组件扫描,所以,在后续开发代码时,所有的组件类都必须放在此包或其子孙包下,在开发实践中,其实会把所有创建的类、接口都放在此包或其子孙包下,不是组件的类不添加组件即可
注意:当工程已经创建出来后,不要修改包的名称,除非你已经掌握了解决方案!
在添加依赖项时,首先需要注意的就是Spring Boot的版本号,通常非常不建议使用较新的版本号,建议使用的是半年或1年之内的版本即可!如果在创建向导的界面没有需要的版本号,可以随便选一下,当项目创建成功后,打开pom.xml
,修改<parent>
子级的<version>
节点的值即可。
当项目创建成功后,在src/main/java
下默认就存在一个包,是由创建项目时填写的Package
决定的,就是当前项目组件扫描的包,相当于默认就有了@ComponentScan("cn.tedu.boot.demo")
。
项目中默认就存在BootDemoApplication
类,此类的名称是由创建项目时填写的Artifact Id
加上Application
单词组成的,这个类名称是可以改的,这个类中有main()
方法,执行此方法就会启动整个项目,将加载项目中所有依赖所需的环境。
在src/main/resources
下默认存在application.properties
配置文件,它是项目默认会加载的配置文件。另外,Spring Boot的自动配置机制要求此处的许多配置是使用固定的属性名的!
3. 当前案例目标
客户端发出请求,最终增加管理员信息。
4. 开发数据访问层
4.1. 添加Mybatis相关依赖项
在pom.xml
中添加必要的依赖项:
<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>
4.2. 配置连接数据库的信息
当添加以上依赖项,如果启动项目(执行BootDemoApplication
类中的main()
方法)会报告错误,因为Spring Boot允许自动配置,当添加以上依赖项后,就会自动读取连接数据库的相关信息,并自动配置数据源,甚至Mybatis所需要其它基础配置,而目前并没有配置连接数据库的相关信息,所以出现错误!
则在application.properties
中添加配置:
spring.datasource.url=jdbc:mysql://localhost:3306/mall_ams?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
完成后,在src/test/java
下找到默认即存在的测试类,在此测试类中尝试获取数据库连接对象:
@SpringBootTest
class BootDemoApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() throws Exception {
System.out.println(dataSource.getConnection());
}
}
如果能顺利执行此测试,则表示以上配置是正确的!
4.3. 创建与数据表对应的实体类
为了简化编写POJO类,通常会在项目中添加Lombok
依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
提示:当使用了Lombok
后,应该在开发工具中安装Lombok插件,否则,在编写代码时,所有相关的Setters & Getters都没有自动提示,也会报告语法错误,但是不影响运行。
在插入数据时,需要使用实体类封装即将插入到表中的多个数据,则在cn.tedu.boot.demo
包下创建entity
子包,并在其下创建Admin
类:
@Data
public class Admin implements Serializable {
private Long id;
private String username;
private String password;
private String nickname;
private String avatar;
private String phone;
private String email;
private String description;
private Integer isEnable;
private String lastLoginIp;
private Integer loginCount;
private LocalDateTime gmtLastLogin;
private LocalDateTime gmtCreate;
private LocalDateTime gmtModified;
}
4.4. 插入管理员数据
要执行的SQL语句大致是:
insert into ams_admin (除了id以外的字段列表……) values (值列表)
则在cn.tedu.boot.demo
包下创建mapper
子包,并在其下创建AdminMapper
接口,在接口中添加抽象方法:
package cn.tedu.boot.demo.mapper;
import cn.tedu.boot.demo.entity.Admin;
import org.springframework.stereotype.Repository;
@Repository
public interface AdminMapper {
int insert(Admin admin);
}
还需要进行配置,使得Mybatis知道这些接口文件在哪里!则在cn.tedu.boot.demo
下创建config
包,并在此包下创建MybatisConfiguration
类,通过@MapperScan
配置接口文件所在的包:
package cn.tedu.boot.demo.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("cn.tedu.boot.demo.mapper")
public class MybatisConfiguration {
}
提示:关于@MapperScan
注解,还可以配置在项目的启动类上(BootDemoApplication
),因为启动类上有@SpringBootApplication
注解,其元注解中有@SpringBootConfiguration
,其元注解中有@Configuration
,所以,启动类本身也是配置类!但是,如果项目中的配置较多,不建议全部写在启动类中,所以,可以分为多个配置类,独立配置。
接下来,在src/main/resources
下创建mapper
文件夹,并从前序项目中复制粘贴得到AdminMapper.xml
文件(删除原文件中已经配置的SQL等代码),然后,在此文件中配置抽象方法映射的SQL:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.tedu.boot.demo.mapper.AdminMapper">
<!-- int insert(Admin admin); -->
<insert id="insert" useGeneratedKeys