Utiliser Spring Data JPA avec Azure Database pour MySQL

Ce tutoriel montre comment stocker des données dans Azure Database pour MySQL base de données à l’aide de Spring Data JPA.

L’API de persistance Java (JPA) est l’API Java standard pour le mappage objet-relationnel.

Dans ce tutoriel, nous incluons deux méthodes d’authentification : l’authentification Microsoft Entra et l’authentification MySQL. L’onglet Sans mot de passe affiche l’authentification Microsoft Entra et l’onglet Mot de passe l’authentification MySQL.

L’authentification Microsoft Entra est un mécanisme de connexion à Azure Database pour MySQL à l’aide des identités définies dans Microsoft Entra ID. Avec l’authentification Microsoft Entra, vous pouvez gérer les identités des utilisateurs de base de données et d’autres services Microsoft dans un emplacement centralisé, ce qui simplifie la gestion des autorisations.

L’authentification MySQL utilise des comptes stockés dans MySQL. Si vous choisissez d’utiliser des mots de passe comme informations d’identification pour les comptes, ces informations d’identification sont stockées dans la table user. Étant donné que ces mots de passe sont stockés dans MySQL, vous devez gérer la rotation des mots de passe par vous-même.

Prérequis

  • Client de ligne de commande MySQL.

  • Si vous n’avez pas d’application Spring Boot, créez un projet Maven avec Spring Initializr. Veillez à sélectionner Maven Project et, sous Dépendances, ajoutez les dépendances Spring Web, Spring Data JPA et MySQL Driver, puis sélectionnez Java version 8 ou ultérieure.

Important

Pour utiliser des connexions sans mot de passe, créez un utilisateur administrateur Microsoft Entra pour votre instance de Azure Database pour MySQL. Pour obtenir des instructions, consultez la section Configurer microsoft Entra Administration de Configurer l’authentification Microsoft Entra pour Azure Database pour MySQL - Serveur flexible.

Voir l’exemple d’application

Dans ce tutoriel, vous allez coder un exemple d’application. Si vous souhaitez aller plus vite, cette application est déjà codée et disponible sur https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql.

Configurer une règle de pare-feu pour votre serveur MySQL

Les instances Azure Database pour MySQL sont sécurisées par défaut. Elles ont un pare-feu qui n’autorise aucune connexion entrante.

Pour pouvoir utiliser votre base de données, ouvrez le pare-feu du serveur pour autoriser l’adresse IP locale à accéder au serveur de base de données. Pour plus d’informations, consultez Gérer les règles de pare-feu pour Azure Database pour MySQL - Serveur flexible à l’aide du Portail Azure.

Si vous vous connectez à votre serveur MySQL à partir de Sous-système Windows pour Linux (WSL) sur un ordinateur Windows, vous devez ajouter l’adresse IP de l’hôte WSL à votre pare-feu.

Créer un utilisateur non-administrateur MySQL et accorder des autorisations

Cette étape crée un utilisateur non administrateur et lui accorde toutes les autorisations sur la demo base de données.

Vous pouvez utiliser la méthode suivante pour créer un utilisateur non administrateur qui utilise une connexion sans mot de passe.

  1. Utilisez la commande suivante pour installer l’extension sans mot de passe du service Connecter or pour Azure CLI :

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. Utilisez la commande suivante pour créer l’utilisateur non administrateur 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
    

    Une fois la commande terminée, notez le nom d’utilisateur dans la sortie de la console.

Stocker des données à partir de Azure Database pour MySQL

Maintenant que vous disposez d’une instance de serveur flexible Azure Database pour MySQL, vous pouvez stocker des données à l’aide de Spring Cloud Azure.

