在sprint-boot中使用graphQL
简介
graphQL介绍
略
spring-boot介绍
略
需求
我们以查询书籍及其作者作为示例来展示graphql的使用
配置
- 新建maven工程,并添加spring-boot和graphql的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.graphql-java/graphql-spring-boot-starter -->
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>3.10.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.graphql-java/graphql-java-tools -->
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java-tools</artifactId>
<version>4.2.0</version>
</dependency>
- 定义数据类
定义Author类:
@Builder
@Data
public class Author {
private Integer id;
private String name;
private Integer age;
}
定义Book类:
@Builder
@Data
public class Book {
private Integer id;
private String name;
private Author author;
private String publisher;
}
- 添加QueryResolver
@Component
public class BookQueryResolver implements GraphQLQueryResolver {
public List<Book> findBooks() {
Author author = Author.builder()
.id(1)
.name("Bill Venners")
.age(40)
.build();
Book b = Book.builder()
.id(1)
.name("scala编程第三版")
.author(author)
.publisher("电子工业出版社")
.build();
List<Book> bookList = new ArrayList<Book>();
bookList.add(b);
return bookList;
}
}
在BookQueryResolver中我们添加了一个findeBooks方法,这里我们写死了一个Book对象和一个Author对象,实现开发中根据自已的需要来获取数据。
- 添加graphql的接口定义
在resources目录添加root.graphqls和schema.graphqls文件。root.graphqls用于方法的定义,schema.graphqls用于定义可查询数据及字段信息。
root.graphqls:
type Query {
findBooks: [Book]
}
schema.graphqls:
type Author {
id: Int
name: String
age: Int
}
type Book {
id: Int
name: String
author: Author
publisher: String
}
- 添加GraphqlApplication用于启动我们的应用
@SpringBootApplication
public class GraphqlApplication {
public static void main(String [] args ) {
new SpringApplication(GraphqlApplication.class).run(args);
}
}
-
启动程序
当我们在spring-boot的启动日志里看到/graphql/*这样的访问路径时,说明我们的graphql已经成功添加,如下图所示
graphql.jpg - 添加图形化工具
图形化工具不是必需的,但是在我们的开发过程中,却提供了很好的便利性,图形工具的添加很简单,在maven中添加如下依赖即可:
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphiql-spring-boot-starter</artifactId>
<version>3.10.0</version>
</dependency>
重新启动应用,然后使用浏览器访问http://localhost:8080/graphiql,如下图:

graphiql.jpg
测试
-
我们调用findBooks查询书名和出版社
graphql-1.jpg -
通过findBooks查询书名和出版社的同时,查询作者名称
graphql-2.jpg
总结
示例很简单,但graphql确实很好地解决了不同接口对查询字段差异性的要求,而不会产生数据冗余,更多功能还待研究。
示例地址:示例


