Использование JPA Spring Data с Базой данных Azure для MySQL

В этом руководстве показано, как хранить данные в базе данных База данных Azure для MySQL с помощью Spring Data JPA.

Java Persistence API (JPA) — это стандартный API Java для объектно-реляционного сопоставления.

В этом руководстве мы рассмотрим два метода проверки подлинности: проверку подлинности Microsoft Entra и проверку подлинности MySQL. На вкладке "Без пароля" показана проверка подлинности Microsoft Entra, а на вкладке "Пароль " отображается проверка подлинности MySQL.

Проверка подлинности Microsoft Entra — это механизм подключения к База данных Azure для MySQL с помощью удостоверений, определенных в идентификаторе Microsoft Entra. С помощью проверки подлинности Microsoft Entra можно управлять удостоверениями пользователей базы данных и другими службы Майкрософт в центральном расположении, что упрощает управление разрешениями.

Проверка подлинности MySQL использует учетные записи, хранящиеся в MySQL. Если вы решили использовать пароли в качестве учетных данных для учетных записей, эти учетные данные будут храниться в user таблице. Так как эти пароли хранятся в MySQL, вам нужно самостоятельно управлять сменой паролей.

Необходимые компоненты

  • Клиент командной строки MySQL.

  • Если у вас нет приложения Spring Boot, создайте проект Maven с помощью Spring Initializr. Обязательно выберите Проект Maven и в разделе "Зависимости" добавьте зависимости Spring Web, Spring Data JPA и MySQL Driver , а затем выберите Java версии 8 или более поздней.

Внимание

Чтобы использовать бессерверные подключения, создайте пользователя администратора Microsoft Entra для вашего База данных Azure для MySQL экземпляра. Инструкции см. в разделе "Настройка microsoft Entra Администратор" настройки проверки подлинности Microsoft Entra для База данных Azure для MySQL — гибкий сервер.

См. пример приложения

В этом руководстве вы закодируем пример приложения. Если вы хотите ускорить работу, готовое приложение доступно здесь: https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql.

Настройка правила брандмауэра для сервера MySQL

Экземпляры Базы данных Azure для MySQL по умолчанию защищены. В них включен брандмауэр, который блокирует все входящие подключения.

Чтобы использовать базу данных, откройте брандмауэр сервера, чтобы разрешить локальный IP-адрес для доступа к серверу базы данных. Дополнительные сведения см. в статье "Управление правилами брандмауэра для База данных Azure для MySQL — гибкий сервер с помощью портал Azure".

Если вы подключаетесь к серверу MySQL из подсистема Windows для Linux (WSL) на компьютере Windows, необходимо добавить IP-адрес узла WSL в брандмауэр.

Создание пользователя, отличного от администратора MySQL, и предоставление разрешений

На этом шаге будет создан пользователь, отличный от администратора, и предоставят ему все разрешения для demo базы данных.

Для создания пользователя без пароля можно использовать следующий метод.

  1. Используйте следующую команду, чтобы установить расширение service Подключение or без пароля для Azure CLI:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. Используйте следующую команду, чтобы создать пользователя, отличного от администратора Microsoft Entra:

      az connection create mysql-flexible \
           --resource-group <your_resource_group_name> \
           --connection mysql_conn \
           --target-resource-group <your_resource_group_name> \
           --server mysqlflexibletest \
           --database demo \
           --user-account mysql-identity-id=/subscriptions/<your_subscription_id>/resourcegroups/<your_resource_group_name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<your_user_assigned_managed_identity_name> \
           --query authInfo.userName \
           --output tsv
    

    Когда команда завершится, запишите имя пользователя в выходных данных консоли.

Хранение данных из База данных Azure для MySQL

Теперь, когда у вас есть База данных Azure для MySQL гибкий экземпляр сервера, можно хранить данные с помощью Spring Cloud Azure.

