التشغيل السريع: استخدام Java وJDBC مع قاعدة بيانات Azure لـMySQL

ينطبق على: قاعدة بيانات Azure ل MySQL - خادم واحد

هام

قاعدة بيانات Azure لخادم MySQL الفردي على مسار الإيقاف. نوصي بشدة بالترقية إلى قاعدة بيانات Azure لخادم MySQL المرن. لمزيد من المعلومات حول الترحيل إلى خادم Azure Database for MySQL المرن، راجع ما الذي يحدث لقاعدة بيانات Azure لخادم MySQL الفردي؟

توضح هذه المقالة إنشاء نموذج تطبيق يستخدم Java وJDBC لتخزين المعلومات واستردادها في قاعدة بيانات Azure ل MySQL.

JDBC هو Java API القياسية للاتصال بقواعد البيانات العلائقية التقليدية.

في هذه المقالة، سنتضمن طريقتين للمصادقة: مصادقة Microsoft Entra ومصادقة MySQL. تعرض علامة التبويب Passwordless مصادقة Microsoft Entra وتعرض علامة التبويب Password مصادقة MySQL.

مصادقة Microsoft Entra هي آلية للاتصال بقاعدة بيانات Azure ل MySQL باستخدام الهويات المعرفة في معرف Microsoft Entra. باستخدام مصادقة Microsoft Entra، يمكنك إدارة هويات مستخدمي قاعدة البيانات خدمات Microsoft الأخرى في موقع مركزي، ما يبسط إدارة الأذونات.

تستخدم مصادقة MySQL الحسابات المخزنة في MySQL. إذا اخترت استخدام كلمات المرور كبيانات اعتماد للحسابات، تخزين بيانات الاعتماد هذه في user الجدول. نظرا إلى تخزين كلمات المرور هذه في MySQL، ستحتاج إلى إدارة تدوير كلمات المرور بنفسك.

المتطلبات الأساسية

أعِد بيئة العمل

أولا، إعداد بعض متغيرات البيئة. في Azure Cloud Shell، قم بتشغيل الأوامر التالية:

export AZ_RESOURCE_GROUP=database-workshop
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=demo
export AZ_LOCATION=<YOUR_AZURE_REGION>
export AZ_MYSQL_AD_NON_ADMIN_USERNAME=demo-non-admin
export AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>
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)

استبدل العناصر النائبة بالقيم التالية، والتي يتم استخدامها في هذه المقالة:

  • <YOUR_DATABASE_SERVER_NAME>: اسم خادم MySQL الخاص بك، والذي يجب أن يكون فريدا عبر Azure.
  • <YOUR_AZURE_REGION>: منطقة Azure التي ستستخدمها. يمكنك استخدام eastus بشكل افتراضي، لكننا نوصي بتكوين منطقة أقرب إلى المكان الذي تعيش فيه. يمكنك مشاهدة القائمة الكاملة للمناطق المتوفرة عن طريق إدخال az account list-locations.
  • <YOUR_LOCAL_IP_ADDRESS>: عنوان IP للكمبيوتر المحلي، الذي ستقوم بتشغيل تطبيقك منه. إحدى الطرق الملائمة للعثور عليه هي فتح whatismyip.akamai.com.

بعد ذلك، قم بإنشاء مجموعة موارد باستخدام الأمر التالي:

az group create \
    --name $AZ_RESOURCE_GROUP \
    --location $AZ_LOCATION \
    --output tsv

إنشاء قاعدة بيانات Azure Database لمثيل MySQL

إنشاء خادم MySQL وإعداد مستخدم مسؤول

أول شيء ستقوم بإنشائه هو خادم MySQL مدار.

إشعار

يمكنك قراءة معلومات أكثر تفصيلا حول إنشاء خوادم MySQL في التشغيل السريع: إنشاء قاعدة بيانات Azure لخادم MySQL باستخدام مدخل Microsoft Azure.

إذا كنت تستخدم Azure CLI، فقم بتشغيل الأمر التالي للتأكد من أن لديه الإذن الكافي:

az login --scope https://graph.microsoft.com/.default

ثم قم بتشغيل الأمر التالي لإنشاء الخادم:

az mysql server create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME \
    --location $AZ_LOCATION \
    --sku-name B_Gen5_1 \
    --storage-size 5120 \
    --output tsv

بعد ذلك، قم بتشغيل الأمر التالي لتعيين مستخدم مسؤول Microsoft Entra:

az mysql server ad-admin create \
    --resource-group $AZ_RESOURCE_GROUP \
    --server-name $AZ_DATABASE_SERVER_NAME \
    --display-name $CURRENT_USERNAME \
    --object-id $CURRENT_USER_OBJECTID

هام

عند تعيين المسؤول، تتم إضافة مستخدم جديد إلى قاعدة بيانات Azure لخادم MySQL بأذونات المسؤول الكاملة. يمكنك إنشاء مسؤول Microsoft Entra واحد فقط لكل خادم MySQL. سيؤدي تحديد مستخدم آخر إلى الكتابة فوق مسؤول Microsoft Entra الموجود الذي تم تكوينه للخادم.

ينشئ هذا الأمر خادم MySQL صغيرا ويعين مسؤول Active Directory إلى المستخدم الذي قام بتسجيل الدخول.

تكوين قاعدة جدار حماية لخادم MySQL

يتم تأمين قواعد بيانات Azure لمثيلات MySQL بشكل افتراضي. تحتوي هذه المثيلات على جدار حماية لا يسمح بأي اتصال وارد. لكي تتمكن من استخدام قاعدة البيانات الخاصة بك، تحتاج إلى إضافة قاعدة جدار حماية تسمح لعنوان IP المحلي للوصول إلى خادم قاعدة البيانات.

لأنه يمكنك تكوين عنوان IP المحلي في بداية هذه المقالة، يمكنك فتح جدار الحماية الخاص بالخادم عن طريق تشغيل الأمر التالي:

az mysql server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
    --server $AZ_DATABASE_SERVER_NAME \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS \
    --output tsv

إذا كنت تتصل بخادم MySQL من نظام Windows الفرعي لـ Linux (WSL) على كمبيوتر Windows، فستحتاج إلى إضافة معرف مضيف WSL إلى جدار الحماية الخاص بك.

احصل على عنوان IP للجهاز المضيف الخاص بك عن طريق تشغيل الأمر التالي في WSL:

cat /etc/resolv.conf

انسخ عنوان IP التالي للمصطلح nameserver، ثم استخدم الأمر التالي لتعيين متغير بيئة لعنوان IP WSL:

AZ_WSL_IP_ADDRESS=<the-copied-IP-address>

ثم استخدم الأمر التالي لفتح جدار حماية الخادم لتطبيقك المستند إلى WSL:

az mysql server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip-wsl \
    --server $AZ_DATABASE_SERVER_NAME \
    --start-ip-address $AZ_WSL_IP_ADDRESS \
    --end-ip-address $AZ_WSL_IP_ADDRESS \
    --output tsv

تكوين قاعدة بيانات MySQL

خادم MySQL الذي أنشأته سابقًا فارغ. استخدم الأمر التالي لإنشاء قاعدة بيانات جديدة.

az mysql db create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME \
    --server-name $AZ_DATABASE_SERVER_NAME \
    --output tsv

إنشاء مستخدم غير مسؤول MySQL ومنح الإذن

بعد ذلك، أنشئ مستخدما غير مسؤول وامنح جميع الأذونات لقاعدة البيانات.

إشعار

يمكنك قراءة معلومات أكثر تفصيلا حول إنشاء مستخدمي MySQL في إنشاء مستخدمين في قاعدة بيانات Azure ل MySQL.

إنشاء برنامج نصي SQL يسمى create_ad_user.sql لإنشاء مستخدم غير مسؤول. أضف المحتويات التالية واحفظها محليا:

export AZ_MYSQL_AD_NON_ADMIN_USERID=$CURRENT_USER_OBJECTID

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 $AZ_DATABASE_NAME.* TO '$AZ_MYSQL_AD_NON_ADMIN_USERNAME'@'%';

FLUSH privileges;

EOF

ثم استخدم الأمر التالي لتشغيل البرنامج النصي SQL لإنشاء مستخدم Microsoft Entra غير المسؤول:

mysql -h $AZ_DATABASE_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME@$AZ_DATABASE_SERVER_NAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql

الآن استخدم الأمر التالي لإزالة ملف البرنامج النصي SQL المؤقت:

rm create_ad_user.sql

إنشاء مشروع Java جديد

باستخدام IDE المفضل لديك، قم بإنشاء مشروع Java جديد باستخدام Java 8 أو أعلى. إنشاء ملف pom.xml في الدليل الجذر الخاص به وإضافة المحتويات التالية:

<?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>

هذا الملف هو ملف Apache Maven الذي يقوم بتكوين مشروعك لاستخدام Java 8 وبرنامج تشغيل MySQL الأخير ل Java.

إعداد ملف تكوين للاتصال بـ Azure Database for MySQL

قم بتشغيل البرنامج النصي التالي في الدليل الجذر للمشروع لإنشاء ملف src/main/resources/database.properties وإضافة تفاصيل التكوين:

mkdir -p src/main/resources && touch src/main/resources/database.properties

cat << EOF > src/main/resources/database.properties
url=jdbc:mysql://${AZ_DATABASE_SERVER_NAME}.mysql.database.azure.com:3306/${AZ_DATABASE_NAME}?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}@${AZ_DATABASE_SERVER_NAME}
EOF

إشعار

إذا كنت تستخدم فئة MysqlConnectionPoolDataSource كمصدر البيانات في التطبيق الخاص بك، فيرجى إزالة "defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin" في عنوان url.

mkdir -p src/main/resources && touch src/main/resources/database.properties

cat << EOF > src/main/resources/database.properties
url=jdbc:mysql://${AZ_DATABASE_SERVER_NAME}.mysql.database.azure.com:3306/${AZ_DATABASE_NAME}?sslMode=REQUIRED&serverTimezone=UTC&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin
user=${AZ_MYSQL_AD_NON_ADMIN_USERNAME}@${AZ_DATABASE_SERVER_NAME}
EOF

إشعار

تم ?serverTimezone=UTC إلحاق خاصية url التكوين لإخبار برنامج تشغيل JDBC باستخدام تنسيق التاريخ UTC (أو التوقيت العالمي المتفق عليه) عند الاتصال بقاعدة البيانات. وإلا، لن يستخدم خادم Java تنسيق التاريخ نفسه مثل قاعدة البيانات، مما قد يؤدي إلى حدوث خطأ.

إنشاء ملف SQL لإنشاء مخطط قاعدة البيانات

بعد ذلك، ستستخدم ملف src/main/resources/schema.sql لإنشاء مخطط قاعدة بيانات. أنشئ هذا الملف، ثم أضف المحتويات التالية:

touch src/main/resources/schema.sql

cat << EOF > src/main/resources/schema.sql
DROP TABLE IF EXISTS todo;
CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
EOF

إنشاء التعليمة البرمجية للتطبيق

الاتصال بقاعدة البيانات

بعد ذلك، أضف التعليمات البرمجية لـ Java التي سوف تستخدم JDBC لتخزين البيانات واستردادها من خادم MySQL.

إنشاء ملف src/main/java/DemoApplication.java وإضافة المحتويات التالية:

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());
        }

        /* Prepare to store and retrieve data from the MySQL server.
        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();
    }
}

سيستخدم رمز Java هذا قاعدة البيانات.properties وملفات schema.sql التي قمت بإنشائها سابقا. بعد الاتصال بخادم MySQL، يمكنك إنشاء مخطط لتخزين بياناتك.

في هذا الملف، يمكنك أن ترى أننا علقنا على أساليب لإدراج البيانات وقراءتها وتحديثها وحذفها. ستقوم بتنفيذ هذه الأساليب في بقية هذه المقالة، وستتمكن من إلغاء تعليقها واحدا تلو الآخر.

إشعار

يتم تخزين بيانات اعتماد قاعدة البيانات في خصائص المستخدم وكلمة المرور لملف database.properties . يتم استخدام بيانات الاعتماد هذه عند تنفيذ DriverManager.getConnection(properties.getProperty("url"), properties);، كما يتم تمرير ملف الخصائص كوسيط.

إشعار

AbandonedConnectionCleanupThread.uncheckedShutdown(); السطر في النهاية هو أمر برنامج تشغيل MySQL لتدمير مؤشر ترابط داخلي عند إيقاف تشغيل التطبيق. يمكنك تجاهل هذا السطر بأمان.

يمكنك الآن تنفيذ هذه الفئة الرئيسة باستخدام الأداة المفضلة لديك:

  • باستخدام IDE الخاص بك، يجب أن تتمكن من النقر بزر الماوس الأيمن على الفئة DemoApplication وتنفيذها.
  • باستخدام Maven، يمكنك تشغيل التطبيق باستخدام الأمر التالي: mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication".

يجب أن يتصل التطبيق بقاعدة بيانات Azure ل MySQL، وأنشئ مخطط قاعدة بيانات، ثم أغلق الاتصال. يجب أن تشاهد إخراجا مشابها للمثال التالي في سجلات وحدة التحكم:

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

إنشاء فئة المجال

إنشاء Todo فئة Java جديدة، بجانب DemoApplicationالفئة، وإضافة التعليمة البرمجية التالية:

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 +
                '}';
    }
}

هذه الفئة هي نموذج لمجال معين في جدول todo الذي قمت بإنشائه عند تنفيذ البرنامج النصي schema.sql.

إدراج البيانات في قاعدة بيانات Azure لـMySQL

في الملف src/main/java/DemoApplication.java، بعد الأسلوب الرئيسي، أضف الأسلوب التالي لإدراج البيانات في قاعدة البيانات:

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();
}

يمكنك الآن إلغاء التعليق على السطرين التاليين في الأسلوب main:

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

يجب أن يؤدي تنفيذ الفئة الرئيسة الآن إلى إنتاج الإخراج التالي:

[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

قراءة البيانات من Azure Database for MySQL

بعد ذلك، اقرأ البيانات التي تم إدراجها مسبقا للتحقق من أن التعليمات البرمجية تعمل بشكل صحيح.

في الملف src/main/java/DemoApplication.java، بعد الأسلوب insertData، أضف الأسلوب التالي لقراءة البيانات من قاعدة البيانات:

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

يمكنك الآن إلغاء التعليق على السطر التالي في الأسلوب main:

todo = readData(connection);

يجب أن يؤدي تنفيذ الفئة الرئيسة الآن إلى إنتاج الإخراج التالي:

[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

تحديث البيانات الموجودة في Azure Database for MySQL

بعد ذلك، قم بتحديث البيانات التي قمت بإدراجها مسبقا.

في الملف src/main/java/DemoApplication.java، بعد الأسلوب readData، أضف الأسلوب التالي لتحديث البيانات الموجودة داخل قاعدة البيانات:

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);
}

يمكنك الآن إلغاء التعليق على السطرين التاليين في الأسلوب main:

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

يجب أن يؤدي تنفيذ الفئة الرئيسة الآن إلى إنتاج الإخراج التالي:

[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

حذف البيانات الموجودة في Azure Database for MySQL

وأخيرا، احذف البيانات التي قمت بإدراجها مسبقا.

في الملف src/main/java/DemoApplication.java، بعد الأسلوب updateData، أضف الأسلوب التالي لحذف البيانات الموجودة داخل قاعدة البيانات:

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);
}

يمكنك الآن إلغاء التعليق على السطر التالي في الأسلوب main:

deleteData(todo, connection);

يجب أن يؤدي تنفيذ الفئة الرئيسة الآن إلى إنتاج الإخراج التالي:

[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

تنظيف الموارد

تهانينا! أنشأت تطبيق Java يستخدم JDBC لتخزين البيانات واستردادها من قاعدة بيانات Azure لـMySQL.

لتنظيف جميع الموارد المستخدمة في أثناء هذا التشغيل السريع حذف مجموعة الموارد باستخدام الأمر التالي:

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

الخطوات التالية