项目整体结构
实现结果
(根据用户id查询用户所发布的文章)
实现步骤
- 引入整个demo所需要的依赖
org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-web com.graphql-java graphql-spring-boot-starter 5.0.2 com.graphql-java graphql-java-tools 5.2.4 com.graphql-java-kickstart graphiql-spring-boot-starter 8.0.0 runtime org.projectlombok lombok mysql mysql-connector-java com.alibaba druid-spring-boot-starter 1.1.14 com.baomidou mybatis-plus-boot-starter 3.5.1 cn.hutool hutool-core 5.7.22
- 配置文件
server:
port: 8080
graphql:
servlet:
corsEnabled: true
mapping: /graphql
enabled: true
tools:
schemaLocationPattern: schema*.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
- 新建数据库 (建了一个用户表和文章表模拟实战常见)
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;
- 新建实体以及相关类
@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;
}
- 编写要实现的接口方法
@Service public class UserServiceImpl extends ServiceImplimplements UserService, GraphQLQueryResolver { @Resource PostMapper postMapper; @Override public GetUserRequest getUserPostList(int id) { User user = this.getById(id); GetUserRequest request = BeanUtil.copyProperties(user, GetUserRequest.class); List posts = postMapper.selectList(Wrappers. lambdaQuery().eq(Post::getUserId, user.getId())); request.setPosts(BeanUtil.copyToList(posts, GetPostListRequest.class)); return request; } } @Service public class PostServiceImpl extends ServiceImpl implements PostService, GraphQLQueryResolver { @Override public GetPostListRequest getPostById(int id) { Post post = this.getById(id); return BeanUtil.copyProperties(post, GetPostListRequest.class); } }
- 新建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就可看到已经有的接口, 在左边输入需要查询的字段点击最上面运行图标就可以在右边空白看到结果