Чтобы установить модуль Azure Starter JDBC MySQL Spring Cloud, добавьте следующие зависимости в файл pom.xml :

  • Выставление счетов за материалы Spring Cloud (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.11.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Примечание.

    Если вы используете Spring Boot 2.x, обязательно установите для нее spring-cloud-azure-dependencies значение 4.17.0. Этот счет материалов (BOM) должен быть настроен в <dependencyManagement> разделе pom.xml файла. Это гарантирует, что все зависимости Azure Spring Cloud используют одну и ту же версию. Дополнительные сведения о версии, используемой для этого BOM, см. в статье "Какая версия Spring Cloud Azure должна использоваться".

  • Артефакт Azure Starter JDBC MySQL Spring Cloud:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>
    </dependency>
    

Примечание.

С версии 4.5.0поддерживаются бессерверные подключения.

Настройка Spring Boot для использования Базы данных Azure для MySQL

Чтобы сохранить данные из База данных Azure для MySQL с помощью Spring Data JPA, выполните следующие действия, чтобы настроить приложение:

  1. Настройте учетные данные База данных Azure для MySQL, добавив следующие свойства в файл конфигурации application.properties.

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.datasource.azure.passwordless-enabled=true
    spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC
    spring.datasource.username=<your_mysql_ad_non_admin_username>
    
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect
    

    Предупреждение

    Свойство spring.datasource.url конфигурации добавлено ?serverTimezone=UTC , чтобы сообщить драйверу JDBC использовать формат даты UTC (или универсальное время координированного времени) при подключении к базе данных. Без этого параметра сервер Java не будет использовать тот же формат даты, что и база данных, что приведет к ошибке.

Внимание

Чтобы использовать бессерверные подключения, создайте пользователя администратора Microsoft Entra для вашего База данных Azure для MySQL экземпляра. Инструкции см. в разделе "Настройка microsoft Entra Администратор пользователя" в разделе "Использование идентификатора записи Майкрософт для проверки подлинности с помощью MySQL".

См. пример приложения

В этой статье вы закодируем пример приложения. Если вы хотите ускорить работу, готовое приложение доступно здесь: https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql.

Настройка правила брандмауэра для сервера MySQL

Экземпляры Базы данных Azure для MySQL по умолчанию защищены. В них включен брандмауэр, который блокирует все входящие подключения.

Чтобы использовать базу данных, откройте брандмауэр сервера, чтобы разрешить локальный IP-адрес для доступа к серверу базы данных. Дополнительные сведения см. в статье "Создание правил брандмауэра База данных Azure для MySQL и управление ими с помощью портал Azure".

Если вы подключаетесь к серверу MySQL из подсистема Windows для Linux (WSL) на компьютере Windows, необходимо добавить IP-адрес узла WSL в брандмауэр.

Создание пользователя, отличного от администратора MySQL, и предоставление разрешений

На этом шаге будет создан пользователь, отличный от администратора, и предоставят ему все разрешения для demo базы данных.

Внимание

Чтобы использовать бессерверные подключения, создайте пользователя администратора Microsoft Entra для вашего База данных Azure для MySQL экземпляра. Дополнительные сведения см. в разделе "Настройка Microsoft Entra Администратор пользователя" в разделе "Использование идентификатора Microsoft Entra для проверки подлинности с помощью MySQL".

Создайте скрипт SQL с именем create_ad_user.sql для создания пользователя без администратора. Добавьте следующее содержимое и сохраните его локально:

export AZ_MYSQL_AD_NON_ADMIN_USERID=$(az ad signed-in-user show --query id --output tsv)

cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '<your_mysql_ad_non_admin_username>' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';
GRANT ALL PRIVILEGES ON demo.* TO '<your_mysql_ad_non_admin_username>'@'%';
FLUSH privileges;
EOF

Затем выполните следующую команду, чтобы запустить скрипт SQL для создания пользователя, отличного от администратора Microsoft Entra:

mysql -h mysqlsingletest.mysql.database.azure.com --user <your_mysql_ad_admin_username>@mysqlsingletest --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql

Совет

Чтобы использовать проверку подлинности Microsoft Entra для подключения к База данных Azure для MySQL, необходимо войти с помощью настроенного пользователя администратора Microsoft Entra, а затем получить маркер доступа в качестве пароля. Дополнительные сведения см. в разделе "Использование идентификатора Microsoft Entra для проверки подлинности с помощью MySQL".

Хранение данных из База данных Azure для MySQL

Теперь, когда у вас есть экземпляр одного сервера База данных Azure для MySQL, данные можно хранить с помощью Spring Cloud Azure.

Чтобы установить модуль Azure Starter JDBC MySQL Spring Cloud, добавьте следующие зависимости в файл pom.xml :

  • Выставление счетов за материалы Spring Cloud (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.11.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Примечание.

    Если вы используете Spring Boot 2.x, обязательно установите для нее spring-cloud-azure-dependencies значение 4.17.0. Этот счет материалов (BOM) должен быть настроен в <dependencyManagement> разделе pom.xml файла. Это гарантирует, что все зависимости Azure Spring Cloud используют одну и ту же версию. Дополнительные сведения о версии, используемой для этого BOM, см. в статье "Какая версия Spring Cloud Azure должна использоваться".

  • Артефакт Azure Starter JDBC MySQL Spring Cloud:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>
    </dependency>
    

Примечание.

С версии 4.5.0поддерживаются бессерверные подключения.

Настройка Spring Boot для использования Базы данных Azure для MySQL

Чтобы сохранить данные из База данных Azure для MySQL с помощью Spring Data JPA, выполните следующие действия, чтобы настроить приложение:

  1. Настройте учетные данные База данных Azure для MySQL, добавив следующие свойства в файл конфигурации application.properties.

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.datasource.azure.passwordless-enabled=true
    spring.datasource.url=jdbc:mysql://mysqlsingletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC
    spring.datasource.username=<your_mysql_ad_non_admin_username>@mysqlsingletest
    
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect
    

    Предупреждение

    Свойство spring.datasource.url конфигурации добавлено ?serverTimezone=UTC , чтобы сообщить драйверу JDBC использовать формат даты UTC (или универсальное время координированного времени) при подключении к базе данных. Без этого параметра сервер Java не будет использовать тот же формат даты, что и база данных, что приведет к ошибке.

  1. Создайте новый Todo класс Java. Этот класс представляет собой модель домена, сопоставленную с таблицей todo , которая будет автоматически создана JPA. Следующий код игнорирует getters методы и setters методы.

    package com.example.demo;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity
    public class Todo {
    
        public Todo() {
        }
    
        public Todo(String description, String details, boolean done) {
            this.description = description;
            this.details = details;
            this.done = done;
        }
    
        @Id
        @GeneratedValue
        private Long id;
    
        private String description;
    
        private String details;
    
        private boolean done;
    
    }
    
  2. Измените файл класса запуска, чтобы отобразить следующее содержимое.

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.event.ApplicationReadyEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.annotation.Bean;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @Bean
        ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) {
            return event->repository
                .saveAll(Stream.of("A", "B", "C").map(name->new Todo("configuration", "congratulations, you have set up correctly!", true)).collect(Collectors.toList()))
                .forEach(System.out::println);
        }
    
    }
    
    interface TodoRepository extends JpaRepository<Todo, Long> {
    
    }
    

    Совет

    В этом руководстве нет операций проверки подлинности в конфигурациях или коде. Однако для подключения к службам Azure требуется проверка подлинности. Чтобы завершить проверку подлинности, необходимо использовать удостоверение Azure. Spring Cloud Azure использует DefaultAzureCredentialбиблиотеку удостоверений Azure, чтобы получить учетные данные без каких-либо изменений кода.

    DefaultAzureCredential поддерживает несколько методов проверки подлинности и определяет, какой метод следует использовать во время выполнения. Этот подход позволяет приложению использовать различные методы проверки подлинности в разных средах (например, локальных и рабочих средах), не реализуя код, зависящий от среды. Дополнительные сведения см. в разделе DefaultAzureCredential.

    Для выполнения проверки подлинности в локальных средах разработки можно использовать Azure CLI, Visual Studio Code, PowerShell или другие методы. Дополнительные сведения см. в статье о проверке подлинности Azure в средах разработки Java. Чтобы завершить проверку подлинности в средах размещения Azure, рекомендуется использовать управляемое удостоверение, назначаемое пользователем. См. сведения об управляемых удостоверениях для ресурсов Azure.

  3. Запустите приложение. Вы увидите журналы, аналогичные следующему примеру:

    2023-02-01 10:29:19.763 DEBUG 4392 --- [main] org.hibernate.SQL : insert into todo (description, details, done, id) values (?, ?, ?, ?)
    com.example.demo.Todo@1f
    

Развертывание в Azure Spring Apps

Теперь, когда у вас есть приложение Spring Boot, работающее локально, пришло время переместить его в рабочую среду. Azure Spring Apps упрощает развертывание приложений Spring Boot в Azure без каких-либо изменений кода. Эта служба управляет инфраструктурой приложений Spring, благодаря чему разработчики могут сосредоточиться на коде. Azure Spring Apps обеспечивает управление жизненным циклом за счет комплексного мониторинга и диагностики, управления конфигурацией, обнаружения служб, интеграции CI/CD, выполнения сине-зеленых развертываний и прочего. Сведения о развертывании приложения в Azure Spring Apps см. в статье "Развертывание первого приложения в Azure Spring Apps".

Следующие шаги