搭配使用 Spring Data JPA 搭配 適用於 MySQL 的 Azure 資料庫
本教學課程示範如何使用 Spring Data JPA 將數據儲存在 適用於 MySQL 的 Azure 資料庫 資料庫中。
Java 持續性 API (JPA) 是對象關係型對應的標準 Java API。
在本教學課程中,我們包含兩種驗證方法:Microsoft Entra 驗證和 MySQL 驗證。 [無密碼] 索引標籤會顯示 Microsoft Entra 驗證,[密碼] 索引標籤則會顯示 MySQL 驗證。
Microsoft Entra 驗證是使用 Microsoft Entra ID 中所定義的身分識別來連線到適用於 MySQL 的 Azure 資料庫的機制。 透過 Microsoft Entra 驗證,您可以在集中的位置管理資料庫使用者的身分識別和其他 Microsoft 服務,從而簡化權限管理。
MySQL 驗證會使用儲存在 MySQL 中的帳戶。 如果您選擇使用密碼作為帳戶的認證,則這些認證會儲存在 user
資料表中。 因為這些密碼會儲存在 MySQL 中,因此您必須自行管理密碼的輪替。
必要條件
Azure 訂用帳戶 - 建立免費帳戶。
Java Development Kit (JDK)版本 8 或更高版本。
如果您沒有 Spring Boot 應用程式,請使用 Spring Initializr 建立 Maven 專案。 請務必選取 Maven 專案,然後在 [相依性] 底下新增 Spring Web、Spring Data JPA 和 MySQL 驅動程式相依性,然後選取 [Java 第 8 版] 或更新版本。
- 如果您沒有帳戶,請建立名為
mysqlflexibletest
的彈性伺服器實例 適用於 MySQL 的 Azure 資料庫。 如需指示,請參閱快速入門:使用 Azure 入口網站 建立 適用於 MySQL 的 Azure 資料庫 彈性伺服器。 然後,建立名為demo
的資料庫。 如需指示,請參閱建立和管理 適用於 MySQL 的 Azure 資料庫 彈性伺服器的資料庫。
重要
若要使用無密碼連線,請為您的 適用於 MySQL 的 Azure 資料庫 實例建立 Microsoft Entra 系統管理員使用者。 如需指示,請參閱設定 適用於 MySQL 的 Azure 資料庫 - 彈性伺服器的設定 Microsoft Entra 驗證的 Microsoft Entra Admin 一節。
請參閱範例應用程式
在本教學課程中,您將撰寫範例應用程式的程序代碼。 如果您想要更快速地執行,此應用程式已編碼,且可在取得 https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql。
設定 MySQL 伺服器的防火牆規則
適用於 MySQL 的 Azure 資料庫 實例預設會受到保護。 其防火牆不允許任何連入連線。
若要能夠使用您的資料庫,請開啟伺服器的防火牆,以允許本機 IP 位址存取資料庫伺服器。 如需詳細資訊,請參閱使用 Azure 入口網站 管理 適用於 MySQL 的 Azure 資料庫 - 彈性伺服器的防火牆規則。
如果您要從 Windows 電腦上的 Windows 子系統 Linux 版 (WSL) 連線到 MySQL 伺服器,您必須將 WSL 主機 IP 位址新增至防火牆。
建立 MySQL 非系統管理員使用者並授與權限
此步驟會建立非系統管理員使用者,並將資料庫的所有許可權 demo
授與其。
您可以使用下列方法來建立使用無密碼連線的非系統管理員使用者。
使用下列命令來安裝 Azure CLI 的 Service Connector 無密碼擴充功能:
az extension add --name serviceconnector-passwordless --upgrade
使用下列命令來建立 Microsoft Entra 非系統管理員使用者:
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
當命令完成時,記下主控台輸出中的用戶名稱。
從 適用於 MySQL 的 Azure 資料庫 儲存數據
現在您已擁有 適用於 MySQL 的 Azure 資料庫 彈性伺服器實例,您可以使用 Spring Cloud Azure 來儲存數據。
若要安裝 Spring Cloud Azure Starter JDBC MySQL 模組,請將下列相依性新增至 您的pom.xml 檔案:
Spring Cloud Azure 材料帳單(BOM):
<dependencyManagement> <dependencies> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>5.19.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
注意
如果您使用 Spring Boot 2.x,請務必將
spring-cloud-azure-dependencies
版本設定為4.19.0
。 此材料帳單 (BOM) 應該在<dependencyManagement>
pom.xml檔案的 區段中設定。 這可確保所有 Spring Cloud Azure 相依性都使用相同的版本。 如需此 BOM 所用版本的詳細資訊,請參閱 應該使用哪個版本的 Spring Cloud Azure。Spring Cloud Azure Starter JDBC MySQL 成品:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId> </dependency>
注意
自 版本 4.5.0
以來,已支援無密碼連線。
將 Spring Boot 設定為使用適用於 MySQL 的 Azure 資料庫
若要使用 Spring Data JPA 從 適用於 MySQL 的 Azure 資料庫 儲存數據,請遵循下列步驟來設定應用程式:
將下列屬性新增至 application.properties 組態檔,以設定 適用於 MySQL 的 Azure 資料庫 認證。
logging.level.org.hibernate.SQL=DEBUG spring.datasource.azure.passwordless-enabled=true spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC spring.datasource.username=<your_mysql_ad_non_admin_username> spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect
警告
設定屬性
spring.datasource.url
附加了?serverTimezone=UTC
,以指示 JDBC 驅動程式在連線到資料庫時,使用 UTC 日期格式 (或國際標準時間)。 如果沒有此參數,您的 Java 伺服器就不會使用與資料庫相同的日期格式,這會導致錯誤。
- 如果您沒有帳戶,請建立名為
mysqlsingletest
的單一伺服器實例 適用於 MySQL 的 Azure 資料庫。 如需指示,請參閱快速入門:使用 Azure 入口網站 建立 適用於 MySQL 的 Azure 資料庫 伺服器。 然後,建立名為demo
的資料庫。 如需指示,請參閱在 適用於 MySQL 的 Azure 資料庫 中建立使用者的建立資料庫一節。
重要
若要使用無密碼連線,請為您的 適用於 MySQL 的 Azure 資料庫 實例建立 Microsoft Entra 系統管理員使用者。 如需指示,請參閱使用 Microsoft Entra ID 進行 MySQL 驗證的設定 Microsoft Entra Admin 使用者一節。
請參閱範例應用程式
在本文中,您將撰寫範例應用程式的程序代碼。 如果您想要更快速地執行,此應用程式已編碼,且可在取得 https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql。
設定 MySQL 伺服器的防火牆規則
適用於 MySQL 的 Azure 資料庫 實例預設會受到保護。 其防火牆不允許任何連入連線。
若要能夠使用您的資料庫,請開啟伺服器的防火牆,以允許本機 IP 位址存取資料庫伺服器。 如需詳細資訊,請參閱使用 Azure 入口網站 建立和管理 適用於 MySQL 的 Azure 資料庫 防火牆規則。
如果您要從 Windows 電腦上的 Windows 子系統 Linux 版 (WSL) 連線到 MySQL 伺服器,您必須將 WSL 主機 IP 位址新增至防火牆。
建立 MySQL 非系統管理員使用者並授與權限
此步驟會建立非系統管理員使用者,並將資料庫的所有許可權 demo
授與其。
重要
若要使用無密碼連線,請為您的 適用於 MySQL 的 Azure 資料庫 實例建立 Microsoft Entra 系統管理員使用者。 如需詳細資訊,請參閱使用 Microsoft Entra ID 進行 MySQL 驗證的設定 Microsoft Entra Admin 使用者一節。
建立名為 create_ad_user.sql 的 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 '<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
然後,使用下列命令以執行 SQL 指令碼,以建立 Microsoft Entra 非管理使用者:
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
提示
若要使用 Microsoft Entra 驗證來連線到 適用於 MySQL 的 Azure 資料庫,您必須使用您設定的 Microsoft Entra 系統管理員使用者登入,然後取得存取令牌作為密碼。 如需詳細資訊,請參閱 使用 Microsoft Entra ID 進行 MySQL 驗證。
從 適用於 MySQL 的 Azure 資料庫 儲存數據
現在您已擁有 適用於 MySQL 的 Azure 資料庫 單一伺服器實例,您可以使用 Spring Cloud Azure 來儲存數據。
若要安裝 Spring Cloud Azure Starter JDBC MySQL 模組,請將下列相依性新增至 您的pom.xml 檔案:
Spring Cloud Azure 材料帳單(BOM):
<dependencyManagement> <dependencies> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>5.19.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
注意
如果您使用 Spring Boot 2.x,請務必將
spring-cloud-azure-dependencies
版本設定為4.19.0
。 此材料帳單 (BOM) 應該在<dependencyManagement>
pom.xml檔案的 區段中設定。 這可確保所有 Spring Cloud Azure 相依性都使用相同的版本。 如需此 BOM 所用版本的詳細資訊,請參閱 應該使用哪個版本的 Spring Cloud Azure。Spring Cloud Azure Starter JDBC MySQL 成品:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId> </dependency>
注意
自 版本 4.5.0
以來,已支援無密碼連線。
將 Spring Boot 設定為使用適用於 MySQL 的 Azure 資料庫
若要使用 Spring Data JPA 從 適用於 MySQL 的 Azure 資料庫 儲存數據,請遵循下列步驟來設定應用程式:
將下列屬性新增至 application.properties 組態檔,以設定 適用於 MySQL 的 Azure 資料庫 認證。
logging.level.org.hibernate.SQL=DEBUG spring.datasource.azure.passwordless-enabled=true 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.jpa.hibernate.ddl-auto=create-drop spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect
警告
設定屬性
spring.datasource.url
附加了?serverTimezone=UTC
,以指示 JDBC 驅動程式在連線到資料庫時,使用 UTC 日期格式 (或國際標準時間)。 如果沒有此參數,您的 Java 伺服器就不會使用與資料庫相同的日期格式,這會導致錯誤。
建立新的
Todo
Java 類別。 這個類別是對應至 JPA 自動建立之數據表的todo
網域模型。 下列程式代碼會getters
忽略和setters
方法。package com.example.demo; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Todo { public Todo() { } public Todo(String description, String details, boolean done) { this.description = description; this.details = details; this.done = done; } @Id @GeneratedValue private Long id; private String description; private String details; private boolean done; }
編輯啟動類別檔案以顯示下列內容。
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.jpa.repository.JpaRepository; import java.util.stream.Collectors; 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)).collect(Collectors.toList())) .forEach(System.out::println); } } interface TodoRepository extends JpaRepository<Todo, Long> { }
提示
在本教學課程中,組態或程式代碼中沒有任何驗證作業。 不過,連線到 Azure 服務需要驗證。 若要完成驗證,您需要使用 Azure Identity。 Spring Cloud Azure 使用
DefaultAzureCredential
,Azure 身分識別連結庫會提供它來協助您取得認證,而不需要變更任何程序代碼。DefaultAzureCredential
支援多種驗證方法,並在執行階段判斷應使用的方法。 這種方法可讓您的應用程式在不同的環境中使用不同的驗證方法(例如本機和生產環境),而不需要實作環境特定的程序代碼。 如需詳細資訊,請參閱 DefaultAzureCredential。若要在本機開發環境中完成驗證,您可以使用 Azure CLI、Visual Studio Code、PowerShell 或其他方法。 如需詳細資訊,請參閱 Java 開發環境中的 Azure 驗證。 若要在 Azure 裝載環境中完成驗證,建議您使用使用者指派的受控識別。 如需詳細資訊,請參閱什麼是 Azure 資源受控識別?
啟動應用程式。 您會看到類似下列範例的記錄:
2023-02-01 10:29:19.763 DEBUG 4392 --- [main] org.hibernate.SQL : insert into todo (description, details, done, id) values (?, ?, ?, ?) com.example.demo.Todo@1f
部署至 Azure Spring Apps
現在您已在本機執行 Spring Boot 應用程式,現在可以將其移至生產環境。 Azure Spring Apps 可讓您輕鬆地將 Spring Boot 應用程式部署至 Azure,而不需要變更任何程式代碼。 服務會管理 Spring 應用程式的基礎結構,讓開發人員可以專注於處理程式碼。 Azure Spring 應用程式提供生命週期管理,使用全方位的監視和診斷、組態管理、服務探索、持續整合與持續傳遞的整合、藍綠部署等等。 若要將應用程式部署至 Azure Spring Apps,請參閱 將第一個應用程式部署至 Azure Spring Apps。