公司网站后台如何上传视频,wordpress加载变慢,网站建设简称什么,服务器安wordpresshttps://blog.csdn.net/qq362228416/article/details/50854980 背景 随着react的开源#xff0c;facebook相继开源了很多相关的项目#xff0c;这些项目在他们内部已经使用了多年#xff0c;其中引起我注意的就是本次讨论的是graphql#xff0c;目前官方只有nodejs版#…https://blog.csdn.net/qq362228416/article/details/50854980 背景 随着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);// 执行查询, 这里随便用一些测试数据来说明问题ListUser 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}};MapString, Object result1 (MapString, Object) new GraphQL(schema).execute(query1).getData();MapString, Object result2 (MapString, Object) new GraphQL(schema).execute(query2).getData();MapString, Object result3 (MapString, Object) new GraphQL(schema).execute(query3).getData();// 查询用户列表System.out.println(result1);// 查询单个用户System.out.println(result2);// 单个用户、跟用户列表一起查System.out.println(result3);}
输出
{users[{id0, sex0, namejohn_2_0, picpic_0.jpg}, {id1, sex1, namejohn_2_1, picpic_1.jpg}, {id2, sex0, namejohn_2_2, picpic_2.jpg}, {id3, sex1, namejohn_2_3, picpic_3.jpg}, {id4, sex0, namejohn_2_4, picpic_4.jpg}]}
{user{id6, sex0, nameName_6, picpic_6.jpg}}
{user{id6, sex0, nameName_6, picpic_6.jpg}, users[{id0, sex0, namejohn_2_0, picpic_0.jpg}, {id1, sex1, namejohn_2_1, picpic_1.jpg}, {id2, sex0, namejohn_2_2, picpic_2.jpg}, {id3, sex1, namejohn_2_3, picpic_3.jpg}, {id4, sex0, namejohn_2_4, picpic_4.jpg}]}
6最后把main方法里面的代码放到web层只需要定义一个query参数很容易就把查询服务搭建好了dataFetcher 里面还是调用原来的查询接口
7引入maven依赖
dependencygroupIdcom.graphql-java/groupIdartifactIdgraphql-java/artifactIdversion2.0.0/version
/dependency
关于graphql查询什么定义看看这个或许对你有帮助
json
{id6, sex0, nameName_6, picpic_6.jpg
}
query
{id,sex,name,pic
}
后面那部分其实就是json字符串去掉和value的结果还是可读的
结语
graphql 带了一种全新的思维方式可以简化web api的开发由客户端指定需要什么数据服务端返回什么数据减少不必要的流量传输对移动端友好还提供多种数据聚合查询多个查询只是用一个请求既满足api最小粒度又满足前端需要减少请求提高性能。