Schnellstart: Verwenden von Java und JDBC mit Azure Database for MySQLQuickstart: Use Java and JDBC with Azure Database for MySQL

In diesem Thema wird die Erstellung einer Beispielanwendung veranschaulicht, die Java und JDBC verwendet, um Informationen in Azure Database for MySQL zu speichern bzw. daraus abzurufen.This topic demonstrates creating a sample application that uses Java and JDBC to store and retrieve information in Azure Database for MySQL.

JDBC ist die Standard-Java-API, um eine Verbindung mit herkömmlichen relationalen Datenbanken herzustellen.JDBC is the standard Java API to connect to traditional relational databases.

VoraussetzungenPrerequisites

Vorbereiten der ArbeitsumgebungPrepare the working environment

Sie verwenden Umgebungsvariablen, um Tippfehler zu minimieren und die Anpassung der folgenden Konfiguration für Ihre spezifischen Anforderungen zu erleichtern.We are going to use environment variables to limit typing mistakes, and to make it easier for you to customize the following configuration for your specific needs.

Richten Sie diese Umgebungsvariablen mithilfe der folgenden Befehle ein:Set up those environment variables by using the following commands:

AZ_RESOURCE_GROUP=database-workshop
AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>
AZ_LOCATION=<YOUR_AZURE_REGION>
AZ_MYSQL_USERNAME=demo
AZ_MYSQL_PASSWORD=<YOUR_MYSQL_PASSWORD>
AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>

