Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >GraphQL实践2——Spring-GraphQL集成JPA与MySQL

GraphQL实践2——Spring-GraphQL集成JPA与MySQL

原创
作者头像
F嘉阳
发布于 2022-10-28 01:13:18
发布于 2022-10-28 01:13:18
1.4K0
举报
文章被收录于专栏:graphqlgraphql

介绍

上一篇介绍到用第三方库集成GraphQL,目前spring-graphql项目已经出到1.0.0-M3版本,属于内部预览版,此处尝鲜验证

GraphQL实践1——集成JPA与MySQL - F嘉阳 博客 (fjy8018.top)

集成过程

引入依赖

由于SpringBoot 2.6.0还未发布,因此需要引入较多依赖

代码语言:html
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.experimental</groupId>
        <artifactId>graphql-spring-boot-starter</artifactId>
        <version>1.0.0-M3</version>
    </dependency>
    <!--升级到Spring Boot 2.6后可以移除-->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-commons</artifactId>
        <version>2.6.0-RC1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>2.6.0-RC1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.1-api -->
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.1-api</artifactId>
        <version>1.0.2.Final</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.querydsl/querydsl-jpa -->
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>4.4.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.querydsl/querydsl-apt -->
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>4.4.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
    <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-core</artifactId>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

引入里程碑仓库

由于还没有GA,所以要引入里程碑仓库

代码语言:html
AI代码解释
复制
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
    </repository>
    <repository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

引入插件

由于使用了dsl动态生成,还要引入注解处理器

代码语言:html
AI代码解释
复制
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
            </configuration>
        </plugin>
        <!-- added for QueryDsl-->
        <plugin>
            <groupId>com.mysema.maven</groupId>
            <artifactId>apt-maven-plugin</artifactId>
            <version>1.1.3</version>
            <executions>
                <execution>
                    <goals>
                        <goal>process</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>target/generated-sources/java</outputDirectory>
                        <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

SpringBoot 配置

编写配置文件

代码语言:yaml
AI代码解释
复制
spring:
  datasource:
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: "****"
      url: jdbc:mysql://localhost:3306/sakila?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
  jpa:
    hibernate:
      ddl-auto: none
    show-sql: true
    database-platform: org.hibernate.dialect.MySQL55Dialect
    properties:
      hibernate:
        format_sql: true
        use_sql_comments: true
  graphql:
    path: /graphql
    schema:
      locations: classpath:graphql/
      fileExtensions: .graphqls, .gqls
      printer:
        enabled: true
server:
  port: 8080

实体类

代码语言:java
AI代码解释
复制
package top.fjy8018.graphsqldemo.entity;

import lombok.Data;

import javax.persistence.*;
import java.sql.Timestamp;
import java.util.Objects;

/**
 * 演员表实体类
 *
 * @author F嘉阳
 * @date 2021/11/5 10:34
 */
@Data
@Entity
@Table(name = "actor", schema = "sakila")
public class ActorEntity {
    @Id
    @Column(name = "actor_id", nullable = false)
    private Integer actorId;

    @Column(name = "first_name", nullable = false, length = 45)
    private String firstName;

    @Column(name = "last_name", nullable = false, length = 45)
    private String lastName;

    @Column(name = "last_update", nullable = false)
    private Timestamp lastUpdate;

}

DAO

DAO直接继承dsl相关处理器,可自动配对增删改查方法,相比第三方库更加简便

代码语言:java
AI代码解释
复制
package top.fjy8018.graphsqldemo.repository;

import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.repository.CrudRepository;
import org.springframework.graphql.data.GraphQlRepository;
import top.fjy8018.graphsqldemo.entity.ActorEntity;

/**
 * 演员表DAO
 *
 * @author F嘉阳
 * @date 2021/11/5 10:35
 */
@GraphQlRepository
public interface ActorEntityRepository extends
        CrudRepository<ActorEntity, Integer>, QuerydslPredicateExecutor<ActorEntity> {
}

Graphql资源定义

resources/graphql下定义接口和实体文件

接口声明和实体定义schema.graphqls

代码语言:txt
AI代码解释
复制
type Query {
    findOneActor(actorId : ID!): ActorEntity
    actorList: [ActorEntity]
}

