Condividi tramite


Usare Spring Data JDBC con Azure Database for MySQL

Questa esercitazione illustra come archiviare i dati nel database Azure Database for MySQL usando Spring Data JDBC.

JDBC è l'API standard Java per connettersi ai database relazionali tradizionali.

In questa esercitazione sono inclusi due metodi di autenticazione: l'autenticazione Microsoft Entra e l'autenticazione MySQL. La scheda Passwordless mostra l'autenticazione Microsoft Entra e la scheda Password mostra l'autenticazione mySQL.

Microsoft Entra autenticazione è un meccanismo per la connessione a Azure Database for MySQL usando le identità definite in Microsoft Entra ID. Con l'autenticazione Microsoft Entra, è possibile gestire le identità utente del database e altri servizi Microsoft in una posizione centrale, semplificando la gestione delle autorizzazioni.

L'autenticazione mySQL usa gli account archiviati in MySQL. Se si sceglie di usare password come credenziali per gli account, queste credenziali verranno archiviate nella tabella user. Poiché queste password vengono archiviate in MySQL, è necessario gestire manualmente la rotazione delle password.

Prerequisiti

  • client da riga di comando di MySQL.

  • Se non si ha un'applicazione Spring Boot, creare un progetto Maven con Spring Initializr. Assicurarsi di selezionare Maven Project e, in Dependencies aggiungere il Spring Web, Spring Data JDBC e MySQL Driver e quindi selezionare Java versione 8 o successiva.

Vedere l'applicazione di esempio

In questa esercitazione verrà codificata un'applicazione di esempio. Se si vuole andare più velocemente, questa applicazione è già codificata e disponibile in https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql.

Configurare una regola del firewall per il server MySQL

Azure Database for MySQL istanze sono protette per impostazione predefinita. Includono un firewall che non consente alcuna connessione in ingresso.

Per poter usare il database, aprire il firewall del server per consentire all'indirizzo IP locale di accedere al server di database. Per altre informazioni, vedere Gestire le regole del firewall per Azure Database for MySQL - Server flessibile tramite il portale di Azure.

Se ci si connette al server MySQL da Windows Subsystem for Linux (WSL) in un computer Windows, è necessario aggiungere l'indirizzo IP dell'host WSL al firewall.

Creare un utente non amministratore di MySQL e concedere l'autorizzazione

Questo passaggio creerà un utente non amministratore e concederà tutte le autorizzazioni per il demo database.

È possibile usare il metodo seguente per creare un utente non amministratore che usa una connessione senza password.

  1. Usare il comando seguente per installare Service Connector estensione senza password per l'Azure CLI:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. Usare il comando seguente per creare l'Microsoft Entra utente non amministratore:

      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
    

    Al termine del comando, prendere nota del nome utente nell'output della console.

Archiviare dati da Azure Database for MySQL

Ora che si dispone di un'istanza del server flessibile Azure Database for MySQL, è possibile archiviare i dati usando Spring Cloud Azure.

Per installare il modulo Spring Cloud Azure Starter JDBC MySQL, aggiungere le dipendenze seguenti al file pom.xml:

  • L'elenco dei materiali di Spring Cloud Azure (BOM):

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

    Nota

    Se si usa Spring Boot 4.0.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 7.1.0.

    Se si usa Spring Boot 3.5.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 6.1.0.

    Se si usa Spring Boot 3.1.x-3.5.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 5.25.0.

    Se si usa Spring Boot 2.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 4.20.0.

    Questo Bill of Material (BOM) deve essere configurato nella sezione <dependencyManagement> del file pom.xml. In questo modo, tutte le dipendenze di Spring Cloud Azure usano la stessa versione.

    Per ulteriori informazioni sulla versione utilizzata per questo BOM, vedere Quale versione di Spring Cloud Azure dovrei usare.

  • L'artefatto JDBC MySQL starter di Spring Cloud Azure:

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

Nota

Le connessioni senza password sono supportate dalla versione 4.5.0.

Configurare Spring Boot per l'uso di Azure Database for MySQL