Pour installer le module Spring Cloud Azure Starter JDBC MySQL, ajoutez les dépendances suivantes à votre fichier pom.xml :

  • The Spring Cloud Azure Bill of Materials (BOM) :

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

    Remarque

    Si vous utilisez Spring Boot 2.x, veillez à définir la spring-cloud-azure-dependencies version 4.16.0sur . Cette facture de matériel (BOM) doit être configurée dans la <dependencyManagement> section de votre fichier pom.xml . Cela garantit que toutes les dépendances Azure Spring Cloud utilisent la même version. Pour plus d’informations sur la version utilisée pour ce boM, consultez La version de Spring Cloud Azure à utiliser.

  • Artefact JDBC MySQL Spring Cloud Azure Starter :

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

Remarque

Les connexions sans mot de passe ont été prises en charge depuis la version 4.5.0.

Configurer Spring Boot pour qu’il utilise Azure Database pour MySQL

Pour stocker des données à partir de Azure Database pour MySQL à l’aide de Spring Data JPA, procédez comme suit pour configurer l’application :

  1. Configurez Azure Database pour MySQL informations d’identification en ajoutant les propriétés suivantes à votre fichier de configuration 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
    

    Avertissement

    ?serverTimezone=UTC a été ajouté à la propriété de configuration spring.datasource.url pour indiquer au pilote JDBC d’utiliser le format de date UTC (Coordinated Universal Time) lors de la connexion à la base de données. Sans ce paramètre, votre serveur Java n’utilise pas le même format de date que la base de données, ce qui entraînerait une erreur.

Important

Pour utiliser des connexions sans mot de passe, créez un utilisateur administrateur Microsoft Entra pour votre instance de Azure Database pour MySQL. Pour obtenir des instructions, consultez la section Définition de l’utilisateur Microsoft Entra Administration d’Utiliser Microsoft Entra ID pour l’authentification avec MySQL.

Voir l’exemple d’application

Dans cet article, vous allez coder un exemple d’application. Si vous souhaitez aller plus vite, cette application est déjà codée et disponible sur https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql.

Configurer une règle de pare-feu pour votre serveur MySQL

Les instances Azure Database pour MySQL sont sécurisées par défaut. Elles ont un pare-feu qui n’autorise aucune connexion entrante.

Pour pouvoir utiliser votre base de données, ouvrez le pare-feu du serveur pour autoriser l’adresse IP locale à accéder au serveur de base de données. Pour plus d’informations, consultez Créer et gérer des règles de pare-feu Azure Database pour MySQL à l’aide du Portail Azure.

Si vous vous connectez à votre serveur MySQL à partir de Sous-système Windows pour Linux (WSL) sur un ordinateur Windows, vous devez ajouter l’adresse IP de l’hôte WSL à votre pare-feu.

Créer un utilisateur non-administrateur MySQL et accorder des autorisations

Cette étape crée un utilisateur non administrateur et lui accorde toutes les autorisations sur la demo base de données.

Important

Pour utiliser des connexions sans mot de passe, créez un utilisateur administrateur Microsoft Entra pour votre instance de Azure Database pour MySQL. Pour plus d’informations, consultez la section Définition de l’utilisateur Microsoft Entra Administration d’Utiliser Microsoft Entra ID pour l’authentification avec MySQL.

Créez un script SQL appelé create_ad_user.sql pour créer un utilisateur non administrateur. Ajoutez le contenu suivant et enregistrez-le localement :

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

Utilisez ensuite la commande suivante pour exécuter le script SQL pour créer l’utilisateur non administrateur 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

Conseil

Pour utiliser l’authentification Microsoft Entra pour vous connecter à Azure Database pour MySQL, vous devez vous connecter avec l’utilisateur administrateur Microsoft Entra que vous avez configuré, puis obtenir le jeton d’accès en tant que mot de passe. Pour plus d’informations, consultez Utiliser l’ID Microsoft Entra pour l’authentification avec MySQL.

Stocker des données à partir de Azure Database pour MySQL

Maintenant que vous disposez d’une instance de serveur unique Azure Database pour MySQL, vous pouvez stocker des données à l’aide de Spring Cloud Azure.