type ActorEntity {
    actorId: ID!
    firstName: String!
    lastName: String!
    lastUpdate: String
}

接口定义acotrEntity.graphql

代码语言:txt
AI代码解释
复制
query findOneActor($id: ID!) {
    findOneActor(actorId: $id) {
        actorId
        firstName
        lastName
        lastUpdate
    }
}

query actorList {
    actorList{
        actorId
    }
}

启动测试

Spring-Graphql默认不包含可视化界面,此处使用postman进行测试

唯一查询

image-20211115151701244
image-20211115151701244

列表查询

image-20211115151810849
image-20211115151810849

总结

使用Spring官方组件好处在于和Spring生态集成度很高,如果本身就采用Jpa方式进行业务开发,迁移更加方便,需要开发的代码也很少。

样例源码地址

FJiayang/graphql-demo at spring-graphql (github.com)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
GraphQL实践3——Spring-Graphql集成Mybatis Plus
考虑到国内大部分场景对接的是Mybatis或者Mybatis Plus生态,而不是JPA,同时Graphql版本也进一步迭代,故计划使用Mybatis Plus对接Graphql
F嘉阳
2022/10/28
9680
GraphQL实践1——集成JPA与MySQL
GraphQL经过近几年的发展,SpringBoot官方、第三方都提供了starter
F嘉阳
2022/10/28
1.4K1
GraphQL实践4——Netflix Dgs Graphql集成Mybatis Plus
通过JPA或者Mybatis Plus集成Graphql框架已经很简便,但其实使用graphql-java集成过于底层,很多扩展内容实现并不方便,例如:
F嘉阳
2022/10/28
1.2K0
【Spring Boot】022-不使用spring-boot-starter-parent
是 Spring Boot 的父级依赖,加上此配置之后,当前的项目就是 Spring Boot 项目了。spring-boot-starter-parent 是一个特殊的 starter,它用来提供相关的 Maven 默认依赖。
訾博ZiBo
2025/01/06
1160
【Spring Boot】022-不使用spring-boot-starter-parent
第六章:使用QueryDSL的聚合函数
在企业级项目开发过程中,往往会经常用到数据库内的聚合函数,一般ORM框架应对这种逻辑问题时都会采用编写原生的SQL来处理,而QueryDSL完美的解决了这个问题,它内置了SQL所有的聚合函数下面我们简
恒宇少年
2018/06/27
3.7K0
第一章:Maven环境下如何配置QueryDSL环境
QueryDSL是一个通用的查询框架,框架的核心原则是创建安全类型的查询,开始QueryDSL仅支持Hibernate(HQL),在不断开源人士加入QueryDSL团队后,陆续发布了针对JPA,JDO,JDBC,Lucene,Hibernate Search,MangoDB,Collections 和RDF(Relational Data Format) Bean等。 本章目标 我们本系列的章节主要使用QueryDSL与SpringDataJPA在SpringBoot开发环境下进行整合使用,目前Spr
恒宇少年
2018/06/27
1.7K3
Spring与SpringBoot整合Spring Data JPA及使用
Spring Data JPA是Spring Data项目下的一个模块。提供了一套基于JPA标准操作数据库的简化方案,底层默认是依赖Hibernate JPA来实现的。
害恶细君
2022/11/22
4.7K0
Spring与SpringBoot整合Spring Data JPA及使用
SpringBoot集成JPA
在SpringBoot中,通过Spring Data JPA 和 Spring Data Rest可以快速构建出一个RESTFul应用。
Noneplus
2019/09/24
1.2K0
SpringBoot集成JPA
Spring整合Hibernate JPA
JPA:就是由Sun公司提供的一套对于持久层操作的标准(接口加文档),没有具体的实现。
害恶细君
2022/11/22
1.3K0
Spring Data Jpa初体验(内含demo)
我一直在使用Mybatis作为持久化框架,并且觉得Mybatis十分的不错,足够灵活,虽说需要自己手写sql,但是这也是我觉得的一个优点,直观并且优化方便.
呼延十
2019/07/01
1K0
Spring Data Jpa初体验(内含demo)
Spring Cloud【Finchley】-01服务提供者与服务消费者
服务提供者: 服务的被调用发,为其他服务提供服务的服务 服务消费者: 服务的调用方,即依赖其他服务的服务
小小工匠
2021/08/17
2720
序列化与反序列化系列二:JPA 与 Querydsl
其实JPA放在这里有些牵强,不过我们开始这个系列的研究是与JPA相关的,起源于数据库查询中自动生成的一段Dabatase相关代码。事实上,在简化orm代码时,序列化和反序列化也确实是其中的一部分重要工作。那么我们就开始本篇学习。
程序员架构进阶
2021/10/11
1.5K0
Spring Data JPA中使用QueryDSL进行查询
插件的作用是把带有@Entity注解的实体类在指定路径target/generated-sources/java下生成一个衍生的实体类,我们后面就是用这个衍生出来的实体类去构建动态查询的条件进行动态查询。
砒霜拌辣椒
2023/08/23
2.2K0
Spring Data JPA中使用QueryDSL进行查询
SpringBoot系列教程JPA之基础环境搭建
JPA(Java Persistence API)Java持久化API,是 Java 持久化的标准规范,Hibernate是持久化规范的技术实现,而Spring Data JPA是在 Hibernate 基础上封装的一款框架。JPA作为标准,实际上并没有说局限于某个固定的数据源,事实上mysql,mongo, solr都是ok的。接下来我们将介绍下springboot结合jpa 来实现mysql的curd以及更加复杂一点的sql支持
一灰灰blog
2019/07/02
5900
SpringBoot系列教程JPA之基础环境搭建
Java操作数据库Spring(2)
pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion>
Java帮帮
2018/03/16
8330
spring-boot-starter-data-jpa + SQLite简单例子(含全部代码)
SQLite官网:http://www.sqlite.org/ SQLite是比 Access 更优秀的文件型数据库,支持复杂的 SQL 语句,支持索引、触发器,速度很快,开源等。
程裕强
2021/11/18
4.8K0
spring-boot-starter-data-jpa + SQLite简单例子(含全部代码)
第二章:使用QueryDSL与SpringDataJPA实现单表普通条件查询
在企业开发中ORM框架有很多种如:Hibernate,Mybatis,JdbcTemplate等。每一种框架的设计理念是不一样的,Hibernate跟我们本章讲解的SpringDataJPA是一致的框架都是全自动理念作为设计核心,让用户更少的去写SQL语句通过简单的配置就可以实现各种查询。而Mybatis框架则是半自动理念作为设计核心,SQL让用户自己定义实现了更好的灵活性。 本章目标 本章我们目标实现QueryDSL通用查询语言整合SpringDataJPA完成单表的查询多样化。 构建项目 下面我们先来创
恒宇少年
2018/06/27
1.7K0
第五章:使用QueryDSL与SpringDataJPA实现查询返回自定义对象
在我们实际项目开发中,往往会遇到一种多表关联查询并且仅需要返回多表内的几个字段最后组合成一个集合或者实体。这种情况在传统的查询中我们无法控制查询的字段,只能全部查询出后再做出分离,这种也是我们最不愿意看到的处理方式,这种方式会产生繁琐、复杂、效率低、代码阅读性差等等问题。QueryDSL为我们提供了一个返回自定义对象的工具类型,而Java8新特性Collection中stream方法也能够完成返回自定义对象的逻辑,下面我们就来看下这两种方式如何编写? 本章目标 基于SpringBoot平台完成SpringD
恒宇少年
2018/06/27
4.8K0
springboot2.X 使用spring-data组件对MongoDB做CURD
基于快速开发,需求不稳定的情况, 我决定使用MongoDB作为存储数据库,搭配使用spring-data
suveng
2019/09/17
2.1K0
Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8
JPA(Java Persistence API)Java持久化API,是 Java 持久化的标准规范,Hibernate是持久化规范的技术实现,而Spring Data JPA是在 Hibernate 基础上封装的一款框架。
磊哥
2018/09/07
3.9K0
Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8
相关推荐
GraphQL实践3——Spring-Graphql集成Mybatis Plus
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档