Per archiviare dati da Azure Database for MySQL usando Spring Data JDBC, seguire questa procedura per configurare l'applicazione:

  1. Configura le credenziali di Azure Database for MySQL aggiungendo le seguenti proprietà al file di configurazione application.properties.

    logging.level.org.springframework.jdbc.core=DEBUG
    
    spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC
    spring.datasource.username=<your_mysql_ad_non_admin_username>
    spring.datasource.azure.passwordless-enabled=true
    
    spring.sql.init.mode=always
    

    Avviso

    La proprietà spring.sql.init.mode=always di configurazione indica che Spring Boot genererà automaticamente uno schema di database, usando il file schema.sql che verrà creato successivamente, ogni volta che il server viene avviato. Questa funzionalità è ideale per i test, ma tenere presente che eliminerà i dati a ogni riavvio, quindi non è consigliabile usarli nell'ambiente di produzione.

    Alla proprietà di configurazione spring.datasource.url viene aggiunto ?serverTimezone=UTC per indicare al driver JDBC di usare il formato di data UTC (o Coordinated Universal Time) durante la connessione al database. Senza questo parametro, il server Java non userà lo stesso formato di data del database, che genererebbe un errore.

Vedere l'applicazione di esempio

In questo articolo verrà codificata un'applicazione di esempio. Se si vuole andare più velocemente, questa applicazione è già codificata e disponibile in https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql.

Configurare una regola del firewall per il server MySQL

Azure Database for MySQL istanze sono protette per impostazione predefinita. Includono un firewall che non consente alcuna connessione in ingresso.

Per poter usare il database, aprire il firewall del server per consentire all'indirizzo IP locale di accedere al server di database. Per altre informazioni, vedere Creare e gestire le regole del firewall Azure Database for MySQL tramite il portale di Azure.

Se ci si connette al server MySQL da Windows Subsystem for Linux (WSL) in un computer Windows, è necessario aggiungere l'indirizzo IP dell'host WSL al firewall.

Creare un utente non amministratore di MySQL e concedere l'autorizzazione

Questo passaggio creerà un utente non amministratore e concederà tutte le autorizzazioni per il demo database.

Importante

Per usare connessioni senza password, creare un utente amministratore Microsoft Entra per l'istanza di Azure Database for MySQL. Per ulteriori informazioni, consultare la sezione Impostazione dell'utente amministratore di Microsoft Entra di Utilizzare Microsoft Entra ID per l'autenticazione con MySQL.

Creare uno script SQL denominato create_ad_user.sql per la creazione di un utente non amministratore. Aggiungi i contenuti seguenti e salvali localmente:

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

Usare quindi il comando seguente per eseguire lo script SQL per creare l'Microsoft Entra utente non amministratore:

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

Suggerimento

Per usare l'autenticazione Microsoft Entra per connettersi a Azure Database for MySQL, è necessario accedere con l'utente amministratore Microsoft Entra configurato e quindi ottenere il token di accesso come password. Per altre informazioni, vedere Usare Microsoft Entra ID per l'autenticazione con MySQL.

Archiviare dati da Azure Database for MySQL

Ora che si dispone di un'istanza di server singolo Azure Database for MySQL, è possibile archiviare i dati usando Spring Cloud Azure.

Per installare il modulo Spring Cloud Azure Starter JDBC MySQL, aggiungere le dipendenze seguenti al file pom.xml:

  • L'elenco dei materiali di Spring Cloud Azure (BOM):

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

    Nota

    Se si usa Spring Boot 4.0.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 7.1.0.

    Se si usa Spring Boot 3.5.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 6.1.0.

    Se si usa Spring Boot 3.1.x-3.5.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 5.25.0.

    Se si usa Spring Boot 2.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 4.20.0.

    Questo Bill of Material (BOM) deve essere configurato nella sezione <dependencyManagement> del file pom.xml. In questo modo, tutte le dipendenze di Spring Cloud Azure usano la stessa versione.

    Per ulteriori informazioni sulla versione utilizzata per questo BOM, vedere Quale versione di Spring Cloud Azure dovrei usare.

  • L'artefatto JDBC MySQL starter di Spring Cloud Azure:

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

Nota

Le connessioni senza password sono supportate dalla versione 4.5.0.

Configurare Spring Boot per l'uso di Azure Database for MySQL

