環境:Springboot3.0.9
概述
- 一種用于 API 的查詢語言
GraphQL 既是一種用于 API 的查詢語言也是一個滿足你資料查詢的運作時。 GraphQL 對你的 API 中的資料提供了一套易于了解的完整描述,使得用戶端能夠準确地獲得它需要的資料,而且沒有任何備援,也讓 API 更容易地随着時間推移而演進,還能用于建構強大的開發者工具。
- 請求你所要的資料
向你的 API 發出一個 GraphQL 請求就能準确獲得你想要的資料,不多不少。 GraphQL 查詢總是傳回可預測的結果。使用 GraphQL 的應用可以工作得又快又穩,因為控制資料的是應用,而不是伺服器。
- 擷取多個資源
GraphQL 查詢不僅能夠獲得資源的屬性,還能沿着資源間引用進一步查詢。典型的 REST API 請求多個資源時得載入多個 URL,而 GraphQL 可以通過一次請求就擷取你應用所需的所有資料。這樣一來,即使是比較慢的移動網絡連接配接下,使用 GraphQL 的應用也能表現得足夠迅速。
- 描述所有的可能
GraphQL API 基于類型和字段的方式進行組織,而非入口端點。你可以通過一個單一入口端點得到你所有的資料能力。GraphQL 使用類型來保證應用隻請求可能的資料,還提供了清晰的輔助性錯誤資訊。應用可以使用類型,而避免編寫手動解析代碼。
有關GraphQL的文法相關知識,請參考
https://graphql.org/
中文
https://graphql.cn/
接下來将以一個完整的示例示範GraphQL的使用。
環境配置
- 引入依賴
<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 ;
}
}
以上是基本的資料庫操作,很容易了解。接下來就是定義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
}
有關graphql相關文法請參考上面提到的網址。接下來是定義通路接口
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);
}
}
通路測試
隻需通路統一的入口即可:
#該通路路徑可以在配置檔案中修改
http://localhost:8080/graphql
這裡是通路的完整的資訊,我們可以在請求的query中設定需要通路的字段,如下:
隻通路book資訊
隻通路部分字段資訊
你需要通路那些字段,是完全由用戶端定義的。
完畢!!!
轉發+關注
SpringBoot對Spring MVC都做了哪些事?(一)
SpringBoot對Spring MVC都做了哪些事?(二)
SpringBoot對Spring MVC都做了哪些事?(三)
SpringBoot對Spring MVC都做了哪些事?(四)
Spring Retry重試架構的應用
Spring強大的任務執行與排程
Spring容器這些擴充點你都清楚了嗎?
Spring MVC 異步請求方式 Spring事務管理器詳解