SpringBoot集成GraphQL

本文介绍了如何使用Spring Boot、GraphQL和MyBatis-Plus构建一个应用,实现在用户ID基础上查询用户发布的文章,包括了依赖引入、数据库设计、实体类定义、接口实现及GraphQL查询配置。

项目整体结构
在这里插入图片描述

实现结果
(根据用户id查询用户所发布的文章)
在这里插入图片描述

实现步骤

  1. 引入整个demo所需要的依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--graphql start-->
        <dependency>
            <groupId>com.graphql-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>
        <dependency>
            <groupId>com.graphql-java-kickstart</groupId>
            <artifactId>graphiql-spring-boot-starter</artifactId>
            <version>8.0.0</version>
            <scope>runtime</scope>
        </dependency>
        <!--graphql end-->

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- Mysql驱动包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.14</version>
        </dependency>

        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-core</artifactId>
            <version>5.7.22</version>
        </dependency>

    </dependencies>
  1. 配置文件
server:
  port: 8080
graphql:
  servlet:
  corsEnabled: true
  mapping: /graphql
  enabled: true
  tools:
    schemaLocationPattern: schema/*.graphql # 如果不添加该配置,grahql默认文件位置和文件结尾应该是 **/*.graphqls

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/graphql_test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&useAffectedRows=true&rewriteBatchedStatements=true&useSSL=false
    username: root
    password: root

  1. 新建数据库 (建了一个用户表和文章表模拟实战常见)
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `username` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '用户名',
  `real_name` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '真实名称',
  `email` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


CREATE TABLE `post` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  `content` longtext COLLATE utf8_bin,
  `category` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
  1. 新建实体以及相关类
@Data
@TableName("user")
public class User {

    @TableId(type = IdType.AUTO)
    private Integer id;

    private String username;

    private String realName;

    private String email;

}

@Data
@TableName("post")
public class Post {

    @TableId(type = IdType.AUTO)
    private Integer id;

    private String title;

    private String content;

    private String category;

    private int userId;

}
  1. 编写要实现的接口方法
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService, GraphQLQueryResolver {

    @Resource
    PostMapper postMapper;
    
    /**
     * 根据用户id获取用户所有文章
     *
     * @param id: 用户id
     * @return
     **/
    @Override
    public GetUserRequest getUserPostList(int id) {
        User user = this.getById(id);
        GetUserRequest request = BeanUtil.copyProperties(user, GetUserRequest.class);
        List<Post> posts = postMapper.selectList(Wrappers.<Post>lambdaQuery().eq(Post::getUserId, user.getId()));
        request.setPosts(BeanUtil.copyToList(posts, GetPostListRequest.class));
        return request;
    }

}


@Service
public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements PostService, GraphQLQueryResolver {

    /**
     * 根据文章id获取文章
     *
     * @param id: 文章id
     * @return
     **/
    @Override
    public GetPostListRequest getPostById(int id) {
        Post post = this.getById(id);
        return BeanUtil.copyProperties(post, GetPostListRequest.class);
    }

}
  1. 新建graphQL文件,每个类之间的关系以及接口方法
schema {
    query: Query,
}

type Query {
    getUserPostList(id:Int) : GetUserRequest

    getPostById(id:Int) : GetPostListRequest
}

type GetUserRequest {
    id : ID!,
    username : String,
    realName : String,
    email : String,
    posts : [GetPostListRequest], #表示这是一个数组
}

type GetPostListRequest {
    id : ID!, #表示这个字段非空
    title : String,
    content : String,
    category: String
}

7.在浏览器输入以下地址,就会出现该页面

http://127.0.0.1:8080/graphiql
在这里插入图片描述

点击右上角的Docs就可看到已经有的接口, 在左边输入需要查询的字段点击最上面运行图标就可以在右边空白看到结果
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值