`
qq362228416
  • 浏览: 33351 次
社区版块
存档分类
最新评论

Java 使用 Graphql , 搭建查询服务

 
阅读更多

背景

随着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;
    // getter, setter...
}   

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 搭建查询服务详解

    在本文中,我们将深入探讨如何使用Java来搭建GraphQL查询服务。GraphQL是一种强大的API查询语言,由Facebook开发,它允许客户端定义所需数据的形状,从而提高了数据获取的效率和灵活性。在Java环境中,我们可以借助...

    vue中使用GraphQL的实例代码

    上篇给大家介绍了Java 使用 Graphql 搭建查询服务详解。这里我们讲讲如何在Vue中使用GraphQL。 1. 初始化vue项目 npm install -g @vue/cli vue create vue-apollo-demo 选择默认cli的默认模板就可以了 添加 /src/...

    开发GraphQL服务以及前台系统搭建(含Java代码和sql脚本).zip

    在Java中实现GraphQL服务,通常会使用如GraphQL Java这样的库。GraphQL Java提供了一个全面的框架,可以方便地将GraphQL语义与Java代码中的数据解析器关联起来。数据解析器是GraphQL服务的核心,它们负责处理实际的...

    graphql-java:Spring Boot项目使用graphql-java演示GraphQL

    本篇文章将深入探讨如何在Spring Boot项目中使用`graphql-java`来搭建和运行GraphQL服务。 首先,要开始一个GraphQL项目,你需要在你的Spring Boot应用中添加`graphql-java`和`spring-boot-starter-web`的依赖。在`...

    day06-开发GraphQL服务以及前台系统搭建.zip

    在Java中,我们通常会使用如GraphQL Java这样的库来实现GraphQL服务。 在开发GraphQL服务时,你需要定义一个Schema,这是GraphQL服务的核心。Schema描述了你的数据模型,包括对象类型、接口、枚举、输入类型和联合...

    SpringMVC&&GraphQL

    在某些场景下,可能需要将SpringMVC和GraphQL结合使用,例如在现有SpringMVC应用中引入GraphQL服务,或者利用SpringBoot的便捷性来搭建GraphQL服务。整合步骤通常包括以下几点: 1. **引入依赖**:添加GraphQL相关...

    GraphQL-Demo:GraphQL示范项目

    总的来说,GraphQL-Demo项目是一个完整的示例,它演示了如何在Java后端使用Spring Boot搭建GraphQL服务。通过学习这个项目,开发者可以了解到GraphQL与Spring Boot的集成方式,理解如何定义和实现GraphQL Schema,...

    graphql-demo:Java GraplQL演示

    通过"graphql-demo"项目,开发者可以学习到如何在Java环境中搭建和管理GraphQL服务,理解GraphQL与Spring Boot的集成方式,以及如何设计和优化查询效率。此外,还可以掌握如何调试和测试GraphQL API,以及如何将...

    day05-阿里云OSS以及GraphQL入门.zip

    学员可能会学习到如何使用阿里云SDK进行文件操作,理解GraphQL的查询语法,以及如何在Java环境中搭建和优化GraphQL服务。这些知识对于现代Web应用的开发来说非常实用,能够提升开发效率和应用性能。 综上所述,阿里...

    graphql-webflux:使用Spring 5React框架(webflux)的GraphQL应用程序

    在React端,我们将使用Apollo Client作为GraphQL的客户端库,它提供了一种方便的方式来管理GraphQL查询、订阅和突变。创建一个React组件,使用ApolloProvider包裹整个应用,注入GraphQL端点的URL。然后,我们可以...

    graphqlize:一个Clojure和JVM库,用于从Postgres和MySQL数据库立即开发GraphQL API

    6. **graphql-server集成**:`graphql-server`是GraphQL服务的实现,`graphqlize`可能提供了与其的集成,帮助开发者快速搭建和部署GraphQL服务。 7. **Lacinia支持**:Lacinia是另一个Clojure的GraphQL实现,`...

    typescript-graphql-CRUD:使用Typerscript,Type-GraphQL,TypeORM和Apollo-server-express的基本CRUD操作

    在本项目中,它搭建了GraphQL服务,接收并响应客户端的CRUD操作请求。 在实际操作中,开发者首先会定义TypeScript的数据模型,然后Type-GraphQL会基于这些模型生成GraphQL schema。接着,通过TypeORM配置数据库连接...

    物资管理系统后端(spring boot+graphql+Mongodb实现).zip

    首先,Spring Boot是Java开发领域的轻量级框架,以其简化Spring应用的初始搭建以及开发过程而闻名。Spring Boot的核心特性包括自动配置、起步依赖、命令行接口等,使得开发者能够快速构建独立运行的应用程序。在物资...

    spring-boot-graphql:Spring Boot graphql示例

    总的来说,"spring-boot-graphql"项目展示了如何利用Spring Boot的灵活性和GraphQL的强大查询能力,构建一个高效的后端服务。通过这个示例,你可以学习到如何在Java环境中设置GraphQL服务,定义schema,编写...

    kotlin-graphql-sample:Kotlin + Spring + GraphQL的示例实现

    通过研究`kotlin-graphql-sample`项目,开发者可以学习到如何在Kotlin环境中搭建一个功能完备的GraphQL服务,同时利用Spring Boot的便利性来管理后端服务。这样的组合不仅简化了开发流程,还提升了API性能,是现代...

    Java web 开发

    2. GraphQL:一种API查询语言,提高了数据获取的效率和灵活性。 以上只是Java Web开发的一部分知识点,实际开发中还会涉及更多的框架、工具和技术,如WebSocket、Spring Cloud、MyBatis等。学习和掌握这些内容,...

    微信小程序-后台搭建源码

    2. **后端开发技术**:后端源码可能采用Node.js、Java、Python等服务器端语言实现,通过RESTful API或GraphQL与前端进行数据交换。开发者需要掌握至少一种后端语言,并理解如何设计和实现RESTful API。 3. **数据库...

    Java仿微信全栈 高性能后台+移动客户端.zip

    【标题】"Java仿微信全栈 高性能后台+移动客户端.zip" 提示我们这是一个关于使用Java技术栈来模仿微信功能的项目,其中包括高性能的后端服务和移动客户端的实现。这个项目很可能是基于Spring Boot框架构建的,因为...

    springboot-graphql-primeng-utils:Spring Boot,Graphql和PrimeNG

    而GraphQL作为一种新型的数据查询语言,为API设计提供了更灵活的方式。PrimeNG则是一款强大的Angular UI组件库,提供了丰富的前端组件,使得用户界面的构建更为快捷。本项目“springboot-graphql-primeng-utils”...

    WebService工程

    - 定义接口:使用Java编写服务接口,这些接口的方法将在服务端提供。 - 实现接口:创建服务类,实现接口中的方法。 - 创建WSDL文件:描述服务的接口和方法,通常由IDE自动生成。 - 部署服务:使用JAX-WS或Apache...

Global site tag (gtag.js) - Google Analytics