Freigeben über


Verwenden von Spring Data-JDBC mit Azure Database for MySQL

In diesem Tutorial wird das Speichern von Daten in der Azure Database for MySQL-Datenbank mithilfe von Spring Data JDBC veranschaulicht.

JDBC ist die Standard-Java-API, um eine Verbindung mit herkömmlichen relationalen Datenbanken herzustellen.

In diesem Tutorial werden zwei Authentifizierungsmethoden verwendet: Microsoft Entra- und MySQL-Authentifizierung. Die Registerkarte Kennwortlos zeigt die Microsoft Entra-Authentifizierung und die Registerkarte Kennwort die MySQL-Authentifizierung.

Die Microsoft Entra-Authentifizierung ist ein Mechanismus zum Herstellen einer Verbindung mit Azure Database for MySQL unter Verwendung von Identitäten, die in Microsoft Entra ID definiert sind. Mit der Microsoft Entra-Authentifizierung können Sie Datenbankbenutzeridentitäten und andere Microsoft-Dienste an einem zentralen Ort verwalten, wodurch die Berechtigungsverwaltung vereinfacht wird.

MySQL-Authentifizierung verwendet Konten, die in MySQL gespeichert sind. Wenn Sie Kennwörter als Anmeldeinformationen für die Konten verwenden, werden diese Anmeldeinformationen in der user-Tabelle gespeichert. Da diese Kennwörter in MySQL gespeichert sind, müssen Sie die Rotation der Kennwörter selbst verwalten.

Voraussetzungen

  • MySQL-Befehlszeilenclient.

  • Wenn Sie über keine Spring Boot-Anwendung verfügen, erstellen Sie mit Spring Initializr ein Maven-Projekt. Achten Sie darauf, Maven Project (Maven-Projekt) auszuwählen, fügen Sie unter Dependencies (Abhängigkeiten) die Abhängigkeiten Spring Web. Spring Data JDBC und MySQL Driver hinzu, und wählen Sie dann Java-Version 8 oder höher aus.

Anzeigen der Beispielanwendung

In diesem Tutorial erstellen Sie eine Beispielanwendung. Wenn Sie schneller vorgehen möchten, ist diese Anwendung unter https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql bereits programmiert und verfügbar.

Konfigurieren einer Firewallregel für den MySQL-Server

Azure Database for MySQL-Instanzen sind standardmäßig gesichert. Sie besitzen eine Firewall, die keine eingehenden Verbindungen zulässt.

Um Ihre Datenbank nutzen zu können, öffnen Sie die Firewall des Servers, damit die lokale IP-Adresse auf den Datenbankserver zugreifen kann. Weitere Informationen finden Sie unter Verwalten von Firewallregeln für Azure Database for MySQL – flexibler Server mit Azure-Portal.

Wenn Sie eine Verbindung mit Ihrem MySQL-Server aus Windows-Subsystem für Linux (WSL) auf einem Windows-Computer herstellen, müssen Sie der Firewall die WSL-Host-IP-Adresse hinzufügen.

Erstellen eines MySQL-Nicht-Administratorbenutzers und Erteilen von Berechtigungen

In diesem Schritt wird ein Nicht-Administratorbenutzer erstellt, und ihm werden alle Berechtigungen für die demo-Datenbank gewährt.

Sie können die folgende Methode verwenden, um einen Nicht-Administratorbenutzer zu erstellen, der eine kennwortlose Verbindung verwendet.

  1. Verwenden Sie den folgenden Befehl, um die kennwortlose Dienstconnector-Erweiterung für die Azure CLI zu installieren:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. Verwenden Sie dann den folgenden Befehl, um den Microsoft Entra-Benutzer ohne Administratorrechte erstellen:

      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
    

    Sobald der Befehl abgeschlossen ist, notieren Sie sich den Benutzernamen in der Konsolenausgabe.

Speichern von Daten aus Azure Database for MySQL