Per archiviare dati da Azure Database for MySQL usando Spring Data JDBC, seguire questa procedura per configurare l'applicazione:

  1. Configura le credenziali di Azure Database for MySQL aggiungendo le seguenti proprietà al file di configurazione application.properties.

    logging.level.org.springframework.jdbc.core=DEBUG
    
    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.datasource.azure.passwordless-enabled=true
    
    spring.sql.init.mode=always
    

    Avviso

    La proprietà spring.sql.init.mode=always di configurazione indica che Spring Boot genererà automaticamente uno schema di database, usando il file schema.sql che verrà creato successivamente, ogni volta che il server viene avviato. Questa funzionalità è ideale per i test, ma tenere presente che eliminerà i dati a ogni riavvio, quindi non è consigliabile usarli nell'ambiente di produzione.

    Alla proprietà di configurazione spring.datasource.url viene aggiunto ?serverTimezone=UTC per indicare al driver JDBC di usare il formato di data UTC (o Coordinated Universal Time) durante la connessione al database. Senza questo parametro, il server Java non userà lo stesso formato di data del database, che genererebbe un errore.

  1. Creare il file di configurazione src/main/resources/schema.sql per configurare lo schema del database, quindi aggiungere il contenuto seguente.

    DROP TABLE IF EXISTS todo;
    CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
    
  1. Creare una nuova classe Todo Java. Questa classe è un modello di dominio mappato alla todo tabella che verrà creato automaticamente da Spring Boot. Il codice seguente ignora i getters metodi e setters .

    import org.springframework.data.annotation.Id;
    
    public class Todo {
    
        public Todo() {
        }
    
        public Todo(String description, String details, boolean done) {
            this.description = description;
            this.details = details;
            this.done = done;
        }
    
        @Id
        private Long id;
    
        private String description;
    
        private String details;
    
        private boolean done;
    
    }
    
  2. Modificare il file della classe di avvio per visualizzare il contenuto seguente.

    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.repository.CrudRepository;
    
    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)).toList())
                .forEach(System.out::println);
        }
    
    }
    
    interface TodoRepository extends CrudRepository<Todo, Long> {
    
    }
    

    Suggerimento

    In questa esercitazione non sono presenti operazioni di autenticazione nelle configurazioni o nel codice. Tuttavia, la connessione ai servizi di Azure richiede l'autenticazione. Per completare l'autenticazione, è necessario usare Azure Identity. Spring Cloud Azure usa DefaultAzureCredential, che la libreria di identità Azure fornisce per ottenere le credenziali senza modifiche al codice.

    DefaultAzureCredential supporta più metodi di autenticazione e determina il metodo da usare in fase di esecuzione. Questo approccio consente all'app di usare metodi di autenticazione diversi in ambienti diversi (ad esempio ambienti locali e di produzione) senza implementare codice specifico dell'ambiente. Per altre informazioni, vedere DefaultAzureCredential.

    Per completare l'autenticazione negli ambienti di sviluppo locali, è possibile usare Azure CLI, Visual Studio Code, PowerShell o altri metodi. Per altre informazioni, vedere autenticazione Azure in ambienti di sviluppo Java. Per completare l'autenticazione negli ambienti di hosting Azure, è consigliabile usare l'identità gestita assegnata dall'utente. Per altre informazioni, vedere Che sono identità gestite per le risorse Azure?

  3. Avviare l’applicazione. L'applicazione archivia i dati nel database. Verranno visualizzati log simili all'esempio seguente:

    2023-02-01 10:22:36.701 DEBUG 7948 --- [main] o.s.jdbc.core.JdbcTemplate : Executing prepared SQL statement [INSERT INTO todo (description, details, done) VALUES (?, ?, ?)]    
    com.example.demo.Todo@4bdb04c8
    

Distribuire su Azure Spring Apps

Ora che l'applicazione Spring Boot è in esecuzione in locale, è possibile spostarla nell'ambiente di produzione. Azure Spring Apps semplifica la distribuzione di applicazioni Spring Boot in Azure senza modifiche al codice. Il servizio gestisce l'infrastruttura delle applicazioni Spring per consentire agli sviluppatori di concentrarsi sul codice. Azure Spring Apps offre la gestione del ciclo di vita usando monitoraggio e diagnostica completi, gestione della configurazione, individuazione dei servizi, integrazione CI/CD, distribuzioni blu-verde e altro ancora. Per distribuire l'applicazione in Azure Spring Apps, vedere Distribuire la prima applicazione in Azure Spring Apps.

Passaggi successivi