欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 使用 Graphql 搭建查詢服務(wù)詳解

 更新時(shí)間:2016年12月09日 11:24:47   投稿:lqh  
這篇文章主要介紹了Java 使用 Graphql 搭建查詢服務(wù)詳解的相關(guān)資料,需要的朋友可以參考下

背景

隨著React的開(kāi)源,facebook相繼開(kāi)源了很多相關(guān)的項(xiàng)目,這些項(xiàng)目在他們內(nèi)部已經(jīng)使用了多年,其中引起我注意的就是本次討論的是graphql,目前官方只有nodejs版,由于很多公司的后臺(tái)技術(shù)棧都是Java,所以便有了graphql的java版實(shí)現(xiàn),在github上可以找到,廢話不多說(shuō),直接看代碼吧,具體介紹還是去看官網(wǎng)吧,不然就跑題了。

GraphQLSchema

Schema相當(dāng)于一個(gè)數(shù)據(jù)庫(kù),它有很多GraphQLFieldDefinition組成,F(xiàn)ield相當(dāng)于數(shù)據(jù)庫(kù)表/視圖,每個(gè)表/視圖又由名稱、查詢參數(shù)、數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)組成.

1) 先定義一個(gè)數(shù)據(jù)結(jié)構(gòu)(GraphQLOutputType)字段,然后定義一個(gè)初始化方法

private GraphQLOutputType userType;