Nachdem Sie nun über eine Instanz von Azure Database for MySQL – Flexibler Server verfügen, können Sie Daten mithilfe von Spring Cloud Azure speichern.

Um das Spring Cloud Azure Starter JDBC MySQL-Modul zu installieren, fügen Sie Ihrer pom.xml-Datei die folgenden Abhängigkeiten hinzu:

  • Die Spring Cloud Azure-Stückliste (BOM):

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

    Hinweis

    Wenn Sie Spring Boot 3.0.x-3.4.x verwenden, stellen Sie sicher, dass Sie die spring-cloud-azure-dependencies Version auf 5.23.0festlegen.

    Wenn Sie Spring Boot 2.x verwenden, stellen Sie sicher, dass Sie die spring-cloud-azure-dependencies-Version auf 4.20.0 festlegen.

    Diese Stückliste (Bill of Material, BOM) sollte im Abschnitt <dependencyManagement> Ihrer pom.xml-Datei konfiguriert werden. Dadurch wird sichergestellt, dass alle Spring Cloud Azure-Abhängigkeiten dieselbe Version verwenden.

    Weitere Informationen zu der für diese BOM verwendete Version finden Sie unter Welche Version von Spring Cloud Azure sollte ich verwenden?

  • Das Spring Cloud Azure Starter JDBC MySQL-Artefakt:

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

Hinweis

Kennwortlose Verbindungen werden seit Version 4.5.0 unterstützt.

Konfigurieren von Spring Boot für die Verwendung von Azure Database for MySQL

Führen Sie die folgenden Schritte aus, um Daten aus Azure Database for MySQL mithilfe von Spring Data JDBC zu speichern:

  1. Konfigurieren Sie die Azure Database for MySQL-Anmeldeinformationen, indem Sie der application.properties-Konfigurationsdatei die folgenden Eigenschaften hinzufügen.

    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
    

    Warnung

    Die Konfigurationseigenschaft spring.sql.init.mode=always bedeutet, dass Spring Boot mithilfe der Datei schema.sql, die Sie als Nächstes erstellen, bei jedem Start des Servers automatisch ein Datenbankschema generiert. Diese Funktion eignet sich hervorragend für Tests. Denken Sie jedoch daran, dass sie Ihre Daten bei jedem Neustart löscht. Daher sollte diese Eigenschaft nicht in der Produktion verwendet werden.

    An die spring.datasource.url-Konfigurationseigenschaft wird ?serverTimezone=UTC angefügt, um den JDBC-Treiber anzuweisen, beim Herstellen einer Verbindung mit der Datenbank das UTC-Datumsformat (Coordinated Universal Time, koordinierte Weltzeit) zu verwenden. Ohne diesen Parameter würde Ihr Java-Server nicht das gleiche Datumsformat wie die Datenbank verwenden, was zu einem Fehler führen würde.

Anzeigen der Beispielanwendung

In diesem Artikel erstellen Sie eine Beispielanwendung. Wenn Sie schneller vorgehen möchten, ist diese Anwendung unter https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql bereits programmiert und verfügbar.

Konfigurieren einer Firewallregel für den MySQL-Server

Azure Database for MySQL-Instanzen sind standardmäßig gesichert. Sie besitzen eine Firewall, die keine eingehenden Verbindungen zulässt.

Um Ihre Datenbank nutzen zu können, öffnen Sie die Firewall des Servers, damit die lokale IP-Adresse auf den Datenbankserver zugreifen kann. Weitere Informationen finden Sie unter Erstellen und Verwalten von Firewallregeln für Azure Database for MySQL mithilfe des Azure-Portals.

Wenn Sie eine Verbindung mit Ihrem MySQL-Server aus Windows-Subsystem für Linux (WSL) auf einem Windows-Computer herstellen, müssen Sie der Firewall die WSL-Host-IP-Adresse hinzufügen.

