项目整体结构
实现结果
(根据用户id查询用户所发布的文章)
实现步骤
- 引入整个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>
- 配置文件
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
- 新建数据库 (建了一个用户表和文章表模拟实战常见)
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 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);
}
}
- 新建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就可看到已经有的接口, 在左边输入需要查询的字段点击最上面运行图标就可以在右边空白看到结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)