zl程序教程

您现在的位置是:首页 >  Java

当前栏目

在Java中,graphql的使用方法

2023-04-18 16:29:18 时间

目录

graphql使用步骤

一、创建一个SpringBoot项目,并导入下方依赖

二、配置 application.properties文件

 三、在resources下创建graphql目录,并在graphql下创建三个.graphql文件(main.graphql , person.graphql , user.graphql)

 mani.graphql 中的内容

 person.graphql 中的内容

 user.graphql中的内容

四、 创建类

 1. 创建与下方图片相同的层级目录

2. Person类、Sex类和User类中代码

3. PersonFieldResolver类中代码

4. UserInput类和PersonInput类中的代码

5. MutationTest类、PersonMutation类和UserMutation类中的代码

6. PersonQuery类、QueryTest类、UserQuery类中代码

7.ScalarDate类中的代码

8.DemoApplication类中的代码

五、使用浏览器打开 http://127.0.0.1:8080/playground 网站 

 在左边编写指令获取数据 


  • graphql使用步骤

一、创建一个SpringBoot项目,并导入下方依赖

        <!--graphql-spring-boot-->
        <dependency>
            <groupId>com.graphql-java-kickstart</groupId>
            <artifactId>graphql-spring-boot-starter</artifactId>
            <version>11.0.0</version>
        </dependency>
        <!--playground-->
        <dependency>
            <groupId>com.graphql-java-kickstart</groupId>
            <artifactId>playground-spring-boot-starter</artifactId>
            <version>7.1.0</version>
            <scope>runtime</scope>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

二、配置 application.properties文件

graphql.tools.schema-location-pattern=./graphql/*.graphql
#设置http://127.0.0.1:8080/playground网页的颜色,dark为黑色,light为白色
graphql.playground.settings.editor.theme=light

 三、在resources下创建graphql目录,并在graphql下创建三个.graphql文件(main.graphql , person.graphql , user.graphql)

  •  mani.graphql 中的内容

#scalar用于自定一个数据类型
scalar Date

type Query {
    # ! 表示不能为空,[]表示为链表或数组
    events1 : [Date!]!
}

type Mutation{
    createEvents1(date:Date):Date
}

#可省略
schema {
    # query
    query: Query
    # mutation
    mutation: Mutation
}

#定义一个枚举类
# Sex 可为参数,也可为返回值
enum Sex{
    MALE
    FEMALE
}
  •  person.graphql 中的内容

# extend 表示继承,继续对 mian.qraphql 中 Query 的编写
extend type Query{
    personQuery1:Person
    personQuery2(id:String!):Person
}

# extend 表示继承,继续对 mian.qraphql 中 Mutation 的编写
extend type Mutation {
    createPerson(personInput:PersonInput):Person
}

# input 表示PersonInput只能作为为参数
# 且必须创建一个名字、参数都与这里定义相同的类
input PersonInput{
    name:String
    sex:Sex
    text:String
}

# type 表示Person不能作为为参数,可为返回值
# 且必须创建一个名字、参数都与这里定义相同的类
type Person{
    id:String
    name:String
    sex:Sex
    text:String
    user:User
    list:[String]
}
  •  user.graphql中的内容

# ! 表示不能为空
# extend 表示继承,继续对 mian.qraphql 中 Query 的编写
extend type Query{
    userQuery1:User
    userQuery2(id:ID!): User
}

# extend 表示继承,继续对 mian.qraphql 中 Mutation 的编写
extend type Mutation{
    createUser(UserInput:UserInput):User
}

# type 表示User不能作为为参数,可为返回值
# 且必须创建一个名字、参数都与这里定义相同的类
type User {
    id:String
    name:String
    sex:Sex
    text:String
}

# input 表示UserInput只能作为为参数
# 且必须创建一个名字、参数都与这里定义相同的类
input UserInput{
    name:String
    sex:Sex
    text:String
}

四、 创建类

 1. 创建与下方图片相同的层级目录

个人习惯,可以不同

2. Person类、Sex类和User类中代码

@Getter
public class Person {
    String id;
    String name;
    Sex sex;
    String text;
    @Setter
    User user;
    @Setter
    List<String> list;
    public Person(String id,String name,Sex sex,String text){
        this.id=id;
        this.name=name;
        this.sex=sex;
        this.text=text;
    }
}
public enum Sex {
    MALE("男"),FEMALE("女");
    Sex( String sex){
        this.sex=sex;
    }
    String sex;
}
@Getter
@AllArgsConstructor
public class User {
    String id;
    String name;
    Sex sex;
    String text;
}

3. PersonFieldResolver类中代码

/**
 * 该类用于给 Person类 的 user 和 list 添加数据
 * @author y
 */
@Component
public class PersonFieldResolver implements GraphQLResolver<Person> {
    /**
     * 该方法名要与Person类中User的变量名相同,且参数类型必须是Person
     */
    public User user(Person person){
        return new User("1","wjy", Sex.MALE,"yqy");
    }

    /**
     * 该方法名要与Person类中List<String>的变量名相同,且参数类型必须是Person
     */
    public List<String> list(Person person){
        return Arrays.asList("e","f","g");
    }

}

4. UserInput类和PersonInput类中的代码

@Getter
public class UserInput {
    String name;
    Sex sex;
    String text;
}
@Getter
public class PersonInput {
    String name;
    Sex sex;
    String text;
}

