SpringBoot集成GraphQL

SpringBoot集成GraphQL,第1张

项目整体结构

实现结果
(根据用户id查询用户所发布的文章)

实现步骤

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

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

        
        <dependency>
            <groupId>com.graphql-javagroupId>
            <artifactId>graphql-spring-boot-starterartifactId>
            <version>5.0.2version>
        dependency>
        <dependency>
            <groupId>com.graphql-javagroupId>
            <artifactId>graphql-java-toolsartifactId>
            <version>5.2.4version>
        dependency>
        <dependency>
            <groupId>com.graphql-java-kickstartgroupId>
            <artifactId>graphiql-spring-boot-starterartifactId>
            <version>8.0.0version>
            <scope>runtimescope>
        dependency>
        

        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
        dependency>

        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
        dependency>
        
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druid-spring-boot-starterartifactId>
            <version>1.1.14version>
        dependency>

        
        <dependency>
            <groupId>com.baomidougroupId>
            <artifactId>mybatis-plus-boot-starterartifactId>
            <version>3.5.1version>
        dependency>

        <dependency>
            <groupId>cn.hutoolgroupId>
            <artifactId>hutool-coreartifactId>
            <version>5.7.22version>
        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就可看到已经有的接口, 在左边输入需要查询的字段点击最上面运行图标就可以在右边空白看到结果

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/916533.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存