Рубрики
Без рубрики

Как: Интегрировать базу данных MySQL в ваш сервис Java Spring Boot GraphQL

Учебное пособие по интеграции базы данных MySQL в простой сервис GraphQL в Java Spring Boot с использованием Spring Data JPA. Помечено новичками, graphql, java, mysql.

ПРИМЕЧАНИЕ: Пожалуйста, имейте в виду, что эта статья устарела, так как технология продвинулась с тех пор, как я написал ее в 2019 году.

В моей предыдущей статье “Как: Создавать сервисы GraphQL на Java с помощью Spring Boot” мы узнали, как начать работу с Java Spring Boot и библиотекой GraphQL-Tools. Мы создали простую конечную точку, которая возвращала жестко закодированный массив из одного элемента. Отличное начало всего с нескольких файлов, но это мало что дает, так что давайте добавим базу данных.

Если вы еще не читали первую статью, я бы посоветовал вам сделать так, как это заложено в основу этого урока. Я бы посоветовал пройти этот урок и написать код самостоятельно, так как для большинства людей это более эффективный способ учиться на практике.

Мы переходим к Spring Data JPA starter, который использует Java Persistence API для сохранения и извлечения ваших моделей сущностей в/из выбранной вами базы данных. Этот API предоставляет вам простой в использовании уровень абстракции, чтобы вы могли использовать любую из большого количества различных баз данных. Мы собираемся использовать MySQL так как это самая популярная база данных в мире.

Пред- реквизиты

Для этого руководства вам необходимо установить сервер и клиент MySQL. Вам понадобится привилегированный пользователь, который может создавать схему и пользователей. Если у вас этого нет, вам необходимо обратиться к администратору базы данных, чтобы выполнить первые три шага.

Безопасность

Пожалуйста, не используйте root в своем приложении, это ужасная проблема безопасности. Мы собираемся создать непривилегированного пользователя для использования с вашим приложением.

Не пытайтесь передавать эти учетные данные в git, потому что это опять же представляет угрозу безопасности. Я целенаправленно добавил файл в файл .gitignore чтобы ты случайно этого не сделал.

Если вы хотите выполнить развертывание на другом сервере, вам нужно вручную поместить файл туда. А еще лучше, потратьте время на понимание и создание автоматизированного конвейера сборки.

Вы никогда не должны использовать свой экземпляр производственной базы данных для разработки. Всегда имейте другой экземпляр локально на вашем компьютере.

Наконец, используйте разные учетные данные для локальной и производственной среды.

Настройка MySQL

Прежде всего, как пользователь root или предпочтительно администратор, войдите в mysql в командной строке:

mysql -uYOUR_PRIVILEGED_USER -p

Затем он запросит ваш пароль. Как только вы войдете в командную строку MySQL, создайте схему:

CREATE SCHEMA `graphql_tutorial` DEFAULT COLLATE=`utf8_bin` DEFAULT CHARACTER SET=`utf8`;

А затем создайте пользователя с доступом к этой схеме:

GRANT ALL PRIVILEGES ON `graphql_tutorial`.* TO `graphql_tutorial_user`@`localhost` IDENTIFIED BY 'CHANGE_ME_TO_SOMETHING_SECURE';

Наконец, создайте нужную нам таблицу:

