Utiliser Java et JDBC avec Azure Database pour MySQL - Serveur flexible
S’APPLIQUE À : Azure Database pour MySQL – Serveur flexible
Cette rubrique illustre la création d’un exemple d’application qui utilise Java et JDBC pour stocker et récupérer des informations sur un serveur flexible Azure Database pour MySQL.
JDBC est l’API Java standard pour se connecter à des bases de données relationnelles classiques.
Dans cet article, nous inclurons deux méthodes d’authentification : l’authentification Microsoft Entra et l’authentification MySQL. L’onglet Sans mot de passe affiche l’authentification Microsoft Entra et l’onglet Mot de passe l’authentification MySQL.
L’authentification Microsoft Entra est un mécanisme permettant de se connecter à un serveur flexible Azure Database pour MySQL à l’aide d’identités définies dans Microsoft Entra ID. Avec l’authentification Microsoft Entra, vous pouvez gérer les identités des utilisateurs de base de données et d’autres services Microsoft dans un emplacement centralisé, ce qui simplifie la gestion des autorisations.
L’authentification MySQL utilise des comptes stockés dans MySQL. Si vous choisissez d’utiliser des mots de passe comme informations d’identification pour les comptes, ces informations d’identification sont stockées dans la table user
. Comme ces mots de passe sont stockés dans MySQL, vous devez gérer vous-même la rotation des mots de passe.
Prérequis
- Un compte Azure avec un abonnement actif. Si vous n’en avez pas, créez un compte Azure gratuit avant de commencer. Actuellement, avec un compte gratuit Azure, vous pouvez essayer gratuitement Azure Database pour MySQL – Serveur flexible pendant 12 mois. Pour plus d’informations, consultez Essayer gratuitement Azure Database pour MySQL – Serveur flexible.
- Azure Cloud Shell ou Azure CLI. Nous vous recommandons d’utiliser Azure Cloud Shell. Vous serez ainsi connecté automatiquement et vous aurez accès à tous les outils dont vous avez besoin.
- Un Java Development Kit pris en charge, version 8 (inclus dans Azure Cloud Shell).
- L’outil de build Apache Maven.
Préparer l’environnement de travail
Tout d’abord, utilisez la commande suivante pour configurer certaines variables d’environnement.
export AZ_RESOURCE_GROUP=database-workshop
export AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>
export AZ_LOCATION=<YOUR_AZURE_REGION>
export AZ_MYSQL_AD_NON_ADMIN_USERNAME=demo-non-admin
export AZ_USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGED_IDENTITY_NAME>
export CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName -o tsv)
export CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id -o tsv)
Remplacez les espaces réservés par les valeurs suivantes, qui sont utilisées dans cet article :
<YOUR_DATABASE_NAME>
: le nom de votre instance de serveur flexible Azure Database pour MySQL, qui doit être unique dans Azure.<YOUR_AZURE_REGION>
: région Azure que vous allez utiliser. Vous pouvez utilisereastus
par défaut, mais nous vous recommandons de configurer une région plus proche de l’endroit où vous vivez. Vous pouvez voir la liste complète des régions disponibles en entrantaz account list-locations
.<YOUR_USER_ASSIGNED_MANAGED_IDENTITY_NAME>
: Le nom du serveur d’identité managée affectée par l’utilisateur, qui doit être unique dans tout Azure.
Créez ensuite un groupe de ressources :
az group create \
--name $AZ_RESOURCE_GROUP \
--location $AZ_LOCATION \
--output tsv
Créer une instance Azure Database pour MySQL
Créer une instance de serveur flexible Azure Database pour MySQL et configurer un utilisateur administrateur
Vous commencez par créer une instance de serveur flexible Azure Database pour MySQL managée.
Remarque
Vous pouvez lire des informations plus détaillées sur la création de serveurs MySQL dans Créer une instance de serveur flexible Azure Database pour MySQL à l’aide du Portail Azure.
Si vous utilisez Azure CLI, exécutez la commande suivante pour vous assurer de disposer d’une autorisation suffisante :
az login --scope https://graph.microsoft.com/.default
Exécutez la commande suivante pour créer le serveur :
az mysql flexible-server create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME \
--location $AZ_LOCATION \
--yes \
--output tsv
Exécutez la commande suivante pour créer une identité affectée par l’utilisateur pour affecter :
az identity create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_USER_IDENTITY_NAME
Important
Après avoir créé l’identité affectée par l’utilisateur, demandez à un utilisateur disposant au moins du rôle Administrateur de rôle privilégié d’accorder les autorisations suivantes pour cette identité managée affectée par l’utilisateur : User.Read.All
, GroupMember.Read.All
et Application.Read.ALL
. Vous pouvez également attribuer à l’identité managée affectée par l’utilisateur le rôle Lecteurs de répertoire. Pour plus d’informations, consultez la section Autorisations d’Authentification Active Directory.
Exécutez la commande suivante pour affecter l’identité au serveur flexible Azure Database pour MySQL pour créer l’administrateur Microsoft Entra :
az mysql flexible-server identity assign \
--resource-group $AZ_RESOURCE_GROUP \
--server-name $AZ_DATABASE_NAME \
--identity $AZ_USER_IDENTITY_NAME
Exécutez la commande suivante pour définir l’utilisateur administrateur Microsoft Entra :
az mysql flexible-server ad-admin create \
--resource-group $AZ_RESOURCE_GROUP \
--server-name $AZ_DATABASE_NAME \
--display-name $CURRENT_USERNAME \
--object-id $CURRENT_USER_OBJECTID \
--identity $AZ_USER_IDENTITY_NAME
Important
Lorsque vous définissez l’administrateur, un nouvel utilisateur est ajouté à l’instance de serveur flexible Azure Database pour MySQL avec des autorisations d’administrateur complètes. Un seul administrateur Microsoft Entra peut être créé par instance de serveur flexible Azure Database pour MySQL et la sélection d’un autre administrateur remplacera l’administrateur Microsoft Entra existant configuré pour le serveur.
Cette commande crée une petite instance de serveur flexible Azure Database pour MySQL et définit l’administrateur Active Directory sur l’utilisateur connecté.
L’instance de serveur flexible Azure Database pour MySQL que vous avez créée a une base de données vide appelée flexibleserverdb
.
Vous rencontrez des problèmes ? Dites-le nous.
Configurer une règle de pare-feu pour votre instance de serveur flexible Azure Database pour MySQL
Les instances de serveur flexible Azure Database pour MySQL sont sécurisées par défaut. Elles ont un pare-feu qui n’autorise aucune connexion entrante.
Vous pouvez ignorer cette étape si vous utilisez Bash, car la commande flexible-server create
a déjà détecté votre adresse IP locale et l’a définie sur le serveur MySQL.
Si vous vous connectez à votre instance de serveur flexible Azure Database pour MySQL à partir du Sous-système Windows pour Linux (WSL) sur un ordinateur Windows, vous devez ajouter l’ID hôte WSL à votre pare-feu. Obtenez l’adresse IP de votre ordinateur hôte en exécutant la commande suivante dans WSL :
sudo cat /etc/resolv.conf
Copiez l’adresse IP suivant le terme nameserver
, puis utilisez la commande suivante pour définir une variable d’environnement pour l’adresse IP de WSL :
AZ_WSL_IP_ADDRESS=<the-copied-IP-address>
Ensuite, utilisez la commande suivante pour ouvrir le pare-feu du serveur sur votre application WSL :
az mysql flexible-server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME \
--start-ip-address $AZ_WSL_IP_ADDRESS \
--end-ip-address $AZ_WSL_IP_ADDRESS \
--rule-name allowiprange \
--output tsv
Configurer une base de données MySQL
Créez une base de données nommée demo
à l’aide de la commande suivante :
az mysql flexible-server db create \
--resource-group $AZ_RESOURCE_GROUP \
--database-name demo \
--server-name $AZ_DATABASE_NAME \
--output tsv
Créer un utilisateur non-administrateur MySQL et accorder des autorisations
Ensuite, créez un utilisateur non administrateur et accordez toutes les autorisations sur la base de données demo
.
Notes
Vous pouvez lire des informations plus détaillées sur la création d’utilisateurs MySQL dans Créer des utilisateurs dans Azure Database pour MySQL.
Créez un script SQL appelé create_ad_user.sql pour créer un utilisateur non administrateur. Ajoutez le contenu suivant et enregistrez-le localement :
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 '$AZ_MYSQL_AD_NON_ADMIN_USERNAME' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';
GRANT ALL PRIVILEGES ON demo.* TO '$AZ_MYSQL_AD_NON_ADMIN_USERNAME'@'%';
FLUSH privileges;
EOF
Utilisez ensuite la commande suivante pour exécuter le script SQL pour créer l’utilisateur non administrateur Microsoft Entra :
mysql -h $AZ_DATABASE_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql
Utilisez maintenant la commande suivante pour supprimer le fichier de script SQL temporaire :
rm create_ad_user.sql
Créer un projet Java
À l’aide de votre IDE favori, créez un projet Java, puis ajoutez un fichier pom.xml dans son répertoire racine :
<?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.30</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity-extensions</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
Il s’agit d’un fichier Apache Maven qui configure le projet pour qu’il utilise :
- Java 8
- Un pilote MySQL récent pour Java
Préparer un fichier de configuration pour se connecter à Azure Database pour MySQL
Exécutez le script suivant dans le répertoire racine du projet pour créer un fichier src/main/resources/database.properties et ajoutez des détails de configuration :
mkdir -p src/main/resources && touch src/main/resources/database.properties
cat << EOF > src/main/resources/database.properties
url=jdbc:mysql://${AZ_DATABASE_NAME}.mysql.database.azure.com:3306/demo?sslMode=REQUIRED&serverTimezone=UTC&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin
user=${AZ_MYSQL_AD_NON_ADMIN_USERNAME}
EOF
Notes
Si vous utilisez la classe MysqlConnectionPoolDataSource comme source de données dans votre application, supprimez « defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin » dans l’URL.
mkdir -p src/main/resources && touch src/main/resources/database.properties
cat << EOF > src/main/resources/database.properties
url=jdbc:mysql://${AZ_DATABASE_NAME}.mysql.database.azure.com:3306/demo?sslMode=REQUIRED&serverTimezone=UTC&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin
user=${AZ_MYSQL_AD_NON_ADMIN_USERNAME}
EOF
Notes
?serverTimezone=UTC
a été ajouté à la propriété de configuration url
pour indiquer au pilote JDBC d’utiliser le format de date UTC (Coordinated Universal Time) lors de la connexion à la base de données. Sans cela, votre serveur Java n’utiliserait pas le même format de date que la base de données, ce qui entraînerait une erreur.
Créer un fichier SQL pour générer le schéma de base de données
Vous allez utiliser un fichier src/main/resources/schema.sql pour créer un schéma de base de données. Créez ce fichier avec le contenu suivant :
DROP TABLE IF EXISTS todo;
CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
Coder l’application
Se connecter à la base de données
Ensuite, ajoutez le code Java qui utilisera JDBC pour stocker et récupérer des données à partir de votre serveur MySQL.
Créez un fichier src/main/java/DemoApplication.java, puis ajoutez le contenu suivant :
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("database.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();
}
}
Vous rencontrez des problèmes ? Dites-le nous.
Ce code Java utilise les fichiers database.properties et schema.sql que vous avez créés précédemment, afin de vous connecter à l’instance de serveur flexible Azure Database pour MySQL et de créer un schéma qui stockera vos données.
Dans ce fichier, vous pouvez voir que nous avons commenté des méthodes pour insérer, lire, mettre à jour et supprimer des données : vous allez coder ces méthodes dans le reste de cet article, et vous pourrez en supprimer les marques de commentaire les unes après les autres.
Notes
Les informations d’identification de base de données sont stockées dans les propriétés user et password du fichier database.properties. Ces informations d’identification sont utilisées lors de l’exécution de DriverManager.getConnection(properties.getProperty("url"), properties);
, car le fichier de propriétés est passé comme argument.
Notes
La ligne AbandonedConnectionCleanupThread.uncheckedShutdown();
à la fin est une commande spécifique du pilote MySQL visant à détruire un thread interne lors de l’arrêt de l’application.
Vous pouvez l’ignorer.
Vous pouvez maintenant exécuter cette classe main avec votre outil favori :
- Avec votre IDE, vous devez être en mesure de cliquer avec le bouton droit sur la classe DemoApplication et de l’exécuter.
- À l’aide de Maven, vous pouvez utiliser l’application en exécutant :
mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication"
.
L’application doit se connecter à l’instance de serveur flexible Azure Database pour MySQL, créer un schéma de base de données, puis fermer la connexion, comme vous devez le voir dans les journaux de la console :
[INFO ] Loading application properties
[INFO ] Connecting to the database
[INFO ] Database connection test: demo
[INFO ] Create database schema
[INFO ] Closing database connection
Créer une classe de domaine
Créez une classe Java Todo
parallèlement à la classe DemoApplication
, puis ajoutez le code suivant :
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 +
'}';
}
}
Cette classe est un modèle de domaine mappé sur la table todo
que vous avez créée lors de l’exécution du script schema.sql.
Insertion des données dans Azure Database pour MySQL
Dans le fichier src/main/java/DemoApplication.java, après la méthode main, ajoutez la méthode suivante pour insérer des données dans la base de données :
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();
}
Vous pouvez maintenant supprimer les marques de commentaire des deux lignes suivantes dans la méthode main
:
Todo todo = new Todo(1L, "configuration", "congratulations, you have set up JDBC correctly!", true);
insertData(todo, connection);
L’exécution de la classe main doit maintenant produire la sortie suivante :
[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
Lecture des données depuis Azure Database pour MySQL
Ensuite, lisez les données que vous avez précédemment insérées pour vérifier le bon fonctionnement de votre code.
Dans le fichier src/main/java/DemoApplication.java, après la méthode insertData
, ajoutez la méthode suivante pour lire des données de la base de données :
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;
}
Vous pouvez maintenant supprimer les marques de commentaire de la ligne suivante dans la méthode main
:
todo = readData(connection);
L’exécution de la classe main doit maintenant produire la sortie suivante :
[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
Vous rencontrez des problèmes ? Dites-le nous.
Mise à jour des données dans le serveur flexible Azure Database pour MySQL
Ensuite, mettez à jour les données que vous avez insérées précédemment.
Toujours dans le fichier src/main/java/DemoApplication.java, après la méthode readData
, ajoutez la méthode suivante pour mettre à jour des données dans la base de données :
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);
}
Vous pouvez maintenant supprimer les marques de commentaire des deux lignes suivantes dans la méthode main
:
todo.setDetails("congratulations, you have updated data!");
updateData(todo, connection);
L’exécution de la classe main doit maintenant produire la sortie suivante :
[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
Suppression de données dans le serveur flexible Azure Database pour MySQL
Enfin, supprimez les données que vous avez insérées précédemment.
Toujours dans le fichier src/main/java/DemoApplication.java, après la méthode updateData
, ajoutez la méthode suivante pour supprimer des données dans la base de données :
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);
}
Vous pouvez maintenant supprimer les marques de commentaire de la ligne suivante dans la méthode main
:
deleteData(todo, connection);
L’exécution de la classe main doit maintenant produire la sortie suivante :
[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
Nettoyer les ressources
Félicitations ! Vous avez créé une application Java qui utilise JDBC pour stocker et récupérer des données à partir d’un serveur flexible Azure Database pour MySQL.
Pour nettoyer toutes les ressources utilisées dans le cadre de ce guide de démarrage rapide, supprimez le groupe de ressources à l’aide de la commande suivante :
az group delete \
--name $AZ_RESOURCE_GROUP \
--yes