@GraphQLQuery

参考:https://blog.csdn.net/feiyingwang/article/details/113945807

GraphQL是什么?
GraphQL官方解释是一个用于API的查询语言,前端用户自己灵活且随意地选择传入的参数和返回的字段。
简介
GraphQL是用于描述复杂数据模型的一种查询语言,简单来说就是需要什么字段就能够拿到什么字段,返回给前端的数据没有冗余,并且返回的数据类型是json格式的。
官网解释:GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。

GraphQL主要是作用于数据接口,比如前端后端交互。是给客户端筛选自由获取服务端事先定义好的数据,后端使用了GraphQL之后,数据库查出来A,B,C,D四个字段,客户端需要数据的时候,你可以随意使用这四个字段的各种组合,只要A,C字段还是只要A,C,D字段等等,不再需要和服务端交流。
那么,可不可以前端去控制需要的字段?

答案是可以的,GraphQL为此而生。下面的代码块是一个graphQL查询语句,当我们只需要account的id和name时这样写查询就可以了,如果需要avatar,我们再加上avatar就可以了。

{
  account {
    id
    name
  }
}

这样对比restFulAPI而言,graphQL更加灵活,能够准确获取想要的数据。

结论:查询语句放在前端,由前端来控制需要的数据,所以是用于API的查询语言。

使用

参考:https://blog.csdn.net/y368769/article/details/111152157

万年第一步:导jar包

<dependency>
    <groupId>io.leangen.graphql</groupId>
    <artifactId>spqr</artifactId>
    <version>0.10.1</version>
</dependency>

controller层配置

@Autowired
TestService testService;//service层

static GraphQLSchema schema = null;

public GraphQLSchema init() {
    if (schema != null) {
        return schema;
    }

    schema = new GraphQLSchemaGenerator()
            .withBasePackages("io.leangen")//这里不用改
            .withOperationsFromSingleton(testService)
            .generate();
    return schema;
}

@PostMapping("/graphQL")
public Object getGateway(@RequestBody String sql) {
    init();

    GraphQL graphQL = new GraphQL.Builder(schema).build();

    ExecutionResult result = graphQL.execute(sql);

    return result;
}

在这里需注意使用的是@RequestBody

service层
注意:
使用注解:@GraphQLQuery
里面的name元素是请求时候的字段,
可以在后面操作对比看到

传参:
单独一个字段可使用:@GraphQLArgument
对象可使用:@GraphQLContext

仔细看的话getDeviceBySubGateway方法传递的参数是subGateway方法返回的对象,这里就设计到了它的传参机制,内层方法使用的参数是外层方法返回的参数,这样说很是模糊,在后面的实际操作中就可以看到

@Autowired
TestMapper testMapper;//mapper和普通的一样专门查询数据库的

@GraphQLQuery(name = "subgateway")
public SubGateway subGateway(@GraphQLArgument(name = "extsno") String id) {
    if (Strings.isBlank(extsno)) {
        return null;
    }
    List<SubGateway> subGateways = tIotGatewaysMapper.findByExtsno(extsno);
    return subGateways.get(0);
}

@GraphQLQuery(name = "gateway")
public Gateway getDeviceBySubGateway(@GraphQLContext SubGateway subGateway) {
    List<Gateway> devices = tIotGatewaysMapper.findGatewayBySub(subGateway);
    return devices.get(0);
}

bean
这里需要注意

使用到的所有bean必须统一继承一个类才能使用
在有可能前台访问的字段上添加注解:@GraphQLQuery
SubGateway:

@Data
public class SubGateway extends CommonModel {


    /**
     * SNO 机器码
     */
    @GraphQLQuery(name = "sno", description = "机器码")
    private String sno;

    /**
     *   内网IP
     */
    @GraphQLQuery(name = "ip", description = "IP")
    private String ip;

    /**
     * contrl_device_api_port  外网控制端口
     */
    @GraphQLQuery(name = "port", description = "端口")
    private String port;

    /**
     * contrl_device_api_uri  外网控制接口
     */
    //@GraphQLQuery(name = "api", description = "外网控制接口")
    private String api;

    /**
     * SNO 生成机器码
     */
    @GraphQLQuery(name = "ext_sno", description = "生成机器码")
    private String extSno;


    /**
     * gwid
     */
    @GraphQLQuery(name = "gateway_id", description = "生成机器码")
    private String gwid;


}

CommonModel

@Data
public abstract class CommonModel {


    @GraphQLQuery
    private String id;

    @GraphQLQuery(name = "status",description = "状态")
    protected String status="true";

    @GraphQLQuery(name = "isdel",description = "是否删除")
    protected String delFlag="false";

    protected String createBy;

}
@Data
public class Gateway extends CommonModel {

    /**
     * SNO 机器码
     */
    @GraphQLQuery(name = "sno", description = "机器码")
    private String sno;


    /**
     *  GIT 地址
     */
    @GraphQLQuery(name = "git_path", description = "项目地址")
    private String gitPath;

    /**
     *  描述
     */
    @GraphQLQuery(name = "desription", description = "描述")
    private String desription;

    private String subid;

操作

可以去下载关于使用的demo:
https://github.com/yanshuoshi/graphol

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值