إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
توضح هذه المقالة إنشاء نموذج تطبيق يستخدم 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 مع اشتراك نشط.
إذا لم يكن لديك اشتراك في Azure، فأنشئ حساب Azure مجاني قبل أن تبدأ. حاليا، باستخدام حساب Azure المجاني، يمكنك تجربة Azure Database for MySQL - Flexible Server مجانا لمدة 12 شهرا. لمزيد من المعلومات، راجع استخدام حساب Azure المجاني لتجربة Azure Database for MySQL - Flexible Server مجانا.
Azure Cloud ShellأوAzure CLI. نوصي باستخدام Azure Cloud Shell حتى تكون مسجلا الدخول تلقائيا ولديك وصول إلى جميع الأدوات التي تحتاجها.
حزمة تطوير Java مدعومة، الإصدار 8 (مضمن في Azure Cloud Shell).
أداة الإنشاء Apache Maven.
أعِد بيئة العمل
أولا، استخدم الأمر التالي لإعداد بعض متغيرات البيئة.
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)
استبدل العناصر النائبة بالقيم التالية، والتي يتم استخدامها في هذه المقالة:
-
<YOUR_DATABASE_NAME>: اسم مثيل Azure Database for MySQL Flexible Server، والذي يجب أن يكون فريدا عبر Azure. -
<YOUR_AZURE_REGION>: المنطقة الأزرق التي تستخدمها. يمكنك استخدامeastusبشكل افتراضي، لكننا نوصي بتكوين منطقة أقرب إلى المكان الذي تعيش فيه. يمكنك مشاهدة القائمة الكاملة للمناطق المتوفرة عن طريق إدخالaz account list-locations. -
<YOUR_USER_ASSIGNED_MANAGED_IDENTITY_NAME>: اسم خادم الهوية المدارة المعين من قبل المستخدم، والذي يجب أن يكون فريدا عبر Azure.
بعد ذلك، أنشئ مجموعة موارد:
az group create \
--name $AZ_RESOURCE_GROUP \
--location $AZ_LOCATION \
--output tsv
إنشاء قاعدة بيانات Azure Database لمثيل MySQL
إنشاء قاعدة بيانات Azure لمثيل خادم MySQL المرن وإعداد مستخدم مسؤول
أول شيء تقوم بإنشائه هو قاعدة بيانات Azure المدارة لمثيل خادم MySQL المرن.
إشعار
يمكنك قراءة معلومات أكثر تفصيلا حول إنشاء خوادم MySQL في التشغيل السريع: إنشاء مثيل لقاعدة بيانات Azure ل MySQL باستخدام مدخل Microsoft Azure.
إذا كنت تستخدم Azure CLI، فقم بتشغيل الأمر التالي للتأكد من أن لديه الإذن الكافي:
az login --scope https://graph.microsoft.com/.default
قم بتشغيل الأمر التالي لإنشاء الخادم:
az mysql flexible-server create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME \
--location $AZ_LOCATION \
--yes \
--output tsv
قم بتشغيل الأمر التالي لإنشاء هوية معينة من قبل المستخدم لتعيين:
az identity create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_USER_IDENTITY_NAME
هام
بعد إنشاء الهوية المعينة من قبل المستخدم، اطلب من المستخدم الذي لديه على الأقل دور مسؤول الدور المميز منح الأذونات التالية لهذه الهوية المدارة المعينة من قبل المستخدم: User.Read.Allو GroupMember.Read.Allو Application.Read.ALL. بدلا من ذلك، امنح الهوية المدارة المعينة من قبل المستخدم دور قراء الدليل. لمزيد من المعلومات، راجع قسم الأذونات في مصادقة Microsoft Entra لقاعدة بيانات Azure ل MySQL - الخادم المرن.
قم بتشغيل الأمر التالي لتعيين الهوية إلى قاعدة بيانات Azure لخادم MySQL المرن لإنشاء مسؤول Microsoft Entra:
az mysql flexible-server identity assign \
--resource-group $AZ_RESOURCE_GROUP \
--server-name $AZ_DATABASE_NAME \
--identity $AZ_USER_IDENTITY_NAME
قم بتشغيل الأمر التالي لتعيين مستخدم مسؤول 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
هام
عند تعيين المسؤول، تتم إضافة مستخدم جديد إلى قاعدة بيانات Azure لمثيل خادم MySQL المرن بأذونات المسؤول الكاملة. يتوفر مسؤول Microsoft Entra واحد فقط لكل نسخة خادم. اختيار جهاز آخر يكتب فوق مسؤول Microsoft Entra الحالي.
ينشئ هذا الأمر قاعدة بيانات Azure صغيرة لمثيل خادم MySQL المرن ويعين مسؤول Active Directory إلى المستخدم الذي قام بتسجيل الدخول.
يحتوي مثيل Azure Database for MySQL Flexible Server الذي قمت بإنشائه على قاعدة بيانات فارغة تسمى flexibleserverdb.
هل تواجه أي مشاكل؟ أبلغنا بها.
تكوين قاعدة جدار حماية لمثيل Azure Database for MySQL Flexible Server
جدار الحماية الآمن بالافتراضي مهيأ لمنع أي اتصال وارد.
يمكنك تخطي هذه الخطوة إذا كنت تستخدم Bash لأن flexible-server create الأمر اكتشف بالفعل عنوان IP المحلي الخاص بك وضبطه على خادم MySQL.
إذا كنت تتصل بنسخة الخادم الخاصة بك من نظام ويندوز الفرعي للينكس (WSL) على جهاز ويندوز، فعليك إضافة معرف مضيف WSL إلى جدار الحماية الخاص بك. احصل على عنوان IP لجهازك المضيف عن طريق تشغيل هذا الأمر في WSL:
sudo cat /etc/resolv.conf
انسخ عنوان IP بعد المصطلح nameserver، ثم استخدم هذا الأمر لتعيين متغير بيئة لعنوان IP الخاص ب WSL:
AZ_WSL_IP_ADDRESS=<the-copied-IP-address>
ثم استخدم الأمر التالي لفتح جدار حماية الخادم لتطبيقك المستند إلى 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
تكوين قاعدة بيانات MySQL
أنشئ قاعدة بيانات جديدة يتم استدعاؤها demo باستخدام هذا الأمر:
az mysql flexible-server db create \
--resource-group $AZ_RESOURCE_GROUP \
--database-name demo \
--server-name $AZ_DATABASE_NAME \
--output tsv
إنشاء مستخدم غير مسؤول MySQL ومنح الإذن
بعد ذلك، أنشئ مستخدما غير مسؤول وامنح جميع الأذونات الموجودة في demo قاعدة البيانات إليه.
إشعار
يمكنك قراءة معلومات أكثر تفصيلا حول إنشاء مستخدمي MySQL في إنشاء مستخدمين في قاعدة بيانات Azure ل MySQL.
إنشاء برنامج نصي SQL يسمى create_ad_user.sql لإنشاء مستخدم غير مسؤول. أضف المحتويات التالية واحفظها محليا:
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
ثم استخدم الأمر التالي لتشغيل البرنامج النصي SQL لإنشاء مستخدم 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
الآن استخدم الأمر التالي لإزالة ملف البرنامج النصي SQL المؤقت:
rm create_ad_user.sql
إنشاء مشروع Java جديد
باستخدام IDE المفضل لديك، قم بإنشاء مشروع Java جديد، وأضف ملف 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.33</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity-extensions</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
</project>
هذا الملف هو ملف Apache Maven الذي يقوم بتكوين مشروعك لاستخدامه:
- جافا 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_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
إشعار
إذا كنت تستخدم فئة MysqlConnectionPoolDataSource كمصدر بيانات في تطبيقك، قم بإزالة "defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin" من الرابط.
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
إشعار
تم url إلحاق خاصية ?serverTimezone=UTC التكوين لإخبار برنامج تشغيل JDBC باستخدام تنسيق التاريخ UTC (أو التوقيت العالمي المتفق عليه) عند الاتصال بقاعدة البيانات. وإلا، لن يستخدم خادم جافا نفس تنسيق التاريخ مع قاعدة البيانات، مما قد يؤدي إلى خطأ.
إنشاء ملف SQL لإنشاء مخطط قاعدة البيانات
أنشئ مخطط قاعدة بيانات باستخدام ملف 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
);
إنشاء التعليمة البرمجية للتطبيق
الاتصال بقاعدة البيانات
بعد ذلك، أضف كود جافا الذي يستخدم 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());
}
/*
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();
}
}
هل تواجه أي مشاكل؟ أبلغنا بها.
يستخدم هذا الكود في جافا بيانات البيانات.properties وملفات schema.sql التي أنشأتها سابقا للاتصال بقاعدة البيانات وإنشاء مخطط.
في هذا الملف، يمكنك أن ترى أننا علقنا على طرق إدراج، قراءة، تحديث، وحذف البيانات: تقوم ببرمجة تلك الطرق في بقية هذا المقال، ويمكنك إلغاء التعليق عليها واحدة تلو الأخرى.
إشعار
يتم تخزين بيانات اعتماد قاعدة البيانات في خصائص المستخدم وكلمة المرور لملف database.properties . يتم استخدام بيانات الاعتماد هذه عند تنفيذ DriverManager.getConnection(properties.getProperty("url"), properties);، كما يتم تمرير ملف الخصائص كوسيط.
إشعار
سطر AbandonedConnectionCleanupThread.uncheckedShutdown(); في النهاية هو أمر خاص ببرنامج تشغيل MySQL لتدمير مؤشر ترابط داخلي عند إيقاف تشغيل التطبيق.
ويمكن تجاهله بأمان.
يمكنك الآن تنفيذ هذه الفئة الرئيسة باستخدام الأداة المفضلة لديك:
- باستخدام IDE الخاص بك، يجب أن تتمكن من النقر بزر الماوس الأيمن على الفئة DemoApplication وتنفيذها.
- باستخدام Maven، يمكنك تشغيل التطبيق عن طريق تنفيذ:
mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication".
يجب أن يتصل التطبيق بمثيل Azure Database for MySQL Flexible Server، وأنشئ مخطط قاعدة بيانات، ثم أغلق الاتصال، كما يجب أن ترى في سجلات وحدة التحكم:
[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 ل 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 لخادم 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 لخادم 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