CREATE TABLE `pets` (`id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) DEFAULT NULL, `age` TINYINT(3) DEFAULT NULL, `type` ENUM('DOG','CAT','BADGER','MAMMOTH'), PRIMARY KEY(`id`));

Давайте создадим несколько записей в таблице, чтобы нам было что извлекать:

INSERT INTO `pets` (`name`,`age`,`type`) VALUES ('Steve', 5, 'BADGER'), ('Jeff', 88, 'MAMMOTH'), ('Oscar', 2, 'CAT');

Теперь давайте проверим, все ли там есть:

SELECT * FROM pets;

Это должно показать следующий результат:

+----+-------+------+---------+
| id | name  | age  | type    |
+----+-------+------+---------+
|  1 | Steve |    5 | BADGER  |
|  2 | Jeff  |   88 | MAMMOTH |
|  3 | Oscar |    2 | CAT     |
+----+-------+------+---------+
3 rows in set (0.00 sec)

Отлично, вот и вся настройка MySQL выполнена! Введите “выход” и нажмите enter, чтобы выйти из MySQL и вернуться в командную строку.

Весенние данные JPA

Теперь нам нужно добавить проект Spring Data JPA в наше приложение. Добавьте эти строки в свой pom.xml в разделе <зависимости> :


    org.springframework.boot
    spring-boot-starter-data-jpa


    mysql
    mysql-connector-java

Затем запустите установку:

mvn install

Теперь нам нужно сообщить нашему приложению, как подключиться к нашей базе данных. Если вы проверили репозиторий github, скопируйте файл application.properties.example в application.properties и добавьте свой собственный URL-адрес и учетные данные. Если вы этого не сделали, создайте этот файл:

src/main/resources/application.properties

И поместите в это содержимое

spring.datasource.url=jdbc:mysql://localhost:3306/graphql_tutorial
spring.datasource.username=graphql_tutorial_user
spring.datasource.password=ThePasswordYouCreatedAbove

Это настраивает наш URL-адрес подключения, имя пользователя и пароль для Spring Data для подключения к вашему экземпляру базы данных.

Теперь создайте эту папку для хранения нашего репозитория:

src/main/java/uk/co/benskin/graphql_spring_boot_tutorial/repositories

Хранилище действует как наш интерфейс между экземпляром модели домашних животных и таблицей базы данных. Я следую соглашению о множественном числе имен таблиц базы данных, относящихся к модели сущностей. Итак, таблица “домашние животные” для модели сущности “Домашнее животное”. Нам нужно будет определить это в сущности, так как по умолчанию используется только имя таблицы “домашнее животное”.

Создайте этот файл

src/main/java/uk/co/benskin/graphql_spring_boot_tutorial/repositories/PetRepository.java

Затем добавьте это содержимое:

package uk.co.benskin.graphql_spring_boot_tutorial.repositories;

import org.springframework.data.repository.CrudRepository;
import uk.co.benskin.graphql_spring_boot_tutorial.entities.Pet;

public interface PetRepository extends CrudRepository {}

Если вы никогда раньше не видели классы Spring Data JPA, вы, вероятно, подумаете: “Это все?” и да, это все, что вам нужно для создания, чтения, обновления и удаления ваших сущностей в базе данных. Исчез весь тот шаблонный код, который вам приходилось писать в прошлом, блестяще, а?!

Теперь вернитесь к нашей любимой модели сущностей и добавьте аннотации @Entity, @Table, @id, @GeneratedValue и @Enumerated, как показано ниже, а также их импорт. Ваш файл должен выглядеть так, как показано ниже:

package uk.co.benskin.graphql_spring_boot_tutorial.entities;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;
import uk.co.benskin.graphql_spring_boot_tutorial.enums.Animal;

@Data
@Entity
@Table(name="pets")
public class Pet {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    private String name;

    @Enumerated(EnumType.STRING)
    private Animal type;

    private int age;
}

Отлично! Эти аннотации сообщают Spring Data JPA, что он может сохранить эту сущность в базе данных. Нам нужно сообщить spring data, что наше перечисление является строкой, иначе оно по умолчанию будет считать, что это целое число.

Наконец, нам нужно обновить наш распознаватель запросов GraphQL в Query.java от жестко запрограммированного массива до извлечения всех домашних животных из хранилища. Замените содержимое файла следующим:

package uk.co.benskin.graphql_spring_boot_tutorial.resolvers;

import com.coxautodev.graphql.tools.GraphQLQueryResolver;
import org.springframework.stereotype.Component;

import lombok.RequiredArgsConstructor;
import uk.co.benskin.graphql_spring_boot_tutorial.entities.Pet;
import uk.co.benskin.graphql_spring_boot_tutorial.repositories.PetRepository;

@Component
@RequiredArgsConstructor
public class Query implements GraphQLQueryResolver {

    private final PetRepository PetRepository;

    public Iterable pets() {
        return PetRepository.findAll();
    }
}

Вот и все! Теперь снова запустите свое приложение:

mvn spring-boot:start

Перейдите к http://localhost:8080/graphiql и вы снова должны увидеть графический интерфейс.

Выполните этот запрос:

{
    pets {
        name,
        age,
        type
    }
}

Вы должны увидеть этот результат:

{
  "data": {
    "pets": [
      {
        "name": "Steve",
        "age": 5,
        "type": "BADGER"
      },
      {
        "name": "Jeff",
        "age": 88,
        "type": "MAMMOTH"
      },
      {
        "name": "Oscar",
        "age": 2,
        "type": "CAT"
      }
    ]
  }
}

Поздравляем, теперь вы считываете все свои данные из базы данных!

Большое вам спасибо за чтение этой статьи! Если вам понравилось, пожалуйста, прокомментируйте, дайте мне знать, или если у вас есть какие-либо предложения по улучшению. Пожалуйста, нажмите на кнопки сердца/единорога/закладки ниже, я всегда очень ценю это:)

Оригинал: “https://dev.to/sambenskin/howto-integrate-a-mysql-database-into-your-java-spring-boot-graphql-service-26c”