自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Springboot整合GraphQL使你的API更易理解可讀性更強

開發(fā) 開發(fā)工具
GraphQL API 基于類型和字段的方式進行組織,而非入口端點。你可以通過一個單一入口端點得到你所有的數(shù)據(jù)能力。GraphQL 使用類型來保證應(yīng)用只請求可能的數(shù)據(jù),還提供了清晰的輔助性錯誤信息。

環(huán)境:Springboot3.0.9

概述

  • 一種用于 API 的查詢語言

GraphQL 既是一種用于 API 的查詢語言也是一個滿足你數(shù)據(jù)查詢的運行時。GraphQL 對你的 API 中的數(shù)據(jù)提供了一套易于理解的完整描述,使得客戶端能夠準確地獲得它需要的數(shù)據(jù),而且沒有任何冗余,也讓 API 更容易地隨著時間推移而演進,還能用于構(gòu)建強大的開發(fā)者工具。

  • 請求你所要的數(shù)據(jù)

向你的 API 發(fā)出一個 GraphQL 請求就能準確獲得你想要的數(shù)據(jù),不多不少。GraphQL 查詢總是返回可預(yù)測的結(jié)果。使用 GraphQL 的應(yīng)用可以工作得又快又穩(wěn),因為控制數(shù)據(jù)的是應(yīng)用,而不是服務(wù)器。

  • 獲取多個資源

GraphQL 查詢不僅能夠獲得資源的屬性,還能沿著資源間引用進一步查詢。典型的 REST API 請求多個資源時得載入多個 URL,而 GraphQL 可以通過一次請求就獲取你應(yīng)用所需的所有數(shù)據(jù)。這樣一來,即使是比較慢的移動網(wǎng)絡(luò)連接下,使用 GraphQL 的應(yīng)用也能表現(xiàn)得足夠迅速。

  • 描述所有的可能

GraphQL API 基于類型和字段的方式進行組織,而非入口端點。你可以通過一個單一入口端點得到你所有的數(shù)據(jù)能力。GraphQL 使用類型來保證應(yīng)用只請求可能的數(shù)據(jù),還提供了清晰的輔助性錯誤信息。應(yīng)用可以使用類型,而避免編寫手動解析代碼。

有關(guān)GraphQL的語法相關(guān)知識,請參考

https://graphql.org/中文

https://graphql.cn/

接下來將以一個完整的示例演示GraphQL的使用。

環(huán)境配置

  • 引入依賴
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-graphql</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>com.mysql</groupId>
  <artifactId>mysql-connector-j</artifactId>
  <scope>runtime</scope>
</dependency>
  • 配置文件
spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/testjpa?serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&useSSL=false
    username: root
    password: xxxxxx
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      minimumIdle: 10
      maximumPoolSize: 200
      autoCommit: true
      idleTimeout: 30000
      poolName: MasterDatabookHikariCP
      maxLifetime: 1800000
      connectionTimeout: 30000
      connectionTestQuery: SELECT 1  
---
spring:
  jpa:
    generateDdl: false
    hibernate:
      ddlAuto: update
    openInView: true
    show-sql: true
---
spring:
  graphql:
    path: /graphql
    graphiql:
      enabled: true
      path: /graphiql
    cors:
      allow-credentials: true
      allowed-headers: '*'
      allowed-methods: '*'
    schema:
      locations:
      - classpath*:graphql/**/
      file-extensions:
      - .graphqls
      - .gqls
      printer:
        enabled: true

注意:這里的
spring.graphql.graphql.enabled=true開啟后,將會提供一個UI界面供我們快速查詢測試使用

圖片圖片

做好以上配置后,接下來就是建立2張表t_book和t_author。

實體定義

Book

@Entity
@Table(name = "t_book")
public class Book {


  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id ;
  private String name ;
  private Integer pageCount ;
  @Transient
  private List<Author> author = new ArrayList<>();
}

Author

@Entity
@Table(name = "t_author")
public class Author {
  
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id ;
  private String firstName ;
  private String lastName ;
  // Book表的主鍵
  private Long bid ;
}

Repository定義

BookRepository

public interface BookRepository extends JpaRepository<Book, Long>, JpaSpecificationExecutor<Book> {
}

AuthorRepository

public interface AuthorRepository extends JpaRepository<Author, Long>, JpaSpecificationExecutor<Author> {


  List<Author> findByBid(Long bid) ;
  
}

Service定義

@Service
public class BookService {
  
  @Resource
  private BookRepository bookRepository ;
  @Resource
  private AuthorRepository authorRepository ;
  
  public Book queryBook(Long id) {
    Book book = bookRepository.findById(id).orElse(null) ;
    List<Author> authors = authorRepository.findByBid(id) ;
    book.setAuthor(authors) ;
    return book ;
  }
  
}

以上是基本的數(shù)據(jù)庫操作,很容易理解。接下來就是定義GraphQL Schema

GraphQL Schema定義

schema {
  query: BookQuery
}


type BookQuery {
  bookById(id: ID): Book
}


type Book {
  id: ID
  name: String
  pageCount: Int
  author: [Author]
}


type Author {
  id: ID
  firstName: String
  lastName: String
}

有關(guān)graphql相關(guān)語法請參考上面提到的網(wǎng)址。接下來是定義訪問接口

Controller接口

@Controller
public class BookController {


  @Resource
  private BookService bookService;
  @Resource
  private AuthorRepository authorRepository;


  @SchemaMapping(typeName = "BookQuery", field = "bookById")
  public Book bookById(@Argument Long id) {
    return bookService.queryBook(id);
  }


}

訪問測試

只需訪問統(tǒng)一的入口即可:

#該訪問路徑可以在配置文件中修改

http://localhost:8080/graphql

圖片圖片


這里是訪問的完整的信息,我們可以在請求的query中設(shè)置需要訪問的字段,如下:

圖片圖片

只訪問book信息

只訪問部分字段信息只訪問部分字段信息

你需要訪問那些字段,是完全由客戶端定義的。

責(zé)任編輯:武曉燕 來源: 實戰(zhàn)案例錦集
相關(guān)推薦

2023-09-11 09:38:25

代碼編程

2021-10-09 10:24:53

Java 代碼可讀性

2017-10-30 15:22:29

代碼可讀性技巧

2021-04-01 16:43:05

代碼可讀性開發(fā)

2019-06-06 08:48:14

代碼函數(shù)編程語言

2015-08-27 13:11:18

JavaScript代碼

2021-01-26 09:18:27

Shell腳本網(wǎng)站

2024-04-23 08:01:20

面向?qū)ο?/a>C 語言代碼

2022-08-29 00:37:53

Python技巧代碼

2021-06-15 09:12:19

TypeScriptTypeScript Javascript

2017-12-19 16:24:20

2022-08-23 14:57:43

Python技巧函數(shù)

2021-12-08 23:38:25

Python工具代碼

2024-08-02 16:20:06

2020-11-08 14:36:27

pandas數(shù)據(jù)分析pipe()

2019-12-03 09:32:32

JavaScript代碼開發(fā)

2022-11-04 11:18:16

代碼優(yōu)化可讀性

2024-01-31 08:04:43

PygmentsPython

2024-10-11 06:00:00

Python代碼編程

2014-07-28 10:28:25

程序員
點贊
收藏

51CTO技術(shù)棧公眾號