服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 利用Spring Boot和JPA创建GraphQL API

利用Spring Boot和JPA创建GraphQL API

2022-11-25 14:51sofia Java教程

这篇文章主要介绍了利用Spring Boot和JPA创建GraphQL API,GraphQL既是API查询语言,也是使用当前数据执行这些查询的运行时,下文更多相关内容介绍需要的小伙伴可以参考一下

前言:

GraphQL既是API查询语言,也是使用当前数据执行这些查询的运行时。GraphQL让客户能够准确地要求他们所需要的东西,仅此而已,使API随着时间的推移更容易发展,并通过提供API中数据的清晰易懂的描述,支持强大的开发工具。

在本文中,我们将创建一个简单的机场位置应用程序。

利用Spring Boot和JPA创建GraphQL API

一、生成项目

https://start.spring.io/并生成一个项目,不要忘记添加Spring Web、H2数据库和Spring DATA JPA依赖项。

利用Spring Boot和JPA创建GraphQL API

1. 添加依赖项

要启用GraphQL的使用,请在下面添加这两个依赖项。

?
1
2
3
4
5
6
7
8
9
10
<dependency>
  <groupId>com.<a href="https://javakk.com/tag/graphql" rel="external nofollow"  target="_blank" >graphql</a>-java</groupId>
  <artifactId>graphql-spring-boot-starter</artifactId>
  <version>5.0.2</version>
</dependency>
<dependency>
  <groupId>com.graphql-java</groupId>
  <artifactId>graphql-java-tools</artifactId>
  <version>5.2.4</version>
</dependency>

二、Schema

GraphQL模式定义了通过API可用的数据点。模式描述了数据类型及其关系,以及可用的操作,例如检索数据的查询和创建、更新和删除数据的突变。

在resources文件夹中,创建一个扩展名为“.graphqls”的文件,全名为“location.graphqls”。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Define the Entity attribute
type Location {
 id: ID!
 name: String!
 address: String!
}
type Query {
 findAllLocations: [Location]!
}
type Mutation {
 newLocation(name: String!, address: String) : Location!
 deleteLocation(id:ID!) : Boolean
 updateLocationName(newName: String!, id:ID!) : Location!
}

!”表示该字段为必填字段。

三、Entity 和 Repository

利用Spring Boot和JPA创建GraphQL API

现在创建一个名为Location的实体。该位置应该有三个属性:idnameaddress,如模式中所述。当然,也会产生 Getters, Setters, 和 Constrictors。

然后,在本例中,存储库只使用CrudRepository,并扩展位置实体。

?
1
2
3
//imports...
public interface LocationRepository extends CrudRepository<Location, Long> {
}

四、Queries & Exceptions

1. 查询

查询允许我们检索数据。每个查询可以有一个特定的对象,它完全基于查询中指定的字段返回,您可以添加或删除字段以匹配您需要的确切数据,以适合您的特定用例。

创建一个解析器包,然后添加一个实现GraphQLQueryResolver的新查询类,并添加@Component注释。我们只需要添加之前在location中输入的location.graphqls

?
1
2
3
4
5
6
7
8
9
10
11
//imports...
@Component
public class Query implements GraphQLQueryResolver {
    private LocationRepository locationRepository;
    public Query(LocationRepository locationRepository) {
        this.locationRepository = locationRepository;
    }
    public Iterable<Location> findAllLocations() {
        return locationRepository.findAll();
    }
}

2. Mutator

GraphQL中的Mutator允许它更新存储在服务器上的数据。与查询不同,创建、更新或删除等Mutator会改变数据。