Erstellen eines MySQL-Nicht-Administratorbenutzers und Erteilen von Berechtigungen

In diesem Schritt wird ein Nicht-Administratorbenutzer erstellt, und ihm werden alle Berechtigungen für die demo-Datenbank gewährt.

Wichtig

Um kennwortlose Verbindungen zu verwenden, erstellen Sie einen Microsoft Entra-Administratorbenutzer für Ihre Instanz von Azure Database for MySQL. Weitere Informationen finden Sie im Abschnitt Festlegen des Microsoft Entra-Administratorbenutzers unter Verwendung der Microsoft Entra ID für die Authentifizierung mit MySQL.

Erstellen Sie ein SQL-Skript namens create_ad_user.sql zum Erstellen eines Nicht-Administratorbenutzers. Fügen Sie den folgenden Inhalt hinzu, und speichern Sie das Skript lokal:

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

Verwenden Sie dann den folgenden Befehl, um das SQL-Skript zum Erstellen des/der Microsoft Entra-Benutzers/-Benutzerin ohne Administratorrechte auszuführen:

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

Tipp

Um die Microsoft Entra-Authentifizierung zum Herstellen einer Verbindung mit Azure Database for MySQL zu verwenden, müssen Sie sich mit dem von Ihnen eingerichteten Microsoft Entra-Administratorbenutzer anmelden und dann das Zugriffstoken als Kennwort abrufen. Weitere Informationen finden Sie unter Verwenden der Microsoft Entra ID für die Authentifizierung mit MySQL.

Speichern von Daten aus Azure Database for MySQL

Nachdem Sie nun über eine Instanz von Azure Database for MySQL – Einzelserver verfügen, können Sie Daten mithilfe von Spring Cloud Azure speichern.

Um das Spring Cloud Azure Starter JDBC MySQL-Modul zu installieren, fügen Sie Ihrer pom.xml-Datei die folgenden Abhängigkeiten hinzu:

  • Die Spring Cloud Azure-Stückliste (BOM):

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

    Hinweis

    Wenn Sie Spring Boot 3.0.x-3.4.x verwenden, stellen Sie sicher, dass Sie die spring-cloud-azure-dependencies Version auf 5.23.0festlegen.

    Wenn Sie Spring Boot 2.x verwenden, stellen Sie sicher, dass Sie die spring-cloud-azure-dependencies-Version auf 4.20.0 festlegen.

    Diese Stückliste (Bill of Material, BOM) sollte im Abschnitt <dependencyManagement> Ihrer pom.xml-Datei konfiguriert werden. Dadurch wird sichergestellt, dass alle Spring Cloud Azure-Abhängigkeiten dieselbe Version verwenden.

    Weitere Informationen zu der für diese BOM verwendete Version finden Sie unter Welche Version von Spring Cloud Azure sollte ich verwenden?

  • Das Spring Cloud Azure Starter JDBC MySQL-Artefakt:

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

Hinweis

Kennwortlose Verbindungen werden seit Version 4.5.0 unterstützt.

Konfigurieren von Spring Boot für die Verwendung von Azure Database for MySQL

Führen Sie die folgenden Schritte aus, um Daten aus Azure Database for MySQL mithilfe von Spring Data JDBC zu speichern:

  1. Konfigurieren Sie die Azure Database for MySQL-Anmeldeinformationen, indem Sie der application.properties-Konfigurationsdatei die folgenden Eigenschaften hinzufügen.

    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
    

    Warnung

    Die Konfigurationseigenschaft spring.sql.init.mode=always bedeutet, dass Spring Boot mithilfe der Datei schema.sql, die Sie als Nächstes erstellen, bei jedem Start des Servers automatisch ein Datenbankschema generiert. Diese Funktion eignet sich hervorragend für Tests. Denken Sie jedoch daran, dass sie Ihre Daten bei jedem Neustart löscht. Daher sollte diese Eigenschaft nicht in der Produktion verwendet werden.

    An die spring.datasource.url-Konfigurationseigenschaft wird ?serverTimezone=UTC angefügt, um den JDBC-Treiber anzuweisen, beim Herstellen einer Verbindung mit der Datenbank das UTC-Datumsformat (Coordinated Universal Time, koordinierte Weltzeit) zu verwenden. Ohne diesen Parameter würde Ihr Java-Server nicht das gleiche Datumsformat wie die Datenbank verwenden, was zu einem Fehler führen würde.

  1. Erstellen Sie die Konfigurationsdatei src/main/resources/schema.sql, um das Datenbankschema zu konfigurieren, und fügen Sie dann den folgenden Inhalt hinzu.

    DROP TABLE IF EXISTS todo;
    CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
    
  1. Erstellen Sie eine neue Todo-Java-Klasse. Diese Klasse ist ein Domänenmodell, das der todo-Tabelle zugeordnet wird, die automatisch von Spring Boot erstellt wird. Der folgende Code ignoriert die Methoden getters und 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. Bearbeiten Sie die Startklassendatei, um den folgenden Inhalt anzuzeigen.

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

    Tipp

    In diesem Lernprogramm gibt es keine Authentifizierungsvorgänge in den Konfigurationen oder im Code. Für die Verbindung mit den Azure-Diensten ist jedoch eine Authentifizierung erforderlich. Um die Authentifizierung abzuschließen, müssen Sie Azure Identity verwenden. Spring Cloud Azure verwendet die von der Azure Identity-Bibliothek bereitgestellte Klasse DefaultAzureCredential, um Sie beim Abrufen von Anmeldeinformationen ohne Codeänderungen zu unterstützen.

    DefaultAzureCredential“ unterstützt mehrere Authentifizierungsmethoden und bestimmt, welche Methode zur Runtime verwendet wird. Bei diesem Ansatz kann Ihre App unterschiedliche Authentifizierungsmethoden in verschiedenen Umgebungen (wie lokalen und Produktionsumgebungen) verwenden, ohne umgebungsspezifischen Code zu implementieren. Weitere Informationen finden Sie unter DefaultAzureCredential.

    Zum Abschließen der Authentifizierung in lokalen Entwicklungsumgebungen können Sie Azure CLI, Visual Studio Code, PowerShell oder andere Methoden verwenden. Weitere Informationen finden Sie unter Azure-Authentifizierung in Java-Entwicklungsumgebungen. Zum Abschließen der Authentifizierung in Azure-Hostingumgebungen empfehlen wir die Verwendung einer benutzerseitig zugewiesenen verwaltete Identität. Weitere Informationen finden Sie unter Was sind verwaltete Identitäten für Azure-Ressourcen?.

  3. Starten Sie die Anwendung. Die Anwendung speichert Daten in der Datenbank. Ihnen wird daraufhin Protokolle angezeigt, die dem folgenden Beispiel ähneln:

    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
    

Bereitstellen in Azure Spring Apps

Nachdem Sie nun die Spring Boot-App lokal ausgeführt haben, ist es an der Zeit, sie in die Produktion zu verschieben. Mit Azure Spring Apps lassen sich Spring Boot-Anwendungen ganz einfach und ohne Codeänderungen in Azure bereitstellen. Der Dienst verwaltet die Infrastruktur von Spring-Anwendungen und ermöglicht es Entwicklern dadurch, sich auf ihren Code zu konzentrieren. Azure Spring Apps bietet eine Lebenszyklusverwaltung mit umfassender Überwachung und Diagnose, Konfigurationsverwaltung, Dienstermittlung, CI/CD-Integration, Blau/Grün-Bereitstellungen u. v. m. Informationen zum Bereitstellen Ihrer Anwendung in Azure Spring Apps finden Sie unter Bereitstellen Ihrer ersten Anwendung in Azure Spring Apps.

Nächste Schritte