平台
window10
Intellij IDEA2020
Spring Boot2.3.3
Java SDK 1.8
MySQL 8.0.19
Navicat15
简介
Swagger
Swagger
是一个规范且完整的框架,用于生成、描述、调用和可视化 RESTful
风格的Web
服务。
Swagger
的目标是对REST API
定义一个标准且和语言无关的接口,可以让人和计算机拥有无须访问源码、文档或网络流量监测就可以发现和理解服务的能力。当通过Swagger
进行正确定义,用户可以理解远程服务并使用最少实现逻辑与远程服务进行交互。与为底层编程所实现的接口类似,Swagger
消除了调用服务时可能会有的猜测。
Swagger
的优势:
- 支持
API
自动生成同步的在线文档:使用Swagger
后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便,可以节约写文档的时间去学习新技术。 - 提供
Web
页面在线测试API
:光有文档还不够,Swagger
生成的文档还支持在线测试。参数和格式都定好了,直接在界面上输入参数对应的值即可在线测试接口。
OAS
OAS
是OpenAPI Specification
的简称,可以翻译为OpenAPI
规范,它是定义API
的一种规范,它的前身是Swagger
规范。
OAS与Swagger
OAS
定义了一种书写API
的一种格式,大家通过遵从同一种格式规范达到API
文档的统一。狭义上理解,它用于描述一整套API
接口,包括一个接口是GET
还是POST
请求,有哪些参数,哪些header
等等,它在设计的时候通常是YAML
格式,这种格式书写起来比较方便,而在网络中传输时又会以json
形式居多,因为json
的通用性比较强。OpenAPI Specification
已经在2015
年捐献给了Linux
基金会,现在已经成为RESTful API
的世界标准。
Swagger
是一个工具、一个项目、一个流行的API
开发框架(当然,我们上面也说了Swagger
是规范,但是后面演变成了OAS
),这个框架以OAS
为基础,对整个API
的开发周期都提供了相应的解决方案,是一个非常庞大的项目(包括Swagger Editor
、Swagger UI
、Swagger Codegen
、Swagger Inspector
)。
Springfox
Springfox
是践行OAS
的一个项目,它将Swagger
融合进流行的Spring
框架,根据OpenAPI
规范,帮助开发者自动生成API
文档。Springfox
是由Marty Pitt
创建的项目swagger-springmvc
发展而来。它其中有一个组件叫springfox-swagger2
,springfox-swagger2
是依赖OSA
规范文档,也就是一个描述API
的json
文件,而这个组件的功能就是帮助我们自动生成这个json
文件,我们会用到的另外一个组件springfox-swagger-ui
就是将这个json
文件解析出来,用一种更友好的方式呈现出来。
总结
Swagger
是一种规范。springfox-swagger
是基于Spring
生态系统的该规范的实现。springfox-swagger-ui
是对swagger-ui
的封装,使得其可以使用 Spring
的服务。
也就是Swagger
是规范,协议,Spring
是实现。(Spring是一个主流的
Java Web`开发框架,该框架是一个轻量级的应用框架,具有很高的凝聚力和吸引力。)
参考博客
建立数据库
安装软件
首先安装数据库和数据库可视工具(任意一个),具体可参考:MySQL 8.0.19安装教程(windows 64位)+ Navicat破解安装教程
新建数据库
首先建立一个连接,并设置好参数:
这里的用户名和密码为建立数据库时的配置。
然后在该连接上建立一个数据库,点击新建查询
,并输入以下代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20-- ----------------------------
-- Table structure for doctor_info
-- ----------------------------
DROP TABLE IF EXISTS `doctor_info`;
CREATE TABLE `doctor_info` (
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`gender` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`age` int(0) NULL DEFAULT NULL,
`post` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`department` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`employeeID` int(0) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of doctor_info
-- ----------------------------
INSERT INTO `doctor_info` VALUES ('Cxx', '男', 26, '医师', '检验科', 12345);
INSERT INTO `doctor_info` VALUES ('Xll', '男', 25, '实习医生', '住院部', 23456);
SET FOREIGN_KEY_CHECKS = 1;
然后点击运行
即可查看新建的表。
基于Spring Web和MyBatic框架的Swagger ui实现
建立工程
打开开发工具Intellij IDEA2020
,选择New->Project
,选择java sdk 1.8
,然后选择自己的Group
和Artifact
,然后这里的依赖选择Web
里面的Spring Web
和SQL
里面的JDBC API
、MyBatic Framework
和MySQL Driver
。然后选择Next->Finish
建立工程。
更改配置文件
打开工程文件夹里面src\resources
下的配置文件application.properties
,设置数据库的连接参数:1
2
3
4
5jdbc:mysql://localhost:3306/ruikedaqi?\ =
serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
root =
123456 =
com.mysql.cj.jdbc.Driver =
安装依赖库
打开工程文件夹里面的pom.xml
,在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
38
39
40
41<!--添加spring boot依赖-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
<!--mysql连接类-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--添加JDBC依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--添加druid依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.20</version>
</dependency>
点击右上角位置出现的更新按钮,即可下载更新。
建立工程文件目录包
首先在工程文件中建立几个包1
2
3
4bean // 使用实体类
config // 配置类
controller // 前端接口类
mapper // 数据库映射关系类
最终的文件夹结构为:
config包
新建一个配置类MyConfig
(名字任意,下同)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
2
public class MyConfig {
//配置swagger2核心配置docket
//修改默认配置bean
public Docket myDocket(){
return new Docket(DocumentationType.SWAGGER_2) //指定API类型为swagger2
.apiInfo(apiInfo()) //用于定于api文档汇总信息
.select()
.apis(RequestHandlerSelectors
.basePackage("com.ruikedaqi.sql.controller")) //指定controller包
.paths(PathSelectors.any()) // 所有controller
.build();
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("睿科大器医疗机器人") // 文档页标题
.contact(new Contact("Cxx", // 联系人信息
"www.baidu.com",
"@email"))
.description("睿科大器医疗机器人有限公司") // 详细信息
.version("1.0.1") // 文档版本号
.termsOfServiceUrl("www.baidu.com") //网站地址
.build();
}
}
注意这里的basePackage
为刚才的conntroller
包的路径,要修改为自己的。
Spring Boot
框架是利用注解来表明类的作用。例如这里的@Configuration
表明这是一个配置类,@EnableSwagger2
表明使用的是Swagger2
。
编译运行后,在浏览器打开http://localhost:8080/swagger-ui.html#/
即可看到生成的API文档
:
bean包
DoctorInfo类
首先建立一个DoctorInfo
类,里面存放的是数据库里面的信息: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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68public class DoctorInfo {
private String name;
private String gender;
private int age;
private String post;
private String department;
private int employeeID;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPost() {
return post;
}
public void setPost(String post) {
this.post = post;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public int getEmployeeID() {
return employeeID;
}
public void setEmployeeID(int employeeID) {
this.employeeID = employeeID;
}
public String toString(){
return "doctorInfo{" +
"name" + name +
", gender='" + gender + '\'' +
", age='" + age + '\'' +
", post='" + post + '\'' +
", department='" + department + '\'' +
", employeeID='" + employeeID + '\'' +
'}';
}
}
这里的属性就是刚才建立的数据表里面的表头信息,并设置其get
和set
方法。
ResultMessage
因为API
获取的数据一般为json
格式,因此还需要定义一个返回数据信息格式的类。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
34public class ResultMessage implements Serializable {
private int code = 0;
private String message;
private Map<String, Object> result = new HashMap<>();
private ResultMessage(){
}
public static ResultMessage create(){
return new ResultMessage();
}
public int getCode(){
return this.code;
}
public String getMessage(){
return this.message;
}
public void raise(int code, String message){
this.code = code;
this.message = message;
}
public void put(String key, Object obj){
this.result.put(key, obj);
}
public Map<String, Object> getAttr(){
return this.result;
}
}
这里一共定义3个属性:code
、message
和result
,分别代表正确/错误码、信息提示和结果。并分为定义2个方法:raise()
和put
用来显示信息提示和添加结果。
mapper包
新建一个DoctorMapper
的接口,在里面定义数据库的映射关系:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface DoctorMapper {
/**通过姓名查询*/
"SELECT * FROM ruikedaqi.doctor_info WHERE name = #{name}") (
DoctorInfo getByName(@Param("name") String name);
/**插入表记录*/
"INSERT INTO ruikedaqi.doctor_info(name,gender,age,post,department,employeeID) VALUES(#{name},#{gender},#{age},#{post},#{department},#{employeeID})") (
int create(DoctorInfo doctorInfo);
/*删除记录*/
"DELETE FROM ruikedaqi.doctor_info where name=#{name}") (
int deleteByName(@Param("name") String name);
/*根据姓名修改职务记录*/
"UPDATE ruikedaqi.doctor_info SET department=#{department} where name=#{name}") (
int updateDepartmentByName(@Param("name") String name, @Param("department") String department);
}
这里注意要添加类注解@Mapper
。
每个方法均需要添加注解,表明是数据库中的哪种操作类型。本例中只提供了几个常用的增删改查操作。
controller包
最后就是建立核心的controller
包。
建立DoctorInfoController
类: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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129//提示码
//code -1 姓名不存在/不能为空
//code 999 姓名已存在
//code 101 增加成功
//code 102 删除成功
//code 103 修改成功
//code 104 查询成功
public class DoctorInfoController {
private boolean isNotNull(@RequestParam(value = "name", required = true) String name,
ResultMessage resultMessage) {
if (name == null || name.equals("")){
resultMessage.raise(-1,"姓名不能为空");
return true;
}
return false;
}
private DoctorMapper doctorMapper;
/**
* 插入数据
*/
"/doctor/add") (value =
public Object registerDoctor(@RequestParam(value = "name", required = true) String name,
@RequestParam(value = "gender", required = true) String gender,
@RequestParam(value = "age", required = true) int age,
@RequestParam(value = "post", required = true) String post,
@RequestParam(value = "department", required = true) String department,
@RequestParam(value = "employeeID", required = true) int employeeID) {
ResultMessage resultMessage = ResultMessage.create();
//判断user name空值
if (isNotNull(name, resultMessage)) return resultMessage;
DoctorInfo doctorInfo = this.doctorMapper.getByName(name);
if (doctorInfo != null){
resultMessage.raise(999, "姓名已存在");
return resultMessage;
}else{
resultMessage.put("name",name);
resultMessage.put("gender",gender);
resultMessage.put("age",age);
resultMessage.put("post",post);
resultMessage.put("department",department);
resultMessage.put("employeeID",employeeID);
resultMessage.raise(101,"增加成功");
doctorInfo = new DoctorInfo();
doctorInfo.setName(name);
doctorInfo.setGender(gender);
doctorInfo.setAge(age);
doctorInfo.setPost(post);
doctorInfo.setDepartment(department);
doctorInfo.setEmployeeID(employeeID);
int createName = this.doctorMapper.create(doctorInfo);
return resultMessage;
}
}
/**
* 通过name查询信息
*/
"doctor/getInfo/ByName/{name}") (value =
public Object getInfoByName(@PathVariable String name) {
DoctorInfo doctorInfo = this.doctorMapper.getByName(name);
ResultMessage resultMessage = ResultMessage.create();
if (doctorInfo == null){
resultMessage.raise(-1,"姓名不存在");
return resultMessage;
}
resultMessage.put("name",doctorInfo.getName());
resultMessage.put("gender",doctorInfo.getGender());
resultMessage.put("age",doctorInfo.getAge());
resultMessage.put("post",doctorInfo.getPost());
resultMessage.put("department",doctorInfo.getDepartment());
resultMessage.put("employeeID",doctorInfo.getEmployeeID());
resultMessage.raise(104,"查询成功");
return resultMessage;
}
/**
* 通过name删除信息
*/
"doctor/deleteInfo/ByName/{name}") (value =
public Object deleteInfoByName(@PathVariable String name) {
DoctorInfo doctorInfo = this.doctorMapper.getByName(name);
ResultMessage resultMessage = ResultMessage.create();
if (doctorInfo == null){
resultMessage.raise(-1,"user不存在");
return resultMessage;
}
resultMessage.raise(102,"删除成功");
int deleteName = this.doctorMapper.deleteByName(name);
return resultMessage;
}
/**
* 通过name修改职务信息D
*/
"doctor/updateDepartment/ByName/{name},{department}") (value =
public Object updateDepartmentByName(@PathVariable String name, @PathVariable String department) {
DoctorInfo doctorInfo = this.doctorMapper.getByName(name);
ResultMessage resultMessage = ResultMessage.create();
if (doctorInfo == null){
resultMessage.raise(-1,"user不存在");
return resultMessage;
}
resultMessage.raise(103,"修改成功");
int updateDepartmentByName = this.doctorMapper.updateDepartmentByName(name,department);
return resultMessage;
}
}
@RestController
表明这是一个控制类。@PostMapping
表明这是一个post
方法,@GetMapping
表明这是一个get
方法,后面的value
就是具体的请求地址。
本地运行并测试
点击build
和run
按钮,打开浏览器输入本地测试地址http://localhost:8080/swagger-ui.html
:
打开第3个/doctor/getInfo/ByName/{name}``API
,并点击Try it out
,输入内容即可进行简单的测试。
部署到服务器
生成jar包
点击右侧的Maven
选项卡,打开Lifecycle
,依次双击clean
和package
,生成的jar
包在工程文件夹的target
文件夹中。
将生成的jar
包放在ubuntu
系统中,打开终端输入命令:1
nohup java -jar ***.jar --server.port=8181 >debug.log 2>&1 &
nohup
表示一直运行,--server.port=8181
表示开启服务器端的端口号,debug.log
为日志文件,可以查看报错信息等。