现在创建一个mutator包,然后添加一个实现GraphQLMutationResolver和添加@Component注释的新类Mutation。另外,添加我们之前输入的location.graphqls

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//imports...
@Component
public class Mutation implements GraphQLMutationResolver {
    private LocationRepository locationRepository;
    public Mutation(LocationRepository locationRepository) {
        this.locationRepository = locationRepository;
    }
    public Location newLocation(String name, String address) {
        Location location = new Location(name, address);
        locationRepository.save(location);
        return location;
    }
    public boolean deleteLocation(Long id) {
        locationRepository.deleteById(id);
        return true;
    }
    public Location updateLocationName(String newName, Long id) {
        Optional<Location> optionalLocation =
                locationRepository.findById(id);
        if(optionalLocation.isPresent()) {
            Location location = optionalLocation.get();
            location.setName(newName);
            locationRepository.save(location);
            return location;
        } else {
            throw new LocationNotFoundException("Location Not Found", id);
        }
    }

3. Exceptions

创建一个异常包,然后添加一个新的类LocationNotFoundException,该类扩展RuntimeException并实现GraphQLError

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//imports...
public class LocationNotFoundException extends RuntimeException implements GraphQLError {
    private Map<String, Object> extensions = new HashMap<>();
    public LocationNotFoundException(String message, Long invalidLocationId) {
        super(message);
        extensions.put("invalidLocationId", invalidLocationId);
    }
    @Override
    public List<SourceLocation> getLocations() {
        return null;
    }
    @Override
    public Map<String, Object> getExtensions() {
        return extensions;
    }
    @Override
    public ErrorType getErrorType() {
        return ErrorType.DataFetchingException;
    }

现在GraphQL API已经可以使用了!

到此这篇关于利用Spring Boot和JPA创建GraphQL API的文章就介绍到这了,更多相关创建GraphQL API内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://javakk.com/2620.html

延伸 · 阅读

精彩推荐
  • Java教程Java 全方位讲解面向对象特点与使用

    Java 全方位讲解面向对象特点与使用

    面向对象开发方法将面向对象的思想应用于软件开发过程中,指导开发活动,是建立在“对象”概念基础上的方法学,简称OO( Object-Oriented)方法...

    Tangable226752022-11-13
  • Java教程Spring Boot LocalDateTime格式化处理的示例详解

    Spring Boot LocalDateTime格式化处理的示例详解

    这篇文章主要介绍了Spring Boot LocalDateTime格式化处理的示例详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    李阿飞3872021-06-03
  • Java教程Java经典面试题汇总:Mybatis

    Java经典面试题汇总:Mybatis

    本篇总结的是Mybatis框架相关的面试题,后续会持续更新,希望我的分享可以帮助到正在备战面试的实习生或者已经工作的同行,如果发现错误还望大家多多...

    让程序飞10602021-10-18
  • Java教程Mybatis-Plus如何使用分页实例详解

    Mybatis-Plus如何使用分页实例详解

    最近在研究mybatis,然后就去找简化mybatis开发的工具,下面这篇文章主要给大家介绍了关于Mybatis-Plus如何使用分页的相关资料,文中通过实例代码介绍的非常详...

    草帽蓑衣下6562022-08-24
  • Java教程详解SpringBoot Schedule配置

    详解SpringBoot Schedule配置

    本篇文章主要介绍了详解SpringBoot Schedule配置 ,可以实现定时任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    slimer8442020-08-31
  • Java教程java排序高级之选择排序实现方法

    java排序高级之选择排序实现方法

    这篇文章主要介绍了java排序高级之选择排序实现方法,较为全面的分析了选择排序的原理与具体实现技巧,非常具有实用价值,需要的朋友可以参考下 ...

    Benjamin_whx3572019-12-10
  • Java教程Java 线程死锁的问题解决办法

    Java 线程死锁的问题解决办法

    这篇文章主要介绍了 Java 线程死锁的问题解决办法的相关资料,希望通过本大家能帮助到大家,遇到类似问题能够解决,需要的朋友可以参考下...

    Lovnx9462021-01-10
  • Java教程java多线程编程之join方法的使用示例

    java多线程编程之join方法的使用示例

    join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一...

    java技术网5332019-11-04