Pour installer le module Spring Cloud Azure Starter JDBC MySQL, ajoutez les dépendances suivantes à votre fichier pom.xml :

  • The Spring Cloud Azure Bill of Materials (BOM) :

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

    Remarque

    Si vous utilisez Spring Boot 2.x, veillez à définir la spring-cloud-azure-dependencies version 4.16.0sur . Cette facture de matériel (BOM) doit être configurée dans la <dependencyManagement> section de votre fichier pom.xml . Cela garantit que toutes les dépendances Azure Spring Cloud utilisent la même version. Pour plus d’informations sur la version utilisée pour ce boM, consultez La version de Spring Cloud Azure à utiliser.

  • Artefact JDBC MySQL Spring Cloud Azure Starter :

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

Remarque

Les connexions sans mot de passe ont été prises en charge depuis la version 4.5.0.

Configurer Spring Boot pour qu’il utilise Azure Database pour MySQL

Pour stocker des données à partir de Azure Database pour MySQL à l’aide de Spring Data JPA, procédez comme suit pour configurer l’application :

  1. Configurez Azure Database pour MySQL informations d’identification en ajoutant les propriétés suivantes à votre fichier de configuration 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
    

    Avertissement

    ?serverTimezone=UTC a été ajouté à la propriété de configuration spring.datasource.url pour indiquer au pilote JDBC d’utiliser le format de date UTC (Coordinated Universal Time) lors de la connexion à la base de données. Sans ce paramètre, votre serveur Java n’utilise pas le même format de date que la base de données, ce qui entraînerait une erreur.

  1. Créez une Todo classe Java. Cette classe est un modèle de domaine mappé sur la todo table qui sera créée automatiquement par JPA. Le code suivant ignore les méthodes et setters les getters méthodes.

    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. Modifiez le fichier de classe de démarrage pour afficher le contenu suivant.

    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> {
    
    }
    

    Conseil

    Dans ce tutoriel, il n’existe aucune opération d’authentification dans les configurations ou le code. Toutefois, la connexion aux services Azure nécessite une authentification. Pour effectuer l’authentification, vous devez utiliser Identité Azure. Spring Cloud Azure utilise DefaultAzureCredential, que la bibliothèque d’identités Azure fournit pour vous aider à obtenir des informations d’identification sans aucune modification du code.

    DefaultAzureCredential prend en charge plusieurs méthodes d’authentification et détermine quelle méthode doit être utilisée au moment de l’exécution. Cette approche permet à votre application d’utiliser différentes méthodes d’authentification dans différents environnements (tels que les environnements locaux et de production) sans implémenter de code spécifique à l’environnement. Pour plus d’informations, consultez DefaultAzureCredential.

    Pour terminer l’authentification dans les environnements de développement locaux, vous pouvez utiliser Azure CLI, Visual Studio Code, PowerShell ou d’autres méthodes. Pour plus d’informations, consultez l’authentification Azure dans les environnements de développement Java. Pour terminer l’authentification dans les environnements d’hébergement Azure, nous vous recommandons d’utiliser l’identité managée affectée par l’utilisateur. Pour plus d’informations, consultez Que sont les identités managées pour les ressources Azure ?

  3. Lancez l’application. Vous verrez des journaux similaires à l’exemple suivant :

    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
    

Déployer sur Azure Spring Apps

Maintenant que vous disposez de l’application Spring Boot en cours d’exécution localement, il est temps de le déplacer en production. Azure Spring Apps facilite le déploiement d’applications Spring Boot sur Azure sans aucune modification de code. Le service gère l’infrastructure des applications Spring, ce qui permet aux développeurs de se concentrer sur leur code. Azure Spring Apps assure la gestion du cycle de vie en utilisant des outils complets, tels que la supervision et les diagnostics, la gestion des configurations, la découverte de services, l’intégration CI/CD, les déploiements bleus-verts, etc. Pour déployer votre application sur Azure Spring Apps, consultez Déployer votre première application sur Azure Spring Apps.

Étapes suivantes