Всем привет. 🤩 Я пишу эту статью, чтобы помочь вам создать динамическую схему GraphQL программно в виде кода java. Для этого мы в первую очередь будем использовать библиотеку graphql-java .
Схема GraphQL
GraphQL имеет свою систему типов, которая используется для определения схемы API. Синтаксис для написания схем называется Языком определения схем (SDL). Мы можем либо определить схему с помощью SDL, либо определить ее программно в виде кода java. Но оба они являются статическими способами представления. В случае, если вы создаете схему во время выполнения, становится трудно рекурсивно добавлять новые поля в ваше предопределенное определение.
Определение схемы SDL
type Customer {
name : String
address : String
contact : Int
}
Определение программной схемы
GraphQLObjectType.Builder graphQLObjectType = GraphQLObjectType.newObject();
graphQLObjectType.name("Customer")
.field(newFieldDefinition()
.name("name")
.type(Scalars.GraphQLString))
.field(newFieldDefinition()
.name("address")
.type(Scalars.GraphQLString))
.field(newFieldDefinition()
.name("conatct")
.type(Scalars.GraphQLInt)
.build();
Мы сосредоточимся на том, как извлечь метаданные источника данных, к которому вы подключаетесь. Метаданные характеризуют ваши данные и облегчают их понимание и использование любым пользователем. Проще говоря, метаданные – это данные, описывающие данные, которые хранятся в вашем источнике данных. Обычно он включает имя, размер и количество строк каждой таблицы, присутствующей в базе данных, а также столбцы в каждой таблице, их типы данных, точность и т.д.
Давайте начнем! 🚀
Для чтения и хранения метаданных базы данных мы будем использовать два интерфейса Данные базы данных и Набор результатов . Интерфейс DatabaseMetaData огромен, содержит сотни методов для чтения возможностей СУБД. Вы можете обратиться к Javadoc для получения полного списка методов.
Получение экземпляра DatabaseMetaData
Здесь я использую jdbc-url для Teiid , вы также можете выбрать другие. Мы получаем объект DatabaseMetaData из объекта Подключения , например:
String URL = "jdbc:teiid:customer@mm://localhost:31000"; String USERNAME = "sa"; String PASSWORD = "sa"; Connection connection = DriverManager.getConnection(URL, USERNAME ,PASSWORD ); DatabaseMetaData databaseMetaData = connection.getMetaData();
Список Таблиц Базы данных
Мы можем получить список определенных таблиц в вашей базе данных или источнике данных с помощью DatabaseMetaData. Вот как это делается:
String table[] = {"TABLE"};
ResultSet resultSet = databaseMetaData.getTables(null,null,null,table);
ArrayList tables = new ArrayList();
while(resultSet.next()) {
tables.add(resultSet.getString("TABLE_NAME"));
}
Список Столбцов Базы данных
Мы можем получить столбцы таблицы с помощью объекта DatabaseMetaData таким образом:
ResultSet columns = databaseMetaData.getColumns(null,null, tableName, null);
while(columns.next()) {
String columnName = columns.getString("COLUMN_NAME");
String datatype = columns.getString("DATA_TYPE");
String columnsize = columns.getString("COLUMN_SIZE");
System.out.println(columnName + "---" + datatype + "---" + columnsize);
}
Создание схемы
Следующим шагом будет создание схемы с использованием объекта GraphQLObjectType , сохранение соответствующих метаданных в HashMap и считывание ее типа из класса ReturnType , определенного в следующем разделе.
ResultSet resultSet = databaseMetaData.getColumns(null, null, (String) tableName, null);
GraphQLObjectType objectType = null;
GraphQLObjectType.Builder graphQLObjectType = GraphQLObjectType.newObject();
System.out.println("-------Schema for Table " + tableName + "-------");
HashMap data = new HashMap<>();
while (resultSet.next()) {
data.put(resultSet.getString("COLUMN_NAME"), resultSet.getString("TYPE_NAME"));
for (Map.Entry hm : data.entrySet()) {
graphQLObjectType
.name(tableName)
.field(GraphQLFieldDefinition.newFieldDefinition()
.name(hm.getKey())
.type(ReturnType(hm.getValue())));
objectType = graphQLObjectType.build();
}
}
Определение типа поля в схеме
Этот класс возвращает тип поля в каждом случае, здесь я определил только два типа GraphQL Длинный и Графическая строка . Вы можете определить соответственно для других типов.
public static GraphQLScalarType ReturnType(String type) {
if(type.equals("long"))
return Scalars.GraphQLLong;
else if (type.equals("string"))
return Scalars.GraphQLString;
return null;
}
}
Схема построения и печати
Для печати схемы мы используем определенный способ Принтер схемы объект, который принимает объект типа GraphQLSchema.
GraphQLSchema graphQLSchema = GraphQLSchema.newSchema()
.query(objectType)
.build();
SchemaPrinter schemaPrinter = new SchemaPrinter();
String printer = schemaPrinter.print(graphQLSchema);
System.out.println(printer);
Вывод
Вот оно у вас! Вы успешно подключились к источнику данных для извлечения метаданных базы данных и, используя данные, создали свою схему GraphQL.
Вы можете посетить репозиторий Github Конструктор схем для просмотра исходного кода. Также проверьте GraphQL Java веб-сайт, чтобы узнать больше.
Ты учишься. Я учусь. Мы все учимся. Давайте продолжим учиться и становиться лучше вместе. Спасибо. Приятного Чтения! 🎉
Вы можете связаться со мной по Твиттер и LinkedIn ❤️
Оригинал: “https://dev.to/anisha/how-to-create-graphql-schema-dynamically-353a”