Spring Data JDBC gebruiken met Azure Database for MySQL
In deze zelfstudie wordt gedemonstreerd hoe u gegevens opslaat in een Azure Database for MySQL-database met behulp van Spring Data JDBC.
JDBC is de standaard Java-API om verbinding te maken met traditionele relationele databases.
In deze zelfstudie bevatten we twee verificatiemethoden: Microsoft Entra-verificatie en MySQL-verificatie. Op het tabblad Wachtwoordloos ziet u de Microsoft Entra-verificatie en op het tabblad Wachtwoord wordt de MySQL-verificatie weergegeven.
Microsoft Entra-verificatie is een mechanisme voor het maken van verbinding met Azure Database for MySQL met behulp van identiteiten die zijn gedefinieerd in Microsoft Entra-id. Met Microsoft Entra-verificatie kunt u databasegebruikersidentiteiten en andere Microsoft-services op een centrale locatie beheren, waardoor het beheer van machtigingen wordt vereenvoudigd.
MySQL-verificatie maakt gebruik van accounts die zijn opgeslagen in MySQL. Als u ervoor kiest om wachtwoorden als referenties voor de accounts te gebruiken, worden deze referenties opgeslagen in de user
tabel. Omdat deze wachtwoorden zijn opgeslagen in MySQL, moet u de rotatie van de wachtwoorden zelf beheren.
Vereisten
Een Azure-abonnement (u kunt een gratis abonnement maken).
Java Development Kit (JDK), versie 8 of hoger.
Als u geen Spring Boot-toepassing hebt, maakt u een Maven-project met de Spring Initializr. Zorg ervoor dat u Maven-project selecteert en onder Afhankelijkheden de afhankelijkheden van Spring Web, Spring Data JDBC en MySQL-stuurprogramma's toevoegt en vervolgens Java-versie 8 of hoger selecteert.
- Als u er nog geen hebt, maakt u een Exemplaar van Azure Database for MySQL Flexible Server met de naam
mysqlflexibletest
. Zie quickstart: De Azure-portal gebruiken om een Flexibele Azure Database for MySQL-server te maken voor instructies. Maak vervolgens een database met de naamdemo
. Zie Databases maken en beheren voor Azure Database for MySQL Flexible Server voor instructies.
Bekijk de voorbeeldtoepassing
In deze zelfstudie codeert u een voorbeeldtoepassing. Als u sneller wilt gaan, is deze toepassing al gecodeerd en beschikbaar op https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql.
Een firewallregel voor uw MySQL-server configureren
Azure Database for MySQL-instanties worden standaard beveiligd. Ze hebben een firewall die geen enkele binnenkomende verbinding toestaat.
Als u de database wilt kunnen gebruiken, opent u de firewall van de server om het lokale IP-adres toegang te geven tot de databaseserver. Zie Firewallregels beheren voor Azure Database for MySQL - Flexible Server met behulp van Azure Portal voor meer informatie.
Als u verbinding maakt met uw MySQL-server vanaf Windows-subsysteem voor Linux (WSL) op een Windows-computer, moet u het IP-adres van de WSL-host toevoegen aan uw firewall.
Een MySQL-gebruiker maken die niet-beheerder is en machtigingen verlenen
Met deze stap maakt u een niet-beheerder en verleent u alle machtigingen voor de demo
database.
U kunt de volgende methode gebruiken om een niet-beheerder te maken die gebruikmaakt van een verbinding zonder wachtwoord.
Gebruik de volgende opdracht om de serviceconnector-extensie zonder wachtwoord te installeren voor de Azure CLI:
az extension add --name serviceconnector-passwordless --upgrade
Gebruik de volgende opdracht om de niet-beheerdersgebruiker van Microsoft Entra te maken:
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
Wanneer de opdracht is voltooid, noteert u de gebruikersnaam in de console-uitvoer.
Gegevens opslaan uit Azure Database for MySQL
Nu u een Azure Database for MySQL Flexible Server-exemplaar hebt, kunt u gegevens opslaan met behulp van Spring Cloud Azure.
Als u de Spring Cloud Azure Starter JDBC MySQL-module wilt installeren, voegt u de volgende afhankelijkheden toe aan uw pom.xml-bestand :
De 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>
Notitie
Als u Spring Boot 2.x gebruikt, moet u de
spring-cloud-azure-dependencies
versie instellen op4.19.0
. Deze stuklijst (Bill of Material) moet worden geconfigureerd in de<dependencyManagement>
sectie van uw pom.xml-bestand . Dit zorgt ervoor dat alle Spring Cloud Azure-afhankelijkheden dezelfde versie gebruiken. Zie welke versie van Spring Cloud Azure moet ik gebruiken voor meer informatie over de versie die voor deze BOM wordt gebruikt.Het Spring Cloud Azure Starter JDBC MySQL-artefact:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId> </dependency>
Notitie
Verbindingen zonder wachtwoord worden ondersteund sinds versie 4.5.0
.
Spring Boot configureren voor het gebruik van Azure Database for MySQL
Als u gegevens uit Azure Database for MySQL wilt opslaan met Spring Data JDBC, voert u de volgende stappen uit om de toepassing te configureren:
Configureer Azure Database for MySQL-referenties door de volgende eigenschappen toe te voegen aan het configuratiebestand 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
Waarschuwing
De configuratie-eigenschap
spring.sql.init.mode=always
betekent dat Spring Boot automatisch een databaseschema genereert met behulp van het schema.sql-bestand dat u vervolgens maakt, telkens wanneer de server wordt gestart. Deze functie is ideaal voor testen, maar vergeet niet dat uw gegevens bij elke herstart worden verwijderd, dus u moet deze niet gebruiken in productie.De configuratie-eigenschap
spring.datasource.url
heeft?serverTimezone=UTC
toegevoegd om het JDBC-stuurprogramma te laten weten dat de UTC-datumnotatie (of Coordinated Universal Time) moet worden gebruikt bij het maken van verbinding met de database. Zonder deze parameter zou uw Java-server niet dezelfde datumnotatie gebruiken als de database, wat tot een fout zou leiden.
- Als u er nog geen hebt, maakt u een Exemplaar van azure Database for MySQL Enkele server met de naam
mysqlsingletest
. Zie quickstart: Een Azure Database for MySQL-server maken met behulp van Azure Portal voor instructies. Maak vervolgens een database met de naamdemo
. Zie de sectie Een database maken in Azure Database for MySQL voor instructies.
Bekijk de voorbeeldtoepassing
In dit artikel codet u een voorbeeldtoepassing. Als u sneller wilt gaan, is deze toepassing al gecodeerd en beschikbaar op https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql.
Een firewallregel voor uw MySQL-server configureren
Azure Database for MySQL-instanties worden standaard beveiligd. Ze hebben een firewall die geen enkele binnenkomende verbinding toestaat.
Als u de database wilt kunnen gebruiken, opent u de firewall van de server om het lokale IP-adres toegang te geven tot de databaseserver. Zie Azure Database for MySQL-firewallregels maken en beheren met behulp van Azure Portal voor meer informatie.
Als u verbinding maakt met uw MySQL-server vanaf Windows-subsysteem voor Linux (WSL) op een Windows-computer, moet u het IP-adres van de WSL-host toevoegen aan uw firewall.
Een MySQL-gebruiker maken die niet-beheerder is en machtigingen verlenen
Met deze stap maakt u een niet-beheerder en verleent u alle machtigingen voor de demo
database.
Belangrijk
Als u wachtwoordloze verbindingen wilt gebruiken, maakt u een Microsoft Entra-beheerdergebruiker voor uw Azure Database for MySQL-exemplaar. Zie voor meer informatie de sectie Microsoft Entra Admin-gebruiker instellen van Microsoft Entra-id gebruiken voor verificatie met MySQL.
Maak een SQL-script met de naam create_ad_user.sql voor het maken van een niet-beheerdersgebruiker. Voeg de volgende inhoud toe en sla deze lokaal op:
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
Gebruik vervolgens de volgende opdracht om het SQL-script uit te voeren om de niet-beheerdersgebruiker van Microsoft Entra te maken:
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
Tip
Als u Microsoft Entra-verificatie wilt gebruiken om verbinding te maken met Azure Database for MySQL, moet u zich aanmelden met de Microsoft Entra-beheerdergebruiker die u hebt ingesteld en vervolgens het toegangstoken ophalen als het wachtwoord. Zie Microsoft Entra-id gebruiken voor verificatie met MySQL voor meer informatie.
Gegevens opslaan uit Azure Database for MySQL
Nu u een Exemplaar van Azure Database for MySQL Enkele server hebt, kunt u gegevens opslaan met behulp van Spring Cloud Azure.
Als u de Spring Cloud Azure Starter JDBC MySQL-module wilt installeren, voegt u de volgende afhankelijkheden toe aan uw pom.xml-bestand :
De 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>
Notitie
Als u Spring Boot 2.x gebruikt, moet u de
spring-cloud-azure-dependencies
versie instellen op4.19.0
. Deze stuklijst (Bill of Material) moet worden geconfigureerd in de<dependencyManagement>
sectie van uw pom.xml-bestand . Dit zorgt ervoor dat alle Spring Cloud Azure-afhankelijkheden dezelfde versie gebruiken. Zie welke versie van Spring Cloud Azure moet ik gebruiken voor meer informatie over de versie die voor deze BOM wordt gebruikt.Het Spring Cloud Azure Starter JDBC MySQL-artefact:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId> </dependency>
Notitie
Verbindingen zonder wachtwoord worden ondersteund sinds versie 4.5.0
.
Spring Boot configureren voor het gebruik van Azure Database for MySQL
Als u gegevens uit Azure Database for MySQL wilt opslaan met Spring Data JDBC, voert u de volgende stappen uit om de toepassing te configureren:
Configureer Azure Database for MySQL-referenties door de volgende eigenschappen toe te voegen aan het configuratiebestand 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
Waarschuwing
De configuratie-eigenschap
spring.sql.init.mode=always
betekent dat Spring Boot automatisch een databaseschema genereert met behulp van het schema.sql-bestand dat u vervolgens maakt, telkens wanneer de server wordt gestart. Deze functie is ideaal voor testen, maar vergeet niet dat uw gegevens bij elke herstart worden verwijderd, dus u moet deze niet gebruiken in productie.De configuratie-eigenschap
spring.datasource.url
heeft?serverTimezone=UTC
toegevoegd om het JDBC-stuurprogramma te laten weten dat de UTC-datumnotatie (of Coordinated Universal Time) moet worden gebruikt bij het maken van verbinding met de database. Zonder deze parameter zou uw Java-server niet dezelfde datumnotatie gebruiken als de database, wat tot een fout zou leiden.
Maak het configuratiebestand src/main/resources/schema.sql om het databaseschema te configureren en voeg vervolgens de volgende inhoud toe.
DROP TABLE IF EXISTS todo; CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
Maak een nieuwe
Todo
Java-klasse. Deze klasse is een domeinmodel dat is toegewezen aan detodo
tabel die automatisch wordt gemaakt door Spring Boot. De volgende code negeert degetters
ensetters
methoden.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; }
Bewerk het opstartklassebestand om de volgende inhoud weer te geven.
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> { }
Tip
In deze zelfstudie zijn er geen verificatiebewerkingen in de configuraties of de code. Voor het maken van verbinding met Azure-services is echter verificatie vereist. Als u de verificatie wilt voltooien, moet u Azure Identity gebruiken. Spring Cloud Azure maakt gebruik
DefaultAzureCredential
van, die de Azure Identity-bibliotheek biedt om u te helpen referenties op te halen zonder dat er codewijzigingen zijn aangebracht.DefaultAzureCredential
ondersteunt meerdere verificatiemethoden en bepaalt welke methode tijdens runtime moet worden gebruikt. Met deze aanpak kan uw app verschillende verificatiemethoden gebruiken in verschillende omgevingen (zoals lokale en productieomgevingen) zonder omgevingsspecifieke code te implementeren. Zie DefaultAzureCredential voor meer informatie.Als u de verificatie in lokale ontwikkelomgevingen wilt voltooien, kunt u Azure CLI, Visual Studio Code, PowerShell of andere methoden gebruiken. Zie Azure-verificatie in Java-ontwikkelomgevingen voor meer informatie. Als u de verificatie in Azure-hostingomgevingen wilt voltooien, raden we u aan om een door de gebruiker toegewezen beheerde identiteit te gebruiken. Zie Wat zijn beheerde identiteiten voor Azure-resources? voor meer informatie.
Start de toepassing. De toepassing slaat gegevens op in de database. U ziet logboeken die vergelijkbaar zijn met het volgende voorbeeld:
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
Implementeren in Azure Spring Apps
Nu de Spring Boot-toepassing lokaal wordt uitgevoerd, is het tijd om deze naar productie te verplaatsen. Met Azure Spring Apps kunt u Eenvoudig Spring Boot-toepassingen implementeren in Azure zonder codewijzigingen. De service beheert de infrastructuur van Spring-toepassingen, zodat ontwikkelaars zich kunnen richten op hun code. Azure Spring Apps biedt levenscyclusbeheer met uitgebreide bewaking en diagnose, configuratiebeheer, servicedetectie, CI/CD-integratie, blauwgroene implementaties en meer. Zie Uw eerste toepassing implementeren in Azure Spring Apps om uw toepassing te implementeren in Azure Spring Apps.