5. MutationTest类、PersonMutation类和UserMutation类中的代码

@Component
public class MutationTest implements GraphQLMutationResolver {
    /**
     * 方法名、传入参数类型、传入参数名、传出参数类型都需和 main.graphql文件中 type Mutation下的相同
     * @param date 前端传入的数据
     * @return  返回给前端的数据
     */
    public LocalDateTime createEvents1(LocalDateTime date){
        return date;
    }

}
@Component
public class PersonMutation implements GraphQLMutationResolver {
    
    static public Map<String, Person> map=new ConcurrentHashMap<>();
    /**
     * 方法名、传入参数类型、传入参数名、传出参数类型都需和 person.graphql文件中 extend type Mutation 下的相同
     * @param personInput 前端传入的数据
     * @return  返回给前端的数据
     */
    public Person createPerson(PersonInput personInput){
        Person person=new Person(UUID.randomUUID().toString(),personInput.getName(),personInput.getSex(),personInput.getText());
        map.put(person.getId(),person);
        System.out.println("Person map size:"+map.size());
        return person;
    }

}
@Component
public class UserMutation implements GraphQLMutationResolver {

    static public Map<String, User> map=new ConcurrentHashMap<>();
    /**
     * 方法名、传入参数类型、传入参数名、传出参数类型都需和 user.graphql文件中 extend type Mutation 下的相同
     * @param userInput 前端传入的数据
     * @return  返回给前端的数据
     */
    public User createUser(UserInput userInput){
        User user =new User(UUID.randomUUID().toString(),userInput.getName(),userInput.getSex(),userInput.getText());
        map.put(user.getId(), user);
        System.out.println("User map size:"+map.size());
        return user;
    }

}

6. PersonQuery类、QueryTest类、UserQuery类中代码

@Component
public class PersonQuery implements GraphQLQueryResolver {
    /**
     * 方法名、传入参数类型、传入参数名、传出参数类型都需和 person.graphql文件中 extend type query 下的相同
     * @return  返回给前端的数据
     */
    public Person personQuery1(){
        Person person=new Person(UUID.randomUUID().toString(),"xxx", Sex.MALE,"xxx");
        return person;
    }

    public Person personQuery2(String id){
        return PersonMutation.map.get(id);
    }
}
@Component
public class QueryTest implements GraphQLQueryResolver {
    /**
     * 方法名、传入参数类型、传入参数名、传出参数类型都需和 main.graphql文件中 type query 下的相同
     * @return  返回给前端的数据
     */
    public List<LocalDateTime> events1(){
        List<LocalDateTime> list= Arrays.asList(LocalDateTime.now(),LocalDateTime.now());
        return list;
    }

}
@Component
public class UserQuery implements GraphQLQueryResolver {
    /**
     * 方法名、传入参数类型、传入参数名、传出参数类型都需和 user.graphql文件中 extend type query 下的相同
     * @return  返回给前端的数据
     */
    public User userQuery1(){
        User user =new User("1","xxx", Sex.MALE,"xxx");
        return user;
    }

    public User userQuery2(String id){
        return UserMutation.map.get(id);
    }
}

7.ScalarDate类中的代码

@Component
public class ScalarDate extends GraphQLScalarType {
    public ScalarDate() {
        //第一个参数的值必须和 main.graphql 文件中 scalar 定义的相同,第二个可以随意起名
        super("Date", "日期", new Coercing() {
            /**
             * 当后端向前端发送 Date 类型数据时调用的方法,将数据转换为 String 型
             * o 可以强制转型为 LocalDateTime
             * 将 LocalDateTime 型的数据转换为 String 型再传给前端
             * @param o
             * @return 返回给前端的数据
             */
            @Override
            public String serialize(Object o) throws CoercingSerializeException {

                System.out.println("serialize-->"+(LocalDateTime)o);
                return o.toString();
            }

            @Override
            public LocalDateTime parseValue(Object o) throws CoercingParseValueException {
                StringValue string=(StringValue)o;
                System.out.println("parseLiteral-->"+string.getValue());
                System.out.println("parseLiteral-->"+string.toString());
                return LocalDateTime.parse(string.getValue());
            }

            /**
             * 当前端向后端传输 Date 类型数据时调用的方法,将数据转换为 LocalDateTime 型
             * 此时,o 不能强制转型为 LocalDateTime,只能转为 StringValue 型
             * @param o 前端传入的数据
             * @return 后端接受的数据
             */
            @Override
            public LocalDateTime parseLiteral(Object o) throws CoercingParseLiteralException {
                StringValue string=(StringValue)o;
                System.out.println("parseLiteral-->"+string.getValue());
                System.out.println("parseLiteral-->"+string.toString());
                return LocalDateTime.parse(string.getValue());
            }
        });
    }
}

8.DemoApplication类中的代码

@SpringBootApplication
public class DemoApplication {

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

    @Slf4j
    @Component
    @RequiredArgsConstructor
    private static class AppRunner implements ApplicationRunner {
        @Override
        public void run(ApplicationArguments args) {
            log.info("graphql playground: http://127.0.0.1:{}/playground", "8080");
        }
    }

}

五、使用浏览器打开 http://127.0.0.1:8080/playground 网站 

 在左边编写指令获取数据 

 自己记录的一些笔记,内容如有不对请指正