GraphQL-Java用来向前端返回json数据

简介: GraphQL-Java用来向前端返回json数据

GraphQL

GraphQL是 Facebook 开发的一种查询语言,用于在复杂的应用程序的数据模型中,描述数据要求。
官网:http://graphql.org/
GraphQL-Java:https://github.com/graphql-java/graphql-java

GraphQL这个词刚入我眼帘没多久,刚开始也只是看了一下简介而已。由于本人编程能力和知识储备不好,最近想用一个一个小项目来实践一下,采用Java语言写一个web项目,打算使用Java中对我来说全新的知识,经过细想后决定采用struts2框架+bootstrap框架(后台管理)+MUI框架(移动端),一边学习一边做项目,让自己在实践中获取到更多的知识。

在写到数据库连接的时候,本来是想用C3P0来管理数据库连接的,想起前两天在开源中国看到另一个数据库连接池HikariCP,数据显示它比C3P0性能更好,然后就采用了HikariCP,毕竟我这次的目的是学习新的知识,所以毅然用了它。

eclipse+maven(现学现用)+struts2(现学现用)+bootstrap(用过几次)+MUI(现学现用)


GraphQL-Java github示例代码:

import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLSchema;
import java.util.Map;

import static graphql.Scalars.GraphQLString;
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
import static graphql.schema.GraphQLObjectType.newObject;

public class HelloWorld {

    public static void main(String[] args) {
        GraphQLObjectType queryType = newObject()
                .name("helloWorldQuery")
                .field(newFieldDefinition()
                        .type(GraphQLString)
                        .name("hello")
                        .staticValue("world"))
                .build();

        GraphQLSchema schema = GraphQLSchema.newSchema()
                .query(queryType)
                .build();

        GraphQL graphQL = GraphQL.newGraphQL(schema).build();

        Map<String, Object> result = graphQL.execute("{hello}").getData();
        System.out.println(result);
        // Prints: {hello=world}
    }
}

百度了GraphQL-Java的相关用法:http://blog.csdn.net/qq362228416/article/details/50854980

我把上面这为朋友的代码直接复制粘贴运行,发现无法得到正确的数据,打印出来的信息全是xxx=null,当时很纳闷,我这半桶水的知识对这百来行代码无法找出问题所在。然后只能尝试结合官方的示例代码和前面这位朋友的用法,尝试着写。


前期准备工作:写一个结构类

public class ZyVo {
//专业类
    private int    id, xy, readnum;
    private String code, title, text, jc, pic, general;
//.....getXXX,setXXX
}

然后编写GraphQL与上面这个类的结构对应信息:

//import graphql.Scalars;//相关包
GraphQLObjectType beanVo = newObject().name("zy")
                .field(newFieldDefinition().name("id").type(Scalars.GraphQLInt).build())//类型一定要与结构类字段的类型相对应
                .field(newFieldDefinition().name("xy").type(Scalars.GraphQLInt).build())
                .field(newFieldDefinition().name("code").type(Scalars.GraphQLString).build())
                .field(newFieldDefinition().name("title").type(Scalars.GraphQLString).build())
                .field(newFieldDefinition().name("jc").type(Scalars.GraphQLString).build())
                .field(newFieldDefinition().name("pic").type(Scalars.GraphQLString).build())
                .field(newFieldDefinition().name("general").type(Scalars.GraphQLString).build())
                .field(newFieldDefinition().name("text").type(Scalars.GraphQLString).build())
                .field(newFieldDefinition().name("readnum").type(Scalars.GraphQLInt).build())
                .build();


之后写一个对数据进行查询的东西(我也不知道怎么描述这个东西所以就称他为东西了)

GraphQLFieldDefinition findforid = GraphQLFieldDefinition.newFieldDefinition().name("zy")
                .argument(//这里用GraphQL些查询语句时传入的参数
                        newArgument()
                        .name("id")//参数名为id
                        .type(Scalars.GraphQLInt)//参数类型
                        .build()
                        )
                .type(beanVo)//绑定GraphQL的一个结构,就是上面的那段代码
                .dataFetcher(environment -> {
                    // 获取查询参数
                    int id = environment.getArgument("id");
                    ZyProxy zyProxy = new ZyProxy();//一个对ZyVo数据进行增删改查代理的操作类
                    ZyVo vo = null;
                    try {
                        vo = zyProxy.findById(id);//通过ID查找数据
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println(vo);
                    
                    return vo;
                }).build();


//我也不懂怎么称呼下面这个代码

GraphQLSchema schema = GraphQLSchema.newSchema()
                .query(newObject().name("GraphQuery")
                                               .field(findforid)//半桶水不知道怎么描述它
                                               .build()
                 )
                .build();


//写一条类似查询语句的东西,GraphQL会解析它然后返回相关的结果

String ghql = "{zy(id:1){id,title,readnum,text,pic,jc}}";
//最后就是获取结果了
ExecutionResult re = new GraphQL(schema).execute(ghql);
Map<String, Object> result1 = (Map<String, Object>) re.getData();
//把它打印出来
System.out.println(result1);//结果:{zy={id=1, title=服装与服饰设计, readnum=0, text=null, pic=null, jc=null}}
//可以把它加入到json对象中

JSONObject json = new JSONObject();
json.putAll(result1);
System.out.println(json);//输出就成了json数据了:{"zy":{"id":1,"title":"服装与服饰设计","readnum":0}}


至此我的目的达到了,灵活定制我想要的json数据,因为有时候有的字段并不想让前端看到,用这个方法感觉很方便。

当然,我打开它方式可能很不正确,恳请各位大神展示GraphQL-Java更多的用法,小白坐等。

目前我只用它来生成我想要的json数据,因为可以很方便的定制我想要的数据,而不用更改其他Java代码,只需要改一条字符串信息就行了。




目录
相关文章
|
29天前
|
存储 监控 安全
前端框架的数据驱动方式如何保证数据的安全性?
总之,前端框架的数据驱动方式需要综合运用多种手段来保证数据的安全性。从传输、存储、访问控制到防范攻击等各个方面进行全面考虑和实施,以确保用户数据的安全可靠。同时,不断加强安全管理和技术创新,以应对不断变化的安全挑战。
105 60
|
17天前
|
前端开发 JavaScript Java
java常用数据判空、比较和类型转换
本文介绍了Java开发中常见的数据处理技巧,包括数据判空、数据比较和类型转换。详细讲解了字符串、Integer、对象、List、Map、Set及数组的判空方法,推荐使用工具类如StringUtils、Objects等。同时,讨论了基本数据类型与引用数据类型的比较方法,以及自动类型转换和强制类型转换的规则。最后,提供了数值类型与字符串互相转换的具体示例。
|
17天前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
67 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
1月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
44 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
24天前
|
JSON Java 程序员
Java|如何用一个统一结构接收成员名称不固定的数据
本文介绍了一种 Java 中如何用一个统一结构接收成员名称不固定的数据的方法。
25 3
|
1月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
36 4
|
1月前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
1月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
72 2
|
1月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
31 2
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。