Använda Spring Data JDBC med Azure Database for MySQL
Den här självstudien visar hur du lagrar data i Azure Database for MySQL-databasen med hjälp av Spring Data JDBC.
JDBC är java-standard-API:et för att ansluta till traditionella relationsdatabaser.
I den här självstudien innehåller vi två autentiseringsmetoder: Microsoft Entra-autentisering och MySQL-autentisering. Fliken Lösenordslös visar Microsoft Entra-autentiseringen och fliken Lösenord visar MySQL-autentiseringen.
Microsoft Entra-autentisering är en mekanism för att ansluta till Azure Database for MySQL med hjälp av identiteter som definierats i Microsoft Entra-ID. Med Microsoft Entra-autentisering kan du hantera databasanvändares identiteter och andra Microsoft-tjänster på en central plats, vilket förenklar behörighetshanteringen.
MySQL-autentisering använder konton som lagras i MySQL. Om du väljer att använda lösenord som autentiseringsuppgifter för kontona lagras dessa autentiseringsuppgifter i user
tabellen. Eftersom dessa lösenord lagras i MySQL måste du hantera rotationen av lösenorden själv.
Förutsättningar
En Azure-prenumeration – skapa en kostnadsfritt.
Java Development Kit (JDK), version 8 eller senare.
Om du inte har något Spring Boot-program skapar du ett Maven-projekt med Spring Initializr. Se till att välja Maven Project och under Beroenden lägger du till Beroenden för Spring Web, Spring Data JDBC och MySQL Driver och väljer sedan Java version 8 eller senare.
- Om du inte har någon skapar du en Azure Database for MySQL – flexibel serverinstans med namnet
mysqlflexibletest
. Anvisningar finns i Snabbstart: Använd Azure Portal för att skapa en flexibel Azure Database for MySQL-server. Skapa sedan en databas med namnetdemo
. Anvisningar finns i Skapa och hantera databaser för Azure Database for MySQL – flexibel server.
Se exempelprogrammet
I den här självstudien kodar du ett exempelprogram. Om du vill gå snabbare är det här programmet redan kodat och tillgängligt på https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql.
Konfigurera en brandväggsregel för MySQL-servern
Azure Database for MySQL-instanser skyddas som standard. Databaserna har en brandvägg som inte tillåter inkommande anslutningar.
Om du vill kunna använda databasen öppnar du serverns brandvägg så att den lokala IP-adressen kan komma åt databasservern. Mer information finns i Hantera brandväggsregler för Azure Database for MySQL – flexibel server med hjälp av Azure Portal.
Om du ansluter till MySQL-servern från Windows-undersystem för Linux (WSL) på en Windows-dator måste du lägga till WSL-värdens IP-adress i brandväggen.
Skapa en MySQL-användare som inte är administratör och bevilja behörighet
Det här steget skapar en icke-administratörsanvändare och beviljar alla behörigheter för databasen till den demo
.
Du kan använda följande metod för att skapa en icke-administratörsanvändare som använder en lösenordslös anslutning.
Använd följande kommando för att installera det lösenordslösa tillägget för Service Connector för Azure CLI:
az extension add --name serviceconnector-passwordless --upgrade
Använd följande kommando för att skapa microsoft Entra-användaren som inte är administratör:
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
När kommandot har slutförts noterar du användarnamnet i konsolens utdata.
Lagra data från Azure Database for MySQL
Nu när du har en flexibel Azure Database for MySQL-serverinstans kan du lagra data med hjälp av Spring Cloud Azure.
Om du vill installera Spring Cloud Azure Starter JDBC MySQL-modulen lägger du till följande beroenden i din pom.xml-fil :
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>
Kommentar
Om du använder Spring Boot 2.x måste du ange
spring-cloud-azure-dependencies
versionen till4.19.0
. Den här strukturlistan (BOM) bör konfigureras i avsnittet i<dependencyManagement>
din pom.xml-fil . Detta säkerställer att alla Spring Cloud Azure-beroenden använder samma version. Mer information om vilken version som används för den här strukturlistan finns i Vilken version av Spring Cloud Azure ska jag använda.Spring Cloud Azure Starter JDBC MySQL-artefakten:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId> </dependency>
Kommentar
Lösenordslösa anslutningar har stöd för sedan version 4.5.0
.
Konfigurera Spring Boot för att använda Azure Database for MySQL
Om du vill lagra data från Azure Database for MySQL med Spring Data JDBC följer du dessa steg för att konfigurera programmet:
Konfigurera autentiseringsuppgifter för Azure Database for MySQL genom att lägga till följande egenskaper i konfigurationsfilen 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
Varning
Konfigurationsegenskapen
spring.sql.init.mode=always
innebär att Spring Boot automatiskt genererar ett databasschema med hjälp av den schema.sql fil som du skapar nästa gång servern startas. Den här funktionen är bra för testning, men kom ihåg att den tar bort dina data vid varje omstart, så du bör inte använda dem i produktion.Konfigurationsegenskapen
spring.datasource.url
har?serverTimezone=UTC
lagts till för att instruera JDBC-drivrutinen att använda UTC-datumformatet (eller Coordinated Universal Time) när du ansluter till databasen. Utan den här parametern skulle Java-servern inte använda samma datumformat som databasen, vilket skulle resultera i ett fel.
- Om du inte har en skapar du en Azure Database for MySQL–enskild serverinstans med namnet
mysqlsingletest
. Anvisningar finns i Snabbstart: Skapa en Azure Database for MySQL-server med hjälp av Azure Portal. Skapa sedan en databas med namnetdemo
. Anvisningar finns i avsnittet Skapa en databas i Skapa användare i Azure Database for MySQL.
Se exempelprogrammet
I den här artikeln kodar du ett exempelprogram. Om du vill gå snabbare är det här programmet redan kodat och tillgängligt på https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql.
Konfigurera en brandväggsregel för MySQL-servern
Azure Database for MySQL-instanser skyddas som standard. Databaserna har en brandvägg som inte tillåter inkommande anslutningar.
Om du vill kunna använda databasen öppnar du serverns brandvägg så att den lokala IP-adressen kan komma åt databasservern. Mer information finns i Skapa och hantera Azure Database for MySQL-brandväggsregler med hjälp av Azure Portal.
Om du ansluter till MySQL-servern från Windows-undersystem för Linux (WSL) på en Windows-dator måste du lägga till WSL-värdens IP-adress i brandväggen.
Skapa en MySQL-användare som inte är administratör och bevilja behörighet
Det här steget skapar en icke-administratörsanvändare och beviljar alla behörigheter för databasen till den demo
.
Viktigt!
Om du vill använda lösenordslösa anslutningar skapar du en Microsoft Entra-administratörsanvändare för din Azure Database for MySQL-instans. Mer information finns i avsnittet Ange microsoft entra-administratörsanvändare i Använda Microsoft Entra-ID för autentisering med MySQL.
Skapa ett SQL-skript med namnet create_ad_user.sql för att skapa en icke-administratörsanvändare. Lägg till följande innehåll och spara det lokalt:
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
Använd sedan följande kommando för att köra SQL-skriptet för att skapa microsoft Entra-användaren som inte är administratör:
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
Dricks
Om du vill använda Microsoft Entra-autentisering för att ansluta till Azure Database for MySQL måste du logga in med den Microsoft Entra-administratörsanvändare som du har konfigurerat och sedan hämta åtkomsttoken som lösenord. Mer information finns i Använda Microsoft Entra-ID för autentisering med MySQL.
Lagra data från Azure Database for MySQL
Nu när du har en Azure Database for MySQL Single Server-instans kan du lagra data med hjälp av Spring Cloud Azure.
Om du vill installera Spring Cloud Azure Starter JDBC MySQL-modulen lägger du till följande beroenden i din pom.xml-fil :
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>
Kommentar
Om du använder Spring Boot 2.x måste du ange
spring-cloud-azure-dependencies
versionen till4.19.0
. Den här strukturlistan (BOM) bör konfigureras i avsnittet i<dependencyManagement>
din pom.xml-fil . Detta säkerställer att alla Spring Cloud Azure-beroenden använder samma version. Mer information om vilken version som används för den här strukturlistan finns i Vilken version av Spring Cloud Azure ska jag använda.Spring Cloud Azure Starter JDBC MySQL-artefakten:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId> </dependency>
Kommentar
Lösenordslösa anslutningar har stöd för sedan version 4.5.0
.
Konfigurera Spring Boot för att använda Azure Database for MySQL
Om du vill lagra data från Azure Database for MySQL med Spring Data JDBC följer du dessa steg för att konfigurera programmet:
Konfigurera autentiseringsuppgifter för Azure Database for MySQL genom att lägga till följande egenskaper i konfigurationsfilen 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
Varning
Konfigurationsegenskapen
spring.sql.init.mode=always
innebär att Spring Boot automatiskt genererar ett databasschema med hjälp av den schema.sql fil som du skapar nästa gång servern startas. Den här funktionen är bra för testning, men kom ihåg att den tar bort dina data vid varje omstart, så du bör inte använda dem i produktion.Konfigurationsegenskapen
spring.datasource.url
har?serverTimezone=UTC
lagts till för att instruera JDBC-drivrutinen att använda UTC-datumformatet (eller Coordinated Universal Time) när du ansluter till databasen. Utan den här parametern skulle Java-servern inte använda samma datumformat som databasen, vilket skulle resultera i ett fel.
Skapa konfigurationsfilen src/main/resources/schema.sql för att konfigurera databasschemat och lägg sedan till följande innehåll.
DROP TABLE IF EXISTS todo; CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
Skapa en ny
Todo
Java-klass. Den här klassen är en domänmodell som mappas till tabellentodo
som skapas automatiskt av Spring Boot. Följande kod ignorerargetters
metoderna ochsetters
.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; }
Redigera startklassfilen för att visa följande innehåll.
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> { }
Dricks
I den här självstudien finns det inga autentiseringsåtgärder i konfigurationerna eller koden. Att ansluta till Azure-tjänster kräver dock autentisering. För att slutföra autentiseringen måste du använda Azure Identity. Spring Cloud Azure använder
DefaultAzureCredential
, som Azure Identity-biblioteket tillhandahåller för att hjälpa dig att få autentiseringsuppgifter utan några kodändringar.DefaultAzureCredential
stöder flera autentiseringsmetoder och avgör vilken metod som ska användas vid körning. Med den här metoden kan din app använda olika autentiseringsmetoder i olika miljöer (till exempel lokala miljöer och produktionsmiljöer) utan att implementera miljöspecifik kod. Mer information finns i DefaultAzureCredential.För att slutföra autentiseringen i lokala utvecklingsmiljöer kan du använda Azure CLI, Visual Studio Code, PowerShell eller andra metoder. Mer information finns i Azure-autentisering i Java-utvecklingsmiljöer. För att slutföra autentiseringen i Azure-värdmiljöer rekommenderar vi att du använder användartilldelad hanterad identitet. Mer information finns i Vad är hanterade identiteter för Azure-resurser?
Starta programmet. Programmet lagrar data i databasen. Du ser loggar som liknar följande exempel:
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
Distribuera till Azure Spring Apps
Nu när Spring Boot-programmet körs lokalt är det dags att flytta det till produktion. Azure Spring Apps gör det enkelt att distribuera Spring Boot-program till Azure utan några kodändringar. Tjänsten hanterar infrastrukturen för Spring-program så att utvecklare kan fokusera på sin kod. Azure Spring Apps tillhandahåller livscykelhantering med omfattande övervakning och diagnostik, konfigurationshantering, tjänstidentifiering, CI/CD-integrering, blågröna distributioner med mera. Information om hur du distribuerar ditt program till Azure Spring Apps finns i Distribuera ditt första program till Azure Spring Apps.