private void initOutputType() {
   /**
    * 會(huì)員對(duì)象結(jié)構(gòu)
    */
   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)再定義兩個(gè)表/視圖,它包括名稱,查詢參數(shù),數(shù)據(jù)結(jié)構(gòu),以及數(shù)據(jù)檢索器

 /**
   * 查詢單個(gè)用戶信息
   * @return
   */
  private GraphQLFieldDefinition createUserField() {
    return GraphQLFieldDefinition.newFieldDefinition()
        .name("user")
        .argument(newArgument().name("id").type(GraphQLInt).build())
        .type(userType)
        .dataFetcher(environment -> {
          // 獲取查詢參數(shù)
          int id = environment.getArgument("id");

          // 執(zhí)行查詢, 這里隨便用一些測(cè)試數(shù)據(jù)來(lái)說(shuō)明問(wèn)題
          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();
  }

  /**
   * 查詢多個(gè)會(huì)員信息
   * @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 -> {
          // 獲取查詢參數(shù)
          int page = environment.getArgument("page");
          int size = environment.getArgument("size");
          String name = environment.getArgument("name");

          // 執(zhí)行查詢, 這里隨便用一些測(cè)試數(shù)據(jù)來(lái)說(shuō)明問(wèn)題
          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)接著定義一個(gè)Schema,并將其初始化,它包含一個(gè)名稱,以及一個(gè)或多個(gè)表/視圖(Field)

 private GraphQLSchema schema;

  public GraphSchema() {
    initOutputType();
    schema = GraphQLSchema.newSchema().query(newObject()
        .name("GraphQuery")
        .field(createUsersField())
        .field(createUserField())
        .build()).build();
  }

4)完成以上步驟之后,還需要定義一個(gè)model,類名不限,但是結(jié)構(gòu)需要滿足前面定義的數(shù)據(jù)結(jié)構(gòu),而且必須是public的

public class User {
  private int id;
  private int age;
  private int sex;
  private String name;
  private String pic;
  // getter, setter...
}  

5)之后寫(xiě)一個(gè)main方法,來(lái)測(cè)試一下

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);
    // 查詢單個(gè)用戶
    System.out.println(result2);
    // 單個(gè)用戶、跟用戶列表一起查
    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層,只需要定義一個(gè)query參數(shù),很容易就把查詢服務(wù)搭建好了,dataFetcher 里面還是調(diào)用原來(lái)的查詢接口

7)引入maven依賴

<dependency>
  <groupId>com.graphql-java</groupId>
  <artifactId>graphql-java</artifactId>
  <version>2.0.0</version>
</dependency>

關(guān)于graphql查詢什么定義,看看這個(gè)或許對(duì)你有幫助

json


{
  id=6, 
  sex=0, 
  name="Name_6", 
  pic="pic_6.jpg"
}

query

{
  id,
  sex,
  name,
  pic
}

后面那部分,其實(shí)就是json字符串,去掉=和value的結(jié)果,還是可讀的

結(jié)語(yǔ)

graphql 帶了一種全新的思維方式,可以簡(jiǎn)化web api的開(kāi)發(fā),由客戶端指定需要什么數(shù)據(jù),服務(wù)端返回什么數(shù)據(jù),減少不必要的流量傳輸,對(duì)移動(dòng)端友好,還提供多種數(shù)據(jù)聚合查詢,多個(gè)查詢只是用一個(gè)請(qǐng)求,既滿足api最小粒度,又滿足前端需要,減少請(qǐng)求,提高性能。

感覺(jué)以后會(huì)朝這方面去發(fā)展,大趨所驅(qū)。

相關(guān)文章

  • SpringBoot靜態(tài)資源配置原理(源碼分析)

    SpringBoot靜態(tài)資源配置原理(源碼分析)

    這篇文章主要介紹了SpringBoot靜態(tài)資源配置原理(源碼分析),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 使用HTTPclient保持長(zhǎng)連接

    使用HTTPclient保持長(zhǎng)連接

    這篇文章主要介紹了使用HTTPclient保持長(zhǎng)連接,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java中堆和棧的區(qū)別分析

    java中堆和棧的區(qū)別分析

    這篇文章主要介紹了java中堆和棧的區(qū)別,分析了Java中堆和棧的原理及使用時(shí)的注意事項(xiàng),需要的朋友可以參考下
    2014-09-09
  • 詳解java一維數(shù)組及練習(xí)題實(shí)例

    詳解java一維數(shù)組及練習(xí)題實(shí)例

    在本篇文章里小編給大家整理了關(guān)于java一維數(shù)組及練習(xí)題的相關(guān)知識(shí)點(diǎn)和實(shí)例代碼,有需要的朋友們跟著學(xué)習(xí)下。
    2019-07-07
  • Java項(xiàng)目部署的完整流程(超詳細(xì)!)

    Java項(xiàng)目部署的完整流程(超詳細(xì)!)

    我相信很多Java新手都會(huì)遇到這樣一個(gè)問(wèn)題,跟著教材敲代碼,很容易,但是讓他完整的實(shí)現(xiàn)一個(gè)應(yīng)用項(xiàng)目卻不會(huì),下面這篇文章主要給大家介紹了關(guān)于Java項(xiàng)目部署的完整流程,需要的朋友可以參考下
    2022-07-07
  • Java算法設(shè)計(jì)與分析分治算法

    Java算法設(shè)計(jì)與分析分治算法

    這篇文章主要介紹了Java算法設(shè)計(jì)與分析分治算法,一般分治算法在正文中分解為兩個(gè)即以上的遞歸調(diào)用,并且子類問(wèn)題一般是不想交的
    2022-07-07
  • JavaWeb BeanUtils信息類原理詳解

    JavaWeb BeanUtils信息類原理詳解

    這篇文章主要介紹了JavaWeb BeanUtils信息類原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • HashSet和TreeSet使用方法的區(qū)別解析

    HashSet和TreeSet使用方法的區(qū)別解析

    這篇文章主要介紹了HashSet和TreeSet使用方法的區(qū)別解析,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Mybatis常用分頁(yè)插件實(shí)現(xiàn)快速分頁(yè)處理技巧

    Mybatis常用分頁(yè)插件實(shí)現(xiàn)快速分頁(yè)處理技巧

    這篇文章主要介紹了Mybatis常用分頁(yè)插件實(shí)現(xiàn)快速分頁(yè)處理的方法。非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起看看
    2016-10-10
  • shiro與spring集成基礎(chǔ)Hello案例詳解

    shiro與spring集成基礎(chǔ)Hello案例詳解

    這篇文章主要介紹了shiro與spring集成基礎(chǔ)Hello案例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論