GraphQL是一种查询语言用来设计 APIs,可替代 REST,SOAP 或 gRPC,详细的可以查看官网解释: GraphQL
本教程中,我们将构建一个 Spring Boot GraphQL 例子并提供 CRUD APIs 来从 mysql 数据库中创建,查询,更新,删除对象。
Sring Boot CRUD GraphQL APIs 概览
目标
我们有两个数据模型:作者(Author)
和 课程(Tutorial)
。
1 | Author { |
一个作者可能有多个课程 , 所以他们是一对多的关系
CRUD GraphQL APIs
创建作者:
GraphQL
1
2
3
4
5
6
7
8mutation {
createAuthor(
name: "bezkoder",
age: 27) {
id
name
}
}响应
1
2
3
4
5
6
7
8{
"data": {
"createAuthor": {
"id": "1",
"name": "bezkoder"
}
}
}
查询所有作者
GraphQL
1
2
3
4
5
6
7query {
findAllAuthors{
id
name
age
}
}响应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{
"data": {
"findAllAuthors": [
{
"id": 1,
"name": "张三",
"age": 25
},
{
"id": 2,
"name": "李四"
"age": 43
}
]
}
}
等等,这里先不一一列举了
如果查看数据库,你会发现有两张表: author
和 tutorial
内容如下
1 | mysql> select * from author; |
开始构建APIs
用到的依赖
我们的应用将用到下面这些:
- Java8 或者 java11
- Spring Boot 2.2.1.RELEASE (with Spring Web)
- Graphql-spring-boot-starter 7.0.1
- Graphiql-spring-boot-starter 7.0.1
- Gradle 6.3
- MySQL 5.7
项目结构
- resources/graphql 中所有的
.graphqls
定义了 GraphQL schemas - model: 存放 Author 和 Tutorial 实体类
- mapper: 存放 Mapper 接口来和 MySQL 交互
- resolver: 通过实现一些
Resolver
接口来处理查询和修改的请求,该类可以理解成 SpringMVC 中的 Controller 层 - application.yml: 配置文件
- build.gradle: gradle 的构建文件
项目准备
首先创建 Spring Boot 项目,然后添加依赖
1 | dependencies { |
相关配置文件
打开 application.yml 并添加下面的配置
1 | server: |
创建 GraphQL Schema
我们为了将schema拆分到不同的文件里,以分类管理,Spring Boot GraphQL 会自动扫描所有 schema 文件
首先我们创建 Schemas
author.graphqls
1 | type Author { |
tutorial.graphqls
1 | type Tutorial { |
query.graphqls
1 | # Root |
mutation.graphqls
1 | # Root |
在 GraphQL 中分为两个大类,所有的查询入口在 Query
, 所有的变更入口都在 Mutation
上面文件中 !
的意思该字段不能为 null
,如果加 !
,那么在返回值的时候 GraphQL允许返回 null
定义实体类,Mapper接口,Service实现
这些我们比较熟悉,直接跳过大家可以查看源码
实现GraphQL Root 解析器
如下面文件 TutorialMutationResolver
实现了对 Tutorial
的变更请求处理
1 | package com.kba977.learngraphql.graphql.resolver.mutation; |
实现 GraphQL 字段解析器
对于 Tutorial 中的复杂类型 author,我们需要字段解析器去解析它的值,TutorialResolver
实现了 GraphQLResolver
接口并实现 getAuthor()
方法
resolver/TutorialResolver.java
1 | package com.kba977.learngraphql.graphql.resolver; |
如果客户端请求 Tutorial
没有带上 author
字段,那么 GraphQL Server 将不会调用该方法去解析字段
运行应用并检查结果
应用启动后,打开浏览器访问 localhost:8083/graphiql
1 | fragment author on Author { |
进一步学习资源
- GraphQL documentation
- https://www.graphql-java.com/tutorials/getting-started-with-spring-boot/
- graphql-java Github
源代码
你可以从github上找到完整的代码:https://github.com/kba977/learn-graphql