Bootstrap

Spring Cloud + MyBatis Plus + GraphQL 完整示例

为了创建一个完整的Spring Cloud应用,结合MyBatis-Plus和GraphQL,构建一个简单的微服务项目。这个示例将包括以下几个部分:

- 创建Spring Boot子项目。
- 配置MyBatis-Plus以进行数据库操作。
- 集成GraphQL以提供查询接口。
- 我们将假设有一个简单的实体类Person,并为其创建CRUD操作和GraphQL查询。

1、创建Spring Boot子项目

1.1 配置POM,添加必要的依赖

  • 首先,我们需要创建一个新的Spring Boot项目,并添加必要的依赖项。以下是Maven pom.xml配置文件的内容:
          <!--graphql-->
        <dependency>
            <groupId>com.graphql-java-kickstart</groupId>
            <artifactId>graphql-spring-boot-starter</artifactId>
            <version>11.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.graphql-java-kickstart</groupId>
            <artifactId>graphiql-spring-boot-starter</artifactId>
            <version>11.0.0</version>
        </dependency>
          <!--mybatisPlus&mysql-->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.4.1</version>
        </dependency>

1.2 配置MyBatis-Plus

  • 接下来,我们配置MyBatis-Plus来处理我们的数据访问层。首先,定义一个Person实体类:
package com.springboot.demo.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;


/**
 * 用户表
 *
 * @author water
 * @version 1.0.0
 * @date 2024-12-04 17:45
 */
@Data
@TableName("demo_person")
public class Person {

    private Long id;

    private String name;

    private int age;

}

  • 然后,创建对应的Mapper接口:
package com.springboot.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.springboot.demo.domain.Person;

/**
 * @author water
 * @version 1.0.0
 * @date 2024-12-05 08:11
 */
public interface PersonMapper extends BaseMapper<Person> {
}

  • 最后,在Spring Boot主类上启用MyBatis-Plus扫描器:
package com.springboot.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * springboot -demo
 *
 * @Author: water
 * @Date: 2024/12/4 18:09
 * @Version : 1.0.0
 */
@SpringBootApplication
@MapperScan("com.springboot.demo.mapper")
@EnableDiscoveryClient
@EnableFeignClients
public class SpringbootDemoApp {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootDemoApp.class, args);
    }

}

  • 同时,配置application.yml文件来设置数据库连接信息:
spring:
  profiles:
    active: cloud
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/spring-dmeo?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
    username: demo
    password: Spring@demo24
    hikari:
      maximum-pool-size: 10
      minimum-idle: 1
      idle-timeout: 30000
      max-lifetime: 1800000
  transaction:
    default-timeout: 30

  graphql:
    graphiql:
      enabled: true

#mybatis-plus
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.springboot.demo.**.domain
  configuration:
    map-underscore-to-camel-case: true
    # 默认日志输出: org.apache.ibatis.logging.slf4j.Slf4jImpl
    # 更详细的日志输出 会有性能损耗: org.apache.ibatis.logging.stdout.StdOutImpl
    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl #关闭日志记录 (可单纯使用 p6spy 分析)
    cache-enabled: false
    auto-mapping-behavior: full
  global-config:
    banner: false
    db-config:
      id-type: assign_id
      # 默认1删除
      logic-delete-value: 1
      # 正常0
      logic-not-delete-value: 0
#  日志
logging:
  level:
    com:
      example: debug
    org:
      springframework:
        security: debug
        security.access: debug
        security.web: debug
        security.web.access: debug
        web: debug

management:
  endpoints:
    web:
      exposure:
        include: health,info

2、集成GraphQL

2.1 定义schema.graphqls

接下来,我们集成GraphQL以暴露API供客户端查询使用。首先,创建一个GraphQL schema文件schema.graphqls:
# src/main/resources/schema.graphqls
type Query {
    users: [Person]
    personById(id: ID!): Person
}

type Mutation {
    addUser(name: String!, age: Int!): Person
    updateUser(id: ID!, name: String, age: Int): Person
    deleteUser(id: ID!): Boolean
}

type Person {
    id: ID!
    name: String!
    age: Int!
}

