Spring Boot
是由 Pivotal
团队提供的全新框架,其设计目的是用来简化新 Spring
应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot
致力于在蓬勃发展的快速应用开发领域 (rapid application development)
成为领导者。
本文将介绍如何通过
Spring Boot
框架实现接口开发。
一、基础配置
1. 数据准备
我们先准备一张简单的用户表并插入几条测试数据。
CREATE TABLE `tb_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(30) CHARACTER DEFAULT NULL,
`password` varchar(30) CHARACTER DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ;
INSERT INTO `tb_user` VALUES (1, 'budai', '123456');
INSERT INTO `tb_user` VALUES (2, 'great', '456789');
2. 依赖引入
新建 Spring Boot
项目,在工程的 pom.xml
配置中导入下述依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MySQL JDBC 连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- MyBatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<!-- 提供实体 Get Set 方法-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
</dependency>
二、文件配置
1. 端口配置
默认 Spring Boot
启动端口是 8080
,我们可以根据项目的需要在配置文件进行修改,在这我采用的是 yml
格式文件,相较默认的 properties
格式可读性更高。
当然这一步你不设置的话也可以,使用默认端即可。
server:
port: 9090
tomcat:
uri-encoding: utf-8
2. 数据库信息
数据库用的是 mysql
,相关配置如下:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test_db
username: root
password: 123456
同时添加下述配置申明 MyBatis
映射文件在哪,例如我的配置文件路径为 resource/mysql/
下,因此配置的为 classpath:mysql/*.xml
,表示 mysql
目录下所有 xml
文件。
mybatis:
mapper-locations: classpath:mysql/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
其中 configuration
配置的是在控制台打印输出所执行的 sql
命令,方便调试程序,如果你想要控制台更加清爽则注释该配置即可。
3. 多文件配置
当项目工程变得庞大以及涉及多环境时,通常我们会采用多配置文件进行切换。
例如在 resources
下定义了 application-dev.yml
与 application-test.yml
两份配置文件,则在 application.yml
中通过下述配置即可实现仅 application-dev.yml
配置生效。
spring:
profiles:
active: dev
当然你可以同时设置激活多个配置文件,通过逗号分隔,定义次序越后面则优先级越高,若重复时则优先级高的将会覆盖优先级低。
spring:
profiles:
active: common,dev
三、视图层
1. 数据实体
在视图层模块为之前的数据表创建对应的实体类,并通过 lombak
生成基本方法。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String id;
private String userName;
private String password;
}
lombak
为类提供了注解生成 getter
与 setter
方法,让代码更简洁,常用的注解如下:
注解 | 作用 |
---|---|
@Data | 提供类所有属性的 get 和 set 方法。 |
@NoArgsConstructor | 提供无参构造器。 |
@AllArgsConstructor | 提供全参构造器。 |
四、服务层
1. 接口类
这就没什么好介绍的了,简单定义获取和更新数据的接口。
public interface UserServices {
User get(String id);
}
2. 实现类
(1) @Service
通常作用于接口实现类,若没有指定名称在创建 bean
时名字默认为实现的接口类名称(首字母大写)。
(2) @Autowired
正如其字面意思:自动装配,即自动导入其所依赖的 bean
。
@Service
public class UserServicesImpl implements UserServices {
@Autowired
private UserDao userDao;
@Override
public User get(String id) {
return userDao.get(id);
}
}
五、持久层
1. 接口定义
可以通过注解的方式来编写对应的数据库逻辑代码,但这里我采用是 XML
文件配置。
@Mapper
public interface UserDao {
User get(String id);
}
2. XML映射
在 resource/mysql/
目录下新建 UserMapper.xml
文件用于声明 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="xyz.ibudai.mapper.UserMapper">
<resultMap type="xyz.ibudai.entity.User" id="userResult">
<id property="id" column="id" />
<result property="userName" column="username"/>
<result property="password" column="password"/>
</resultMap>
<select id="get" resultMap="userResult" parameterType="String">
select * from tb_user
where id = #{ id }
</select>
</mapper>
六、控制层
1. 路由注解
在控制层即实现外对服务接口开放,基本注解参考下表:
注解 | 作用 |
---|---|
@RestController | 标注控制层组件, 等价于 `@ResponseBody` 和 `@Controller` 的组合。 |
@RequestMapping | 提供路由信息,负责 `URL` 到 `Controller` 中的具体函数的映射。 |
2. 请求注解
针对接口服务,不同的 HTTP
请求方式在 Spring Boot
中对应注解参考下表:
注解 | 作用 |
---|---|
@GetMapping | 对应 HTTP 的 GET 请求,用于获取资源。 |
@PostMapping | 对应 HTTP 的 POST 请求,用于创建资源。 |
@PutMapping | 对应 HTTP 的 PUT 请求,提交所有资源属性以修改资源。 |
@PatchMapping | 对应 HTTP 的 PATCH 请求,提交资源部分修改的属性。 |
@DeleteMapping | 对应 HTTP 的 DELETE 请求,用于删除服务器端的资源。 |
3. 参数注解
(1) @RequestBody
传入对象,可以将请求体为 JSON
的数据转化为复杂的 Java
对象。
(2) @RequestParam
传入单个值,当参入多个参数时必须用其声明,单个参数则无限制。
(3) @PathVariable
获取传入参数至地址栏,比如:
@GetMapping("/{path}")
public int Test(@PathVariable String path){
假如此时此时传入的参数为 user
,最终的访问 url
即为:/user
。
@RestController
@RequestMapping(value = "/users")
public class UserController {
@Autowired
private UserServices userServices;
@GetMapping("/get")
public String getUser(Integer id){
return userServices.get(id).toString();
}
@PostMapping("/update")
public int updateUser(@RequestBody User user){
int i = 0 ;
i = userServices.updateUser(user);
return i;
}
}
七、启动配置
1. 服务扫描
在 DAO
层文件过多时,每个文件都单独添加 @Mapper
显然过于麻烦,通过 @MapperScan
直接配置 DAO
层所在的包即可扫描这个包下的文件。
2. 启动入口
通过 @SpringBootApplication
注解标明程序启动入口,至此便可启动项目。
@SpringBootApplication
@MapperScan("xyz.ibudai.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
在项目启动过程中,MyBatis
会校验对应的数据表是否存在,若不存在将报错并启动失败。
如需关闭此类启动校验,可在 @SpringBootApplication
注解中通过 exclude
属性进行排除。
@SpringBootApplication(
exclude = {
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
MybatisAutoConfiguration.class
}
)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
源码: