Usare Spring Data JPA con Database di Azure per MySQL
Questa esercitazione illustra come archiviare i dati in Database di Azure per MySQL database usando Spring Data JPA.
JPA (Java Persistence API) è l'API Java standard per il mapping relazionale a oggetti.
In questa esercitazione sono inclusi due metodi di autenticazione: autenticazione di Microsoft Entra e autenticazione MySQL. La scheda Senza password mostra l'autenticazione Microsoft Entra e la scheda Password l'autenticazione mySQL.
L'autenticazione Microsoft Entra è un meccanismo di connessione a Database di Azure per MySQL tramite identità definite in Microsoft Entra ID. Con l'autenticazione Microsoft Entra è possibile gestire centralmente le identità degli utenti del database e di altri servizi Microsoft 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
Una sottoscrizione di Azure: creare un account gratuitamente.
Java Development Kit (JDK), versione 8 o successiva.
Client della riga di comando di MySQL.
Se non si ha un'applicazione Spring Boot, creare un progetto Maven con Spring Initializr. Assicurarsi di selezionare Progetto Maven e, in Dipendenze, aggiungere le dipendenze Spring Web, Spring Data JPA e MySQL Driver e quindi selezionare Java versione 8 o successiva.
- Se non è disponibile, creare un'istanza del server flessibile Database di Azure per MySQL denominata
mysqlflexibletest
. Per istruzioni, vedere Guida introduttiva: Usare il portale di Azure per creare un server flessibile Database di Azure per MySQL. Creare quindi un database denominatodemo
. Per istruzioni, vedere Creare e gestire database per Database di Azure per MySQL server flessibile.
Importante
Per usare connessioni senza password, creare un utente amministratore di Microsoft Entra per l'istanza di Database di Azure per MySQL. Per istruzioni, vedere la sezione Configurare l'amministratore di Microsoft Entra di Configurare l'autenticazione di Microsoft Entra per Database di Azure per MySQL - Server flessibile.
Vedere l'applicazione di esempio
In questa esercitazione verrà codificata un'applicazione di esempio. Per procedere più rapidamente, è possibile usare l'applicazione già pronta, disponibile all'indirizzo https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql.
Configurare una regola del firewall per il server MySQL
Le istanze di Database di Azure per MySQL 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 Database di Azure per MySQL - Server flessibile tramite il portale di Azure.
Se ci si connette al server MySQL da sottosistema Windows per 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.
Usare il comando seguente per installare l'estensione senza password di Service Connector per l'interfaccia della riga di comando di Azure:
az extension add --name serviceconnector-passwordless --upgrade
Usare il comando seguente per creare l'utente non amministratore di 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
Al termine del comando, prendere nota del nome utente nell'output della console.
Archiviare dati da Database di Azure per MySQL
Ora che si dispone di un'istanza del server flessibile Database di Azure per MySQL, è possibile archiviare i dati usando Spring Cloud Azure.
Per installare il modulo JDBC MySQL di Spring Cloud Starter, aggiungere le dipendenze seguenti al file pom.xml :
Spring Cloud Azure Bill of Materials (BOM):
<dependencyManagement> <dependencies> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>5.18.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Nota
Se si usa Spring Boot 2.x, assicurarsi di impostare la
spring-cloud-azure-dependencies
versione su4.19.0
. Questa distinta base deve essere configurata nella<dependencyManagement>
sezione del file di pom.xml . In questo modo tutte le dipendenze di Spring Cloud Azure usano la stessa versione. Per altre informazioni sulla versione usata per questa distinta base, vedere La versione di Spring Cloud azure da usare.Artefatto JDBC MySQL di Spring Cloud Starter:
<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 Database di Azure per MySQL
Per archiviare dati da Database di Azure per MySQL usando Spring Data JPA, seguire questa procedura per configurare l'applicazione:
Configurare Database di Azure per MySQL credenziali aggiungendo le proprietà seguenti al file di configurazione 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
Avviso
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.
- Se non è disponibile, creare un'istanza del server singolo Database di Azure per MySQL denominata
mysqlsingletest
. Per istruzioni, vedere Avvio rapido: Creare un server Database di Azure per MySQL usando il portale di Azure. Creare quindi un database denominatodemo
. Per istruzioni, vedere la sezione Creare un database in Creare utenti in Database di Azure per MySQL.
Importante
Per usare connessioni senza password, creare un utente amministratore di Microsoft Entra per l'istanza di Database di Azure per MySQL. Per istruzioni, vedere la sezione Impostazione dell'utente di Microsoft Entra Admin in Usare Microsoft Entra ID per l'autenticazione con MySQL.
Vedere l'applicazione di esempio
In questo articolo verrà codificata un'applicazione di esempio. Per procedere più rapidamente, è possibile usare l'applicazione già pronta, disponibile all'indirizzo https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql.
Configurare una regola del firewall per il server MySQL
Le istanze di Database di Azure per MySQL 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 Database di Azure per MySQL regole del firewall usando il portale di Azure.
Se ci si connette al server MySQL da sottosistema Windows per 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 di Microsoft Entra per l'istanza di Database di Azure per MySQL. Per altre informazioni, vedere la sezione Impostazione dell'utente amministratore di Microsoft Entra di Use Microsoft Entra ID for authentication with MySQL .For more information, see the Setting the Microsoft Entra Admin user section in Use Microsoft Entra ID for authentication with MySQL.
Creare uno script SQL denominato create_ad_user.sql per la creazione di un utente non amministratore. Aggiungervi il contenuto seguente e salvarlo in locale:
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
Quindi, usare il comando seguente per eseguire lo script SQL per creare l'utente non amministratore di 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
Suggerimento
Per usare l'autenticazione di Microsoft Entra per connettersi a Database di Azure per MySQL, è necessario accedere con l'utente amministratore di 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 Database di Azure per MySQL
Ora che si dispone di un'istanza di server singolo Database di Azure per MySQL, è possibile archiviare i dati usando Spring Cloud Azure.
Per installare il modulo JDBC MySQL di Spring Cloud Starter, aggiungere le dipendenze seguenti al file pom.xml :
Spring Cloud Azure Bill of Materials (BOM):
<dependencyManagement> <dependencies> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>5.18.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Nota
Se si usa Spring Boot 2.x, assicurarsi di impostare la
spring-cloud-azure-dependencies
versione su4.19.0
. Questa distinta base deve essere configurata nella<dependencyManagement>
sezione del file di pom.xml . In questo modo tutte le dipendenze di Spring Cloud Azure usano la stessa versione. Per altre informazioni sulla versione usata per questa distinta base, vedere La versione di Spring Cloud azure da usare.Artefatto JDBC MySQL di Spring Cloud Starter:
<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 Database di Azure per MySQL
Per archiviare dati da Database di Azure per MySQL usando Spring Data JPA, seguire questa procedura per configurare l'applicazione:
Configurare Database di Azure per MySQL credenziali aggiungendo le proprietà seguenti al file di configurazione 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
Avviso
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.
Creare una nuova
Todo
classe Java. Questa classe è un modello di dominio mappato allatodo
tabella che verrà creato automaticamente da JPA. Il codice seguente ignora igetters
metodi esetters
.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; }
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.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> { }
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 Identità di Azure. Spring Cloud Azure usa
DefaultAzureCredential
, che la libreria di identità di 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 l'interfaccia della riga di comando di Azure, Visual Studio Code, PowerShell o altri metodi. Per altre informazioni, vedere Autenticazione di Azure in ambienti di sviluppo Java. Per completare l'autenticazione negli ambienti di hosting di Azure, è consigliabile usare l'identità gestita assegnata dall'utente. Per altre informazioni, vedere Informazioni sulle identità gestite per le risorse di Azure
Avviare l’applicazione. Verranno visualizzati log simili all'esempio seguente:
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
Distribuire in 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 fornisce la gestione del ciclo di vita tramite funzionalità complete di monitoraggio e diagnostica, gestione della configurazione, individuazione dei servizi, integrazione di 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.