2.2 添加GraphQL解析器

  • 然后,为这些GraphQL查询和变更创建解析器:
package com.springboot.demo.resolver;

import com.springboot.demo.domain.Person;
import com.springboot.demo.mapper.PersonMapper;
import graphql.kickstart.tools.GraphQLMutationResolver;
import graphql.kickstart.tools.GraphQLQueryResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * GraphQL 查询创建解析器。
 *
 * @author water
 * @version 1.0.0
 * @date 2024-12-05 11:29
 */
@Component
public class UserQuery implements GraphQLQueryResolver, GraphQLMutationResolver {
    @Autowired
    private PersonMapper personMapper;


    public List<Person> users() {
        return personMapper.selectList(null);
    }

    public Person personById(String id) {
        personMapper.selectById(id);
        return personMapper.selectById(id);
    }

    public Person addUser(String name, int age) {
        Person user = new Person();
        user.setName(name);
        user.setAge(age);
        personMapper.insert(user);
        return user;
    }

    public Person updateUser(Long id, String name, Integer age) {
        Person user = personMapper.selectById(id);
        if (user != null) {
            if (name != null) {
                user.setName(name);
            }
            if (age != null) {
                user.setAge(age);
            }
            personMapper.updateById(user);
        }
        return user;
    }

    public boolean deleteUser(Long id) {
        return personMapper.deleteById(id) > 0;
    }

}

2.3 配置schame文件配置

  • 最后,配置GraphQL工具包以加载schema文件和其他相关配置:
package com.springboot.demo.config;

import graphql.schema.idl.SchemaParser;
import graphql.schema.idl.TypeDefinitionRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

/**
 * @author water
 * @version 1.0.0
 * @date 2024-12-05 14:30
 */
@Configuration
public class GraphQLConfig {
    @Bean
    public Resource graphQLSchemaFile() {
        return new ClassPathResource("schema.graphqls");
    }

    @Bean
    public TypeDefinitionRegistry typeDefinitionRegistry(Resource resource) throws Exception {
        SchemaParser parser = new SchemaParser();
        return parser.parse(resource.getInputStream());
    }
}

至此,我们就完成了一个整合了Spring Cloud、MyBatis-Plus和GraphQL的简单示例项目的搭建。 您可以启动应用程序并在浏览器中访问http://localhost:8080/graphiql来测试GraphQL API。
在这里插入图片描述

3、访问测试

  • 测试请求的脚本
# Welcome to GraphiQL
#
# GraphiQL is an in-browser tool for writing, validating, and
# testing GraphQL queries.
#
# Type queries into this side of the screen, and you will see intelligent
# typeaheads aware of the current GraphQL type schema and live syntax and
# validation errors highlighted within the text.
#
# GraphQL queries typically start with a "{" character. Lines that start
# with a # are ignored.
#
# An example GraphQL query might look like:
#
#     {
#       field(arg: "value") {
#         subField
#       }
#     }
#
# Keyboard shortcuts:
#
#  Prettify Query:  Shift-Ctrl-P (or press the prettify button above)
#
#     Merge Query:  Shift-Ctrl-M (or press the merge button above)
#
#       Run Query:  Ctrl-Enter (or press the play button above)
#
#   Auto Complete:  Ctrl-Space (or just start typing)
#
query select {
    personById(id:"1"){
        id
        name
        age
    }

}
query selectList {
    users{
        id
        name
        age
    }

}
mutation addUser{
    addUser(name:"王麻子", age:22){
      id
    	name
    	age
    }
}

mutation updateUser{
    updateUser(id:1864582448746012673,name:"钢蛋", age:31){
      id
    	name
    	age
    }
}

mutation updateUserById{
    updateUser(id:1864569571339378690,name:"赵六六"){
      id
    	name
    }
}

mutation deleteUser{
    deleteUser(id:1864582448746012673)
}

3.1 查询测试(演示)

  • 根据Id查询
    在这里插入图片描述
  • 查询所有
    在这里插入图片描述

3.2 添加测试(演示)

在这里插入图片描述

3.3 修改测试(演示)

在这里插入图片描述

3.4 删除测试(演示)

在这里插入图片描述

;