Ersetzen Sie die Platzhalter durch die folgenden Werte, die in diesem Artikel verwendet werden:Replace the placeholders with the following values, which are used throughout this article:

  • <YOUR_DATABASE_NAME>: Der Name Ihres MySQL-Servers.<YOUR_DATABASE_NAME>: The name of your MySQL server. Er muss innerhalb von Azure eindeutig sein.It should be unique across Azure.
  • <YOUR_AZURE_REGION>: Die von Ihnen verwendete Azure-Region.<YOUR_AZURE_REGION>: The Azure region you'll use. Sie können standardmäßig eastus verwenden, wir empfehlen aber, eine Region zu konfigurieren, die näher an Ihrem Standort liegt.You can use eastus by default, but we recommend that you configure a region closer to where you live. Die vollständige Liste der verfügbaren Regionen wird angezeigt, wenn Sie az account list-locations eingeben.You can have the full list of available regions by entering az account list-locations.
  • <YOUR_MYSQL_PASSWORD>: Das Kennwort Ihres MySQL-Datenbankservers.<YOUR_MYSQL_PASSWORD>: The password of your MySQL database server. Dieses Kennwort sollte mindestens acht Zeichen lang sein.That password should have a minimum of eight characters. Es muss Zeichen aus drei der folgenden Kategorien enthalten: Englische Großbuchstaben, englische Kleinbuchstaben, Zahlen (0-9) und nicht alphanumerische Zeichen (!, $, #, % usw.).The characters should be from three of the following categories: English uppercase letters, English lowercase letters, numbers (0-9), and non-alphanumeric characters (!, $, #, %, and so on).
  • <YOUR_LOCAL_IP_ADDRESS>: Die IP-Adresse Ihres lokalen Computers, auf dem Sie die Java-Anwendung ausführen.<YOUR_LOCAL_IP_ADDRESS>: The IP address of your local computer, from which you'll run your Java application. Sie können sie ganz einfach ermitteln, indem Sie im Browser zu whatismyip.akamai.com navigieren.One convenient way to find it is to point your browser to whatismyip.akamai.com.

Erstellen Sie als Nächstes eine Ressourcengruppe:Next, create a resource group:

az group create \
    --name $AZ_RESOURCE_GROUP \
    --location $AZ_LOCATION \
  	| jq

Hinweis

Wir verwenden das in Azure Cloud Shell standardmäßig installierte Dienstprogramm jq, um JSON-Daten anzuzeigen und ihre Lesbarkeit zu erhöhen.We use the jq utility, which is installed by default on Azure Cloud Shell to display JSON data and make it more readable. Wenn Ihnen dieses Hilfsprogramm nicht gefällt, können Sie den Teil | jq aller verwendeten Befehle einfach entfernen.If you don't like that utility, you can safely remove the | jq part of all the commands we'll use.

Erstellen einer Instanz von Azure-Datenbank für MySQLCreate an Azure Database for MySQL instance

Das erste, was wir erstellen, ist ein verwalteter MySQL-Server.The first thing we'll create is a managed MySQL server.

Hinweis

Ausführlichere Informationen zum Erstellen von MySQL-Servern finden Sie unter Erstellen eines Azure Database for MySQL-Servers im Azure-Portal.You can read more detailed information about creating MySQL servers in Create an Azure Database for MySQL server by using the Azure portal.

Führen Sie in der Azure Cloud Shell das folgende Skript aus:In Azure Cloud Shell, run the following script:

az mysql server create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME \
    --location $AZ_LOCATION \
    --sku-name B_Gen5_1 \
    --storage-size 5120 \
    --admin-user $AZ_MYSQL_USERNAME \
    --admin-password $AZ_MYSQL_PASSWORD \
  	| jq

Mit diesem Befehl wird ein kleiner MySQL-Server erstellt.This command creates a small MySQL server.

Konfigurieren einer Firewallregel für den MySQL-ServerConfigure a firewall rule for your MySQL server

Azure Database for MySQL-Instanzen sind standardmäßig gesichert.Azure Database for MySQL instances are secured by default. Sie besitzen eine Firewall, die keine eingehenden Verbindungen zulässt.They have a firewall that doesn't allow any incoming connection. Damit Sie die Datenbank verwenden können, müssen Sie eine Firewallregel hinzufügen, die den Zugriff der lokalen IP-Adresse auf den Datenbankserver zulässt.To be able to use your database, you need to add a firewall rule that will allow the local IP address to access the database server.

Da Sie die lokale IP-Adresse zu Beginn dieses Artikels konfiguriert haben, können Sie die Firewall des Servers öffnen, indem Sie Folgendes ausführen:Because you configured our local IP address at the beginning of this article, you can open the server's firewall by running:

az mysql server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME-database-allow-local-ip \
    --server $AZ_DATABASE_NAME \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS \
  	| jq

Konfigurieren einer MySQL-DatenbankConfigure a MySQL database

Der MySQL-Server, den Sie zuvor erstellt haben, ist leer.The MySQL server that you created earlier is empty. Er verfügt über keine Datenbank, die Sie mit der Java-Anwendung verwenden können.It doesn't have any database that you can use with the Java application. Erstellen Sie eine neue Datenbank mit dem Namen demo:Create a new database called demo:

az mysql db create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name demo \
    --server-name $AZ_DATABASE_NAME \
  	| jq

Erstellen eines neuen Java-ProjektsCreate a new Java project

Erstellen Sie mit Ihrer bevorzugten IDE ein neues Java-Projekt, und fügen Sie im Stammverzeichnis eine pom.xml-Datei hinzu:Using your favorite IDE, create a new Java project, and add a pom.xml file in its root directory:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
    </dependencies>
</project>

Dabei handelt es sich um eine Apache Maven-Datei, die das Projekt für die Verwendung folgender Komponenten konfiguriert:This file is an Apache Maven that configures our project to use:

  • Java 8Java 8
  • Aktueller MySQL-Treiber für JavaA recent MySQL driver for Java

Vorbereiten einer Konfigurationsdatei für das Herstellen einer Verbindung mit Azure Database for MySQLPrepare a configuration file to connect to Azure Database for MySQL

Erstellen Sie eine Datei vom Typ src/main/resources/application.properties , und fügen Sie Folgendes hinzu:Create a src/main/resources/application.properties file, and add:

url=jdbc:mysql://$AZ_DATABASE_NAME.mysql.database.azure.com:3306/demo?serverTimezone=UTC
user=demo@$AZ_DATABASE_NAME
password=$AZ_MYSQL_PASSWORD
  • Ersetzen Sie die beiden Variablen $AZ_DATABASE_NAME durch den Wert, den Sie zu Beginn dieses Artikels konfiguriert haben.Replace the two $AZ_DATABASE_NAME variables with the value that you configured at the beginning of this article.
  • Ersetzen Sie die Variable $AZ_MYSQL_PASSWORD durch den Wert, den Sie zu Beginn dieses Artikels konfiguriert haben.Replace the $AZ_MYSQL_PASSWORD variable with the value that you configured at the beginning of this article.

Hinweis

Sie fügen ?serverTimezone=UTC an die Konfigurationseigenschaft url an, um den JDBC-Treiber anzuweisen, beim Herstellen einer Verbindung mit der Datenbank das Datumsformat UTC (Coordinated Universal Time, koordinierte Weltzeit) zu verwenden.We append ?serverTimezone=UTC to the configuration property url, to tell the JDBC driver to use the UTC date format (or Coordinated Universal Time) when connecting to the database. Andernfalls verwendet Ihr Java-Server nicht das gleiche Datumsformat wie die Datenbank, was zu einem Fehler führen würde.Otherwise, our Java server would not use the same date format as the database, which would result in an error.

Erstellen einer SQL-Datei zum Generieren des DatenbankschemasCreate an SQL file to generate the database schema

Sie verwenden eine Datei vom Typ src/main/resources/schema.sql , um ein Datenbankschema zu erstellen.We will use a src/main/resources/schema.sql file in order to create a database schema. Erstellen Sie diese Datei mit folgendem Inhalt:Create that file, with the following content:

DROP TABLE IF EXISTS todo;
CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);

Codieren der AnwendungCode the application

Herstellen der Verbindung mit der DatenbankConnect to the database

Fügen Sie als Nächstes den Java-Code hinzu, der JDBC zum Speichern und Abrufen von Daten auf Ihrem MySQL-Server verwendet.Next, add the Java code that will use JDBC to store and retrieve data from your MySQL server.

Erstellen Sie eine Datei vom Typ src/main/java/DemoApplication.java , die Folgendes enthält:Create a src/main/java/DemoApplication.java file, that contains:

package com.example.demo;

import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread;

import java.sql.*;
import java.util.*;
import java.util.logging.Logger;

public class DemoApplication {

    private static final Logger log;

    static {
        System.setProperty("java.util.logging.SimpleFormatter.format", "[%4$-7s] %5$s %n");
        log =Logger.getLogger(DemoApplication.class.getName());
    }

    public static void main(String[] args) throws Exception {
        log.info("Loading application properties");
        Properties properties = new Properties();
        properties.load(DemoApplication.class.getClassLoader().getResourceAsStream("application.properties"));

        log.info("Connecting to the database");
        Connection connection = DriverManager.getConnection(properties.getProperty("url"), properties);
        log.info("Database connection test: " + connection.getCatalog());

        log.info("Create database schema");
        Scanner scanner = new Scanner(DemoApplication.class.getClassLoader().getResourceAsStream("schema.sql"));
        Statement statement = connection.createStatement();
        while (scanner.hasNextLine()) {
            statement.execute(scanner.nextLine());
        }

        /*
        Todo todo = new Todo(1L, "configuration", "congratulations, you have set up JDBC correctly!", true);
        insertData(todo, connection);
        todo = readData(connection);
        todo.setDetails("congratulations, you have updated data!");
        updateData(todo, connection);
        deleteData(todo, connection);
        */

        log.info("Closing database connection");
        connection.close();
        AbandonedConnectionCleanupThread.uncheckedShutdown();
    }
}

Dieser Java-Code verwendet die weiter oben erstellten Dateien application.properties und schema.sql , um eine Verbindung mit dem MySQL-Server herzustellen und ein Schema zu erstellen, in dem Ihre Daten gespeichert werden.This Java code will use the application.properties and the schema.sql files that we created earlier, in order to connect to the MySQL server and create a schema that will store our data.

Sie sehen, dass in dieser Datei Methoden zum Einfügen, Lesen, Aktualisieren und Löschen von Daten kommentiert wurden: Diese Methoden werden im verbleibenden Artikel codiert, und Sie können nacheinander die Auskommentierung aufheben.In this file, you can see that we commented methods to insert, read, update and delete data: we will code those methods in the rest of this article, and you will be able to uncomment them one after each other.

Hinweis

Die Datenbankanmeldeinformationen werden in den Eigenschaften user und password der Datei application.properties gespeichert.The database credentials are stored in the user and password properties of the application.properties file. Diese Anmeldeinformationen werden bei der Ausführung von DriverManager.getConnection(properties.getProperty("url"), properties); verwendet, da die Eigenschaftendatei als Argument übergeben wird.Those credentials are used when executing DriverManager.getConnection(properties.getProperty("url"), properties);, as the properties file is passed as an argument.

Hinweis

Bei der Zeile AbandonedConnectionCleanupThread.uncheckedShutdown(); am Ende handelt es sich um einen für den MySQL-Treiber spezifischen Befehl, um beim Herunterfahren der Anwendung einen internen Thread zu zerstören.The AbandonedConnectionCleanupThread.uncheckedShutdown(); line at the end is a MySQL driver specific command to destroy an internal thread when shutting down the application. Sie können sie ignorieren.It can be safely ignored.

Sie können diese Hauptklasse nun mit Ihrem bevorzugten Tool ausführen:You can now execute this main class with your favorite tool:

  • Bei Verwendung Ihrer IDE sollten Sie mit der rechten Maustaste auf die Klasse DemoApplication klicken und diese ausführen können.Using your IDE, you should be able to right-click on the DemoApplication class and execute it.
  • Bei Verwendung von Maven können Sie die Anwendung mithilfe von mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication" ausführen.Using Maven, you can run the application by executing: mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication".

Die Anwendung sollte eine Verbindung mit Azure Database for MySQL herstellen, ein Datenbankschema erstellen und die Verbindung dann trennen, wie in den Konsolenprotokollen gezeigt:The application should connect to the Azure Database for MySQL, create a database schema, and then close the connection, as you should see in the console logs:

[INFO   ] Loading application properties 
[INFO   ] Connecting to the database 
[INFO   ] Database connection test: demo 
[INFO   ] Create database schema 
[INFO   ] Closing database connection 

Erstellen einer DomänenklasseCreate a domain class

Erstellen Sie neben der Klasse DemoApplication eine neue Todo-Java-Klasse, und fügen Sie den folgenden Code hinzu:Create a new Todo Java class, next to the DemoApplication class, and add the following code:

package com.example.demo;

public class Todo {

    private Long id;
    private String description;
    private String details;
    private boolean done;

    public Todo() {
    }

    public Todo(Long id, String description, String details, boolean done) {
        this.id = id;
        this.description = description;
        this.details = details;
        this.done = done;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getDetails() {
        return details;
    }

    public void setDetails(String details) {
        this.details = details;
    }

    public boolean isDone() {
        return done;
    }

    public void setDone(boolean done) {
        this.done = done;
    }

    @Override
    public String toString() {
        return "Todo{" +
                "id=" + id +
                ", description='" + description + '\'' +
                ", details='" + details + '\'' +
                ", done=" + done +
                '}';
    }
}

Bei dieser Klasse handelt es sich um ein Domänenmodell, das der todo-Tabelle zugeordnet ist, die Sie beim Ausführen des Skripts schema.sql erstellt haben.This class is a domain model mapped on the todo table that you created when executing the schema.sql script.

Einfügen von Daten in Azure Database for MySQLInsert data into Azure Database for MySQL

Fügen Sie in der Datei src/main/java/DemoApplication.java nach der main-Methode die folgende Methode ein, um Daten in die Datenbank einzufügen:In the src/main/java/DemoApplication.java file, after the main method, add the following method to insert data into the database:

private static void insertData(Todo todo, Connection connection) throws SQLException {
    log.info("Insert data");
    PreparedStatement insertStatement = connection
            .prepareStatement("INSERT INTO todo (id, description, details, done) VALUES (?, ?, ?, ?);");

    insertStatement.setLong(1, todo.getId());
    insertStatement.setString(2, todo.getDescription());
    insertStatement.setString(3, todo.getDetails());
    insertStatement.setBoolean(4, todo.isDone());
    insertStatement.executeUpdate();
}

Sie können die Auskommentierung der beiden folgenden Zeilen in der Methode main aufheben:You can now uncomment the two following lines in the main method:

Todo todo = new Todo(1L, "configuration", "congratulations, you have set up JDBC correctly!", true);
insertData(todo, connection);

Das Ausführen der Hauptklasse sollte nun die folgende Ausgabe ergeben:Executing the main class should now produce the following output:

[INFO   ] Loading application properties 
[INFO   ] Connecting to the database 
[INFO   ] Database connection test: demo 
[INFO   ] Create database schema 
[INFO   ] Insert data 
[INFO   ] Closing database connection

Lesen von Daten aus Azure Database for MySQLReading data from Azure Database for MySQL

Lesen Sie die zuvor eingefügten Daten, um zu überprüfen, ob der Code ordnungsgemäß funktioniert.Let's read the data previously inserted, to validate that our code works correctly.

Fügen Sie in der Datei src/main/java/DemoApplication.java nach der insertData-Methode die folgende Methode ein, um Daten aus der Datenbank zu lesen:In the src/main/java/DemoApplication.java file, after the insertData method, add the following method to read data from the database:

private static Todo readData(Connection connection) throws SQLException {
    log.info("Read data");
    PreparedStatement readStatement = connection.prepareStatement("SELECT * FROM todo;");
    ResultSet resultSet = readStatement.executeQuery();
    if (!resultSet.next()) {
        log.info("There is no data in the database!");
        return null;
    }
    Todo todo = new Todo();
    todo.setId(resultSet.getLong("id"));
    todo.setDescription(resultSet.getString("description"));
    todo.setDetails(resultSet.getString("details"));
    todo.setDone(resultSet.getBoolean("done"));
    log.info("Data read from the database: " + todo.toString());
    return todo;
}

Sie können die Auskommentierung der folgenden Zeile nun in der Methode main aufheben:You can now uncomment the following line in the main method:

todo = readData(connection);

Das Ausführen der Hauptklasse sollte nun die folgende Ausgabe ergeben:Executing the main class should now produce the following output:

[INFO   ] Loading application properties 
[INFO   ] Connecting to the database 
[INFO   ] Database connection test: demo 
[INFO   ] Create database schema 
[INFO   ] Insert data 
[INFO   ] Read data 
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have set up JDBC correctly!', done=true} 
[INFO   ] Closing database connection 

Aktualisieren von Daten in Azure Database for MySQLUpdating data in Azure Database for MySQL

Aktualisieren Sie die zuvor eingefügten Daten.Let's update the data we previously inserted.

Fügen Sie in der Datei src/main/java/DemoApplication.java nach der readData-Methode die folgende Methode ein, um die Daten in der Datenbank zu aktualisieren:Still in the src/main/java/DemoApplication.java file, after the readData method, add the following method to update data inside the database:

private static void updateData(Todo todo, Connection connection) throws SQLException {
    log.info("Update data");
    PreparedStatement updateStatement = connection
            .prepareStatement("UPDATE todo SET description = ?, details = ?, done = ? WHERE id = ?;");

    updateStatement.setString(1, todo.getDescription());
    updateStatement.setString(2, todo.getDetails());
    updateStatement.setBoolean(3, todo.isDone());
    updateStatement.setLong(4, todo.getId());
    updateStatement.executeUpdate();
    readData(connection);
}

Sie können die Auskommentierung der beiden folgenden Zeilen in der Methode main aufheben:You can now uncomment the two following lines in the main method:

todo.setDetails("congratulations, you have updated data!");
updateData(todo, connection);

Das Ausführen der Hauptklasse sollte nun die folgende Ausgabe ergeben:Executing the main class should now produce the following output:

[INFO   ] Loading application properties 
[INFO   ] Connecting to the database 
[INFO   ] Database connection test: demo 
[INFO   ] Create database schema 
[INFO   ] Insert data 
[INFO   ] Read data 
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have set up JDBC correctly!', done=true} 
[INFO   ] Update data 
[INFO   ] Read data 
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have updated data!', done=true} 
[INFO   ] Closing database connection 

Löschen von Daten in Azure Database for MySQLDeleting data in Azure Database for MySQL

Löschen Sie die zuvor eingefügten Daten.Finally, let's delete the data we previously inserted.

Fügen Sie in der Datei src/main/java/DemoApplication.java nach der updateData-Methode die folgende Methode ein, um die Daten in der Datenbank zu löschen:Still in the src/main/java/DemoApplication.java file, after the updateData method, add the following method to delete data inside the database:

private static void deleteData(Todo todo, Connection connection) throws SQLException {
    log.info("Delete data");
    PreparedStatement deleteStatement = connection.prepareStatement("DELETE FROM todo WHERE id = ?;");
    deleteStatement.setLong(1, todo.getId());
    deleteStatement.executeUpdate();
    readData(connection);
}

Sie können die Auskommentierung der folgenden Zeile nun in der Methode main aufheben:You can now uncomment the following line in the main method:

deleteData(todo, connection);

Das Ausführen der Hauptklasse sollte nun die folgende Ausgabe ergeben:Executing the main class should now produce the following output:

[INFO   ] Loading application properties 
[INFO   ] Connecting to the database 
[INFO   ] Database connection test: demo 
[INFO   ] Create database schema 
[INFO   ] Insert data 
[INFO   ] Read data 
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have set up JDBC correctly!', done=true} 
[INFO   ] Update data 
[INFO   ] Read data 
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have updated data!', done=true} 
[INFO   ] Delete data 
[INFO   ] Read data 
[INFO   ] There is no data in the database! 
[INFO   ] Closing database connection 

Bereinigen von RessourcenClean up resources

Glückwunsch!Congratulations! Sie haben eine Java-Anwendung erstellt, die JDBC zum Speichern und Abrufen von Daten in bzw. aus Azure Database for MySQL verwendet.You've created a Java application that uses JDBC to store and retrieve data from Azure Database for MySQL.

Löschen Sie die Ressourcengruppe mit dem folgenden Befehl, um alle in dieser Schnellstartanleitung verwendeten Ressourcen zu bereinigen:To clean up all resources used during this quickstart, delete the resource group using the following command:

az group delete \
    --name $AZ_RESOURCE_GROUP \
    --yes

Nächste SchritteNext steps