准备工作:
【这里是2018年的版本很好理解,后面的版本改了groupid以及新增了些内容这里入门还挺老版本容易快速入门,差别再文章后面稍有介绍】
1.导入springboot集成graphql的开源demospring-boot-graphql: spring-boot-graphql demo
2.下载postman
接下来就可以学习graphql了
第一步先把springboot里面的数据源改成自己的测试数据库
第二步注意下图所框住的包
首先demo中的graphql看怎么集成的
1.pom
<!-- graphql -->
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java-tools</artifactId>
<version>4.3.0</version>
</dependency>
2.这里有两个文件
(1)schema.grapqls对应前端的vo
(2)root.graphqls是定义query【查询】,mutation【修改新增】对象,里面包含了API提供调用的方法
所以root.grapqls对应视图解析器自己定义的Query和Mutation里面的方法
定义:
type Query {
findAllAuthors: [Author]!
countAuthors: Long!
findOneAuthor(id: Long!): Author
findAllBooks: [Book]!
countBooks: Long!
}
type Mutation {
newAuthor(firstName: String!, lastName: String!) : Author!
newBook(title: String!, isbn: String!, pageCount: Int, authorId: Long!) : Book!
saveBook(input: BookInput!): Book!
deleteBook(id: ID!) : Boolean
updateBookPageCount(pageCount: Int!, id: Long!) : Book!
}
映射的方法:
public class Query implements GraphQLQueryResolver {
private AuthorRepository authorRepository;
private BookRepository bookRepository;
public Author findOneAuthor(Long id) {
Optional<Author> opt = authorRepository.findById(id);
return opt.isPresent() ? opt.get() : null;
}
public List<Author> findAllAuthors() {
return authorRepository.findAll();
}
public Long countAuthors() {
return authorRepository.count();
}
public List<Book> findAllBooks() {
return bookRepository.findAll();
}
public Long countBooks() {
return bookRepository.count();
}
}
public class Mutation implements GraphQLMutationResolver {
private AuthorRepository authorRepository;
private BookRepository bookRepository;
public Author newAuthor(String firstName, String lastName) {
Author author = new Author();
author.setFirstName(firstName);
author.setLastName(lastName);
return authorRepository.save(author);
}
public Book newBook(String title, String isbn, int pageCount, long authorId) {
Book book = new Book();
book.setTitle(title);
book.setIsbn(isbn);
book.setPageCount(pageCount);
book.setAuthorId(authorId);
return bookRepository.save(book);
}
public Book saveBook(BookInput input) {
Book book = new Book();
book.setTitle(input.getTitle());
book.setIsbn(input.getIsbn());
book.setPageCount(input.getPageCount());
book.setAuthorId(input.getAuthorId());
return bookRepository.save(book);
}
public Boolean deleteBook(long id) {
bookRepository.deleteById(id);
return true;
}
public Book updateBookPageCount(int pageCount, long id) {
Optional<Book> opt = bookRepository.findById(id);
if (!opt.isPresent()) return null;
Book book = opt.get();
book.setPageCount(pageCount);
return bookRepository.save(book);
}
}
这里是是针对单个对象里面包含的属性类型都是非自定义的对象类型,如果单个自定义对象里面还包含复杂自定义对象,那还需要对应的解析器【主要看schema.graphqls有没有定义这种对象】
从图上可以看到BOOK中包含Author,Author中有BOOK
所以还需要对应的解析器
至于方法名称规则,单个对象getX,多个List对象对应getXs
以下配上postman使用【postman集成了graphql】
到此应该算是入门了吧,至于精通我个人觉得没必要,因为我觉得Graphql不是很容易再公司用起来,算是个定制化的吧,前后端都要集成才可以用,而且通信数据类型很奇葩,外层是个大JSON,里面是个字符串,不是个纯粹可以转为JSON的数据【可以用抓包自己看】,这种不纯粹的通信编码协议估计是火不起来的原因
最后新增版本2018以后,graphql改了包名
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>${graphql.version}</version>
</dependency>
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphiql-spring-boot-starter</artifactId>
<version>${graphql.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java-extended-scalars</artifactId>
<version>${graphql.extended.scalars.version}</version>
</dependency>
最新源码链接:https://github.com/philip-jvm/learn-spring-boot-graphql
有兴趣的可以再入门后,研究新源码
graphql查询推荐工具: https://www.electronjs.org/apps/graphql-playground