背景
随着react的开源,facebook相继开源了很多相关的项目,这些项目在他们内部已经使用了多年,其中引起我注意的就是本次讨论的是graphql,目前官方只有nodejs版,由于很多公司的后台技术栈都是java,所以便有了graphql的java版实现,在github上可以找到,废话不多说,直接看代码吧,具体介绍还是去看官网吧,不然就跑题了。
GraphQLSchema
Schema相当于一个数据库,它有很多GraphQLFieldDefinition组成,Field相当于数据库表/视图,每个表/视图又由名称、查询参数、数据结构、数据组成.
1) 先定义一个数据结构(GraphQLOutputType)字段,然后定义一个初始化方法
private GraphQLOutputType userType;
private void initOutputType() {
/**
* 会员对象结构
*/
userType = newObject()
.name("User")
.field(newFieldDefinition().name("id").type(GraphQLInt).build())
.field(newFieldDefinition().name("age").type(GraphQLInt).build())
.field(newFieldDefinition().name("sex").type(GraphQLInt).build())
.field(newFieldDefinition().name("name").type(GraphQLString).build())
.field(newFieldDefinition().name("pic").type(GraphQLString).build())
.build();
}
2)再定义两个表/视图,它包括名称,查询参数,数据结构,以及数据检索器
/**
* 查询单个用户信息
* @return
*/
private GraphQLFieldDefinition createUserField() {
return GraphQLFieldDefinition.newFieldDefinition()
.name("user")
.argument(newArgument().name("id").type(GraphQLInt).build())
.type(userType)
.dataFetcher(environment -> {
int id = environment.getArgument("id");
User user = new User();
user.setId(id);
user.setAge(id + 15);
user.setSex(id % 2);
user.setName("Name_" + id);
user.setPic("pic_" + id + ".jpg");
return user;
})
.build();
}
/**
* 查询多个会员信息
* @return
*/
private GraphQLFieldDefinition createUsersField() {
return GraphQLFieldDefinition.newFieldDefinition()
.name("users")
.argument(newArgument().name("page").type(GraphQLInt).build())
.argument(newArgument().name("size").type(GraphQLInt).build())
.argument(newArgument().name("name").type(GraphQLString).build())
.type(new GraphQLList(userType))
.dataFetcher(environment -> {
int page = environment.getArgument("page");
int size = environment.getArgument("size");
String name = environment.getArgument("name");
List<User> list = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
User user = new User();
user.setId(i);
user.setAge(i + 15);
user.setSex(i % 2);
user.setName(name + "_" + page + "_" + i);
user.setPic("pic_" + i + ".jpg");
list.add(user);
}
return list;
})
.build();
}
3)接着定义一个Schema,并将其初始化,它包含一个名称,以及一个或多个表/视图(Field)
private GraphQLSchema schema
public GraphSchema() {
initOutputType()
schema = GraphQLSchema.newSchema().query(newObject()
.name("GraphQuery")
.field(createUsersField())
.field(createUserField())
.build()).build()
}
4)完成以上步骤之后,还需要定义一个model,类名不限,但是结构需要满足前面定义的数据结构,而且必须是public的
public class User {
private int id;
private int age;
private int sex;
private String name;
private String pic;
}
5)之后写一个main方法,来测试一下
public static void main(String[] args) {
GraphQLSchema schema = new GraphSchema().getSchema();
String query1 = "{users(page:2,size:5,name:\"john\") {id,sex,name,pic}}";
String query2 = "{user(id:6) {id,sex,name,pic}}";
String query3 = "{user(id:6) {id,sex,name,pic},users(page:2,size:5,name:\"john\") {id,sex,name,pic}}";
Map<String, Object> result1 = (Map<String, Object>) new GraphQL(schema).execute(query1).getData();
Map<String, Object> result2 = (Map<String, Object>) new GraphQL(schema).execute(query2).getData();
Map<String, Object> result3 = (Map<String, Object>) new GraphQL(schema).execute(query3).getData();
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
}
输出:
{users=[{id=0, sex=0, name=john_2_0, pic=pic_0.jpg}, {id=1, sex=1, name=john_2_1, pic=pic_1.jpg}, {id=2, sex=0, name=john_2_2, pic=pic_2.jpg}, {id=3, sex=1, name=john_2_3, pic=pic_3.jpg}, {id=4, sex=0, name=john_2_4, pic=pic_4.jpg}]}
{user={id=6, sex=0, name=Name_6, pic=pic_6.jpg}}
{user={id=6, sex=0, name=Name_6, pic=pic_6.jpg}, users=[{id=0, sex=0, name=john_2_0, pic=pic_0.jpg}, {id=1, sex=1, name=john_2_1, pic=pic_1.jpg}, {id=2, sex=0, name=john_2_2, pic=pic_2.jpg}, {id=3, sex=1, name=john_2_3, pic=pic_3.jpg}, {id=4, sex=0, name=john_2_4, pic=pic_4.jpg}]}
6)最后把main方法里面的代码放到web层,只需要定义一个query参数,很容易就把查询服务搭建好了,dataFetcher 里面还是调用原来的查询接口
7)引入maven依赖
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java</artifactId>
<version>2.0.0</version>
</dependency>
关于graphql查询什么定义,看看这个或许对你有帮助
json
{
id=6,
sex=0,
name="Name_6",
pic="pic_6.jpg"
}
query
{
id,
sex,
name,
pic
}
后面那部分,其实就是json字符串,去掉=和value的结果,还是可读的
结语
graphql 带了一种全新的思维方式,可以简化web api的开发,由客户端指定需要什么数据,服务端返回什么数据,减少不必要的流量传输,对移动端友好,还提供多种数据聚合查询,多个查询只是用一个请求,既满足api最小粒度,又满足前端需要,减少请求,提高性能。
感觉以后会朝这方面去发展,大趋所驱。
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
相关推荐
在本文中,我们将深入探讨如何使用Java来搭建GraphQL查询服务。GraphQL是一种强大的API查询语言,由Facebook开发,它允许客户端定义所需数据的形状,从而提高了数据获取的效率和灵活性。在Java环境中,我们可以借助...
上篇给大家介绍了Java 使用 Graphql 搭建查询服务详解。这里我们讲讲如何在Vue中使用GraphQL。 1. 初始化vue项目 npm install -g @vue/cli vue create vue-apollo-demo 选择默认cli的默认模板就可以了 添加 /src/...
在Java中实现GraphQL服务,通常会使用如GraphQL Java这样的库。GraphQL Java提供了一个全面的框架,可以方便地将GraphQL语义与Java代码中的数据解析器关联起来。数据解析器是GraphQL服务的核心,它们负责处理实际的...
本篇文章将深入探讨如何在Spring Boot项目中使用`graphql-java`来搭建和运行GraphQL服务。 首先,要开始一个GraphQL项目,你需要在你的Spring Boot应用中添加`graphql-java`和`spring-boot-starter-web`的依赖。在`...
在Java中,我们通常会使用如GraphQL Java这样的库来实现GraphQL服务。 在开发GraphQL服务时,你需要定义一个Schema,这是GraphQL服务的核心。Schema描述了你的数据模型,包括对象类型、接口、枚举、输入类型和联合...
在某些场景下,可能需要将SpringMVC和GraphQL结合使用,例如在现有SpringMVC应用中引入GraphQL服务,或者利用SpringBoot的便捷性来搭建GraphQL服务。整合步骤通常包括以下几点: 1. **引入依赖**:添加GraphQL相关...
总的来说,GraphQL-Demo项目是一个完整的示例,它演示了如何在Java后端使用Spring Boot搭建GraphQL服务。通过学习这个项目,开发者可以了解到GraphQL与Spring Boot的集成方式,理解如何定义和实现GraphQL Schema,...
通过"graphql-demo"项目,开发者可以学习到如何在Java环境中搭建和管理GraphQL服务,理解GraphQL与Spring Boot的集成方式,以及如何设计和优化查询效率。此外,还可以掌握如何调试和测试GraphQL API,以及如何将...
学员可能会学习到如何使用阿里云SDK进行文件操作,理解GraphQL的查询语法,以及如何在Java环境中搭建和优化GraphQL服务。这些知识对于现代Web应用的开发来说非常实用,能够提升开发效率和应用性能。 综上所述,阿里...
在React端,我们将使用Apollo Client作为GraphQL的客户端库,它提供了一种方便的方式来管理GraphQL查询、订阅和突变。创建一个React组件,使用ApolloProvider包裹整个应用,注入GraphQL端点的URL。然后,我们可以...
6. **graphql-server集成**:`graphql-server`是GraphQL服务的实现,`graphqlize`可能提供了与其的集成,帮助开发者快速搭建和部署GraphQL服务。 7. **Lacinia支持**:Lacinia是另一个Clojure的GraphQL实现,`...
在本项目中,它搭建了GraphQL服务,接收并响应客户端的CRUD操作请求。 在实际操作中,开发者首先会定义TypeScript的数据模型,然后Type-GraphQL会基于这些模型生成GraphQL schema。接着,通过TypeORM配置数据库连接...
首先,Spring Boot是Java开发领域的轻量级框架,以其简化Spring应用的初始搭建以及开发过程而闻名。Spring Boot的核心特性包括自动配置、起步依赖、命令行接口等,使得开发者能够快速构建独立运行的应用程序。在物资...
总的来说,"spring-boot-graphql"项目展示了如何利用Spring Boot的灵活性和GraphQL的强大查询能力,构建一个高效的后端服务。通过这个示例,你可以学习到如何在Java环境中设置GraphQL服务,定义schema,编写...
通过研究`kotlin-graphql-sample`项目,开发者可以学习到如何在Kotlin环境中搭建一个功能完备的GraphQL服务,同时利用Spring Boot的便利性来管理后端服务。这样的组合不仅简化了开发流程,还提升了API性能,是现代...
2. GraphQL:一种API查询语言,提高了数据获取的效率和灵活性。 以上只是Java Web开发的一部分知识点,实际开发中还会涉及更多的框架、工具和技术,如WebSocket、Spring Cloud、MyBatis等。学习和掌握这些内容,...
2. **后端开发技术**:后端源码可能采用Node.js、Java、Python等服务器端语言实现,通过RESTful API或GraphQL与前端进行数据交换。开发者需要掌握至少一种后端语言,并理解如何设计和实现RESTful API。 3. **数据库...
【标题】"Java仿微信全栈 高性能后台+移动客户端.zip" 提示我们这是一个关于使用Java技术栈来模仿微信功能的项目,其中包括高性能的后端服务和移动客户端的实现。这个项目很可能是基于Spring Boot框架构建的,因为...
而GraphQL作为一种新型的数据查询语言,为API设计提供了更灵活的方式。PrimeNG则是一款强大的Angular UI组件库,提供了丰富的前端组件,使得用户界面的构建更为快捷。本项目“springboot-graphql-primeng-utils”...
- 定义接口:使用Java编写服务接口,这些接口的方法将在服务端提供。 - 实现接口:创建服务类,实现接口中的方法。 - 创建WSDL文件:描述服务的接口和方法,通常由IDE自动生成。 - 部署服务:使用JAX-WS或Apache...