将 Spring Data JPA 用于 Azure SQL 数据库

本教程演示如何使用 Spring Data JPA 将数据存储在 Azure SQL 数据库 中。

Java 持久性 API (JPA) 是用于对象关系映射的标准 Java API。

在本教程中,我们介绍了两种身份验证方法:Microsoft Entra 身份验证和 SQL 数据库身份验证。 “无密码”选项卡显示 Microsoft Entra 身份验证,“密码”选项卡显示 SQL 数据库身份验证。

Microsoft Entra 身份验证是一种使用 Microsoft Entra ID 中定义的标识连接到用于 SQL 数据库的 Azure SQL 数据库的机制。 通过 Microsoft Entra 身份验证,可以在一个中心位置集中管理数据库用户标识和其他 Microsoft 服务,从而简化权限管理。

SQL 数据库身份验证使用存储在 SQL 数据库中的帐户。 如果你选择使用密码作为帐户的凭据,则这些凭据将存储在用户表中。 由于这些密码存储在 SQL 数据库中,因此你需要自己管理密码的轮换。

先决条件

重要

若要使用无密码连接,请将 MS SQL Server 驱动程序升级到版本 12.1.0 或更高版本,然后为 Azure SQL Database 服务器实例创建 Microsoft Entra 管理员用户。 有关详细信息,请参阅教程:保护 Azure SQL 数据库中的数据库中的创建 Microsoft Entra 管理员部分。

请参阅示例应用程序

在本教程中,你将编写一个示例应用程序。 如果希望加快进程,可通过 https://github.com/Azure-Samples/quickstart-spring-data-jpa-sql-server 获得已编码的应用程序。

为 Azure SQL Database 服务器配置防火墙规则

Azure SQL 数据库实例在默认情况下受保护。 它们有不允许任何传入连接的防火墙。

为了能够使用你的数据库,请打开服务器的防火墙,以允许本地 IP 地址访问数据库服务器。 有关详细信息,请参阅教程:保护 Azure SQL 数据库中的数据库

如果要在 Windows 计算机上从适用于 Linux 的 Windows 子系统 (WSL) 连接到 Azure SQL Database 服务器,则需要将 WSL 主机 ID 添加到防火墙。

创建 SQL 数据库非管理员用户并授予权限

此步骤将创建一个非管理员用户,并向其授予对 demo 数据库的所有权限。

若要使用无密码连接,请参阅教程:保护 Azure SQL 数据库中的数据库,或使用服务连接器为 Azure SQL Database 服务器创建 Microsoft Entra 管理员用户,如以下步骤所示:

  1. 首先,为 Azure CLI 安装服务连接器无密码扩展:

    az extension add --name serviceconnector-passwordless --upgrade
    
  2. 然后,使用以下命令创建 Microsoft Entra 非管理员用户:

    az connection create sql \
        --resource-group <your-resource-group-name> \
        --connection sql_conn \
        --target-resource-group <your-resource-group-name> \
        --server sqlservertest \
        --database demo \
        --user-account \
        --query authInfo.userName \
        --output tsv
    

创建的 Microsoft Entra 管理员是 SQL 数据库管理员用户,因此无需创建新用户。

重要

Azure SQL 数据库无密码连接需要将 MS SQL Server 驱动程序升级到版本 12.1.0 或更高版本。 连接选项在版本 12.1.0 中为 authentication=DefaultAzureCredential,在版本 12.2.0 中为 authentication=ActiveDirectoryDefault

存储来自 Azure SQL 数据库的数据

借助 Azure SQL 数据库实例,可以使用 Spring Cloud Azure 存储数据。

要安装 Spring Cloud Azure Starter 模块,请将以下依赖项添加到 pom.xml 文件:

  • Spring Cloud Azure 物料清单 (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.18.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    注意

    如果使用 Spring Boot 2.x,请确保将 spring-cloud-azure-dependencies 版本设置为 4.19.0。 此物料清单 (BOM) 应在 pom.xml 文件的 <dependencyManagement> 部分进行配置。 这可确保所有 Spring Cloud Azure 依赖项都使用相同的版本。 有关用于此 BOM 的版本的详细信息,请参阅应使用哪个版本的 Spring Cloud Azure

  • Spring Cloud Azure Starter 项目:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter</artifactId>
    </dependency>
    

    注意

    由于这是依赖项,因此应将其添加到 pom.xml<dependencies> 部分中。 此处未配置其版本,因为它由我们之前添加的 BOM 管理。

将 Spring Boot 配置为使用 Azure SQL 数据库

若要使用 Spring Data JPA 存储来自 Azure SQL 数据库的数据,请执行以下步骤来配置应用程序:

  1. application.properties 配置文件中配置 Azure SQL 数据库凭据。

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.datasource.url=jdbc:sqlserver://sqlservertest.database.windows.net:1433;databaseName=demo;authentication=DefaultAzureCredential;
    
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2016Dialect
    spring.jpa.hibernate.ddl-auto=create-drop
    

    警告

    配置属性 spring.jpa.hibernate.ddl-auto=create-drop 意味着 Spring Boot 会在应用程序启动时自动创建数据库架构,并在关闭时尝试将其删除。 此功能非常适合测试,但请记住,这会在每次重启时删除数据,因此不应在生产中使用。

  1. 新建一个新 Todo Java 类。 此类是映射到 JPA 自动创建的 todo 表上的域模型。 下面的代码忽略 getterssetters 方法。

    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;
    
    }
    
  2. 编辑启动类文件以显示以下内容。

    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 标识。 Spring Cloud Azure 使用 Azure 标识库提供的 DefaultAzureCredential 来帮助获取凭据,而无需更改任何代码。

    DefaultAzureCredential 支持多种身份验证方法,并确定应在运行时使用哪种方法。 通过这种方法,你的应用可在不同环境(例如本地与生产环境)中使用不同的身份验证方法,而无需实现特定于环境的代码。 有关详细信息,请参阅 DefaultAzureCredential

    若要在本地开发环境中完成身份验证,可以使用 Azure CLI、Visual Studio Code、PowerShell 或其他方法。 有关详细信息,请参阅 Java 开发环境中的 Azure 身份验证。 若要在 Azure 托管环境中完成身份验证,建议使用用户分配的托管标识。 有关详细信息,请参阅什么是 Azure 资源的托管标识?

  3. 启动应用程序。 将会看到类似于以下示例的日志:

    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 Apps 可以通过以下方法提供生命周期管理:综合性监视和诊断、配置管理、服务发现、CI/CD 集成、蓝绿部署等。 若要将应用程序部署到 Azure Spring Apps,请参阅在 Azure Spring Apps 中部署你的第一个应用程序

后续步骤