使用 Azure Cosmos DB NoSQL API 访问数据

本文介绍如何将 Spring Cloud Azure Starter for Spring Data for Azure Cosmos DB 添加到自定义应用程序。 通过这个入门工具,你可以使用 Spring Data 和 Azure Cosmos DB for NoSQL 来在 Azure Cosmos DB 数据库中存储和检索数据。 本文首先介绍如何通过 Azure 门户创建 Azure Cosmos DB。 然后,本文介绍如何使用 Spring Initializr 创建自定义 Spring Boot 应用程序,该应用程序可与 Spring Boot Starter 配合使用。

Azure Cosmos DB 是一种全球分布式数据库服务,开发人员可以使用各种标准 API(例如 SQL、MongoDB、Graph 和表 API)处理数据。 Microsoft的 Spring Boot Starter 使开发人员能够使用与 Azure Cosmos DB for NoSQL 轻松集成的 Spring Boot 应用程序。

先决条件

使用 Azure 门户创建 Azure Cosmos DB

使用以下步骤创建 Azure Cosmos DB 实例:

  1. 浏览到 Azure 门户,然后选择创建资源

  2. 选择 数据库,然后选择 Azure Cosmos DB

  3. 创建 Azure Cosmos DB 帐户屏幕上,选择 Azure Cosmos DB for NoSQL

    Azure 门户的屏幕截图,其中显示了“创建 Azure Cosmos DB 帐户”页,其中突出显示了“用于 NoSQL 的 Azure Cosmos DB”选项。

  4. Azure Cosmos DB 页上,输入以下信息:

    • 选择想用于数据库的订阅
    • 指定是为数据库创建新的 资源组,还是选择现有的资源组。
    • 输入一个唯一的 帐户名称,该名称将用作您的数据库的 URI。 例如:contosoaccounttest
    • 为数据库指定位置
    • 如果想创建一个仅用于演示目的的帐户,请选择应用免费层折扣
    • 保留默认选项和设置的其余部分。
  5. 选择查看 + 创建,查看你的规范,然后选择创建

    Azure 门户的屏幕截图,其中显示了“使用 Azure Cosmos DB for NoSQL 设置创建 Azure Cosmos DB 帐户”页。

  6. 创建数据库后,该数据库将列在 Azure 仪表板,并在所有资源Azure Cosmos DB 页上列出。 若要为新创建的 Azure Cosmos DB 创建数据库和容器,请参阅 添加数据库和容器 部分 快速入门:从 Azure 门户创建 Azure Cosmos DB 帐户、数据库、容器和项。 可以为其中任一位置选择数据库,以打开缓存的属性页。

  7. 显示数据库的属性页时,请选择 密钥 并复制数据库的 URI 和访问密钥。 在 Spring Boot 应用程序中使用这些值。

    显示 Azure Cosmos DB 帐户的 Azure 门户屏幕截图,其中显示了“密钥”页。

重要

在新创建的 Azure Cosmos DB 中,将 Owner 角色分配给当前使用的 Azure 帐户。 有关详细信息,请参阅使用 Azure 门户分配 Azure 角色

使用 Spring Initializr 创建 Spring Boot 应用程序

使用以下步骤通过 Azure 支持创建新的 Spring Boot 应用程序项目。 或者,可以在 azure-spring-boot-samples 存储库中使用 spring-cloud-azure-data-cosmos-sample 示例。 然后,可以直接跳到 生成和测试你的应用

  1. 浏览到 https://start.spring.io/

  2. 指定以下选项:

    • 使用 Java生成 Maven 项目。
    • Spring Boot 版本指定为 2.7.11
    • 指定应用程序的“组”和“项目”名称。
    • 为 Java 版本选择 17
    • 在依赖项中添加 Azure 支持

    注意

    Spring Initializr 使用 构件 的名称来创建包名,例如:com.example.wingtiptoysdata

    Spring Boot 的版本可能高于 Azure 支持支持的版本。 自动生成项目后,可以手动将 Spring Boot 版本更改为 Azure 支持的最高版本,可在 Spring-Versions-Mapping中找到。

  3. 指定前面列出的选项后,请选择 GENERATE

  4. 出现提示时,将项目下载到本地计算机上的路径并提取文件。

现在,简单的 Spring Boot 应用程序已准备好进行编辑。

将 Spring Boot 应用程序配置为使用 Azure Spring Boot Starter

  1. 在应用的目录中找到 pom.xml 文件;例如:

    C:\SpringBoot\wingtiptoysdata\pom.xml

    -或-

    /users/example/home/wingtiptoysdata/pom.xml

  2. 在文本编辑器中打开 pom.xml 文件,并将以下内容添加到 <dependencies> 元素:

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

    注意

    有关如何使用材料清单(BOM)管理 Spring Cloud Azure 库版本的详细信息,请参阅 Spring Cloud Azure 开发人员指南 入门部分。

  3. 保存并关闭 pom.xml 文件。

将 Spring Boot 应用程序配置为使用 Azure Cosmos DB

  1. 在应用的 资源 目录中找到 application.properties 文件;例如:

    C:\SpringBoot\wingtiptoysdata\src\main\resources\application.properties

    -或-

    /users/example/home/wingtiptoysdata/src/main/resources/application.properties

  2. 在文本编辑器中打开 application.properties 文件,并将以下行添加到该文件,并将示例值替换为数据库的相应属性:

    # Specify the DNS URI of your Azure Cosmos DB.
    spring.cloud.azure.cosmos.endpoint=https://contosoaccounttest.documents.azure.com:443/
    spring.cloud.azure.cosmos.key=your-cosmosdb-account-key
    
    # Specify the name of your database.
    spring.cloud.azure.cosmos.database=contosoaccounttest
    spring.cloud.azure.cosmos.populate-query-metrics=true
    
  3. 保存并关闭 application.properties 文件。

添加示例代码以实现基本数据库功能

在本部分中,你将创建两个 Java 类来存储用户数据。 然后,修改主应用程序类以创建 User 类的实例并将其保存到数据库。

定义用于存储用户数据的基类

  1. 在与主应用程序 Java 文件相同的目录中创建一个名为 User.java 的新文件。

  2. 在文本编辑器中打开 User.java 文件,并将以下行添加到该文件,以定义在数据库中存储和检索值的泛型用户类:

    package com.example.wingtiptoysdata;
    
    import com.azure.spring.data.cosmos.core.mapping.Container;
    import com.azure.spring.data.cosmos.core.mapping.PartitionKey;
    import org.springframework.data.annotation.Id;
    
    @Container(containerName = "mycollection")
    public class User {
        @Id
        private String id;
        private String firstName;
        @PartitionKey
        private String lastName;
        private String address;
    
        public User() {
    
        }
    
        public User(String id, String firstName, String lastName, String address) {
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
            this.address = address;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        @Override
        public String toString() {
            return String.format("%s %s, %s", firstName, lastName, address);
        }
    }
    
  3. 保存并关闭 User.java 文件。

定义数据存储库接口

  1. 在与主应用程序 Java 文件相同的目录中创建名为 UserRepository.java 的新文件。

  2. 在文本编辑器中打开 UserRepository.java 文件,并将以下行添加到该文件,以定义扩展默认 ReactiveCosmosRepository 接口的用户存储库界面:

    package com.example.wingtiptoysdata;
    
    import com.azure.spring.data.cosmos.repository.ReactiveCosmosRepository;
    import org.springframework.stereotype.Repository;
    import reactor.core.publisher.Flux;
    
    @Repository
    public interface UserRepository extends ReactiveCosmosRepository<User, String> {
        Flux<User> findByFirstName(String firstName);
    }
    

    ReactiveCosmosRepository 接口替换了启动器上一版本中的 DocumentDbRepository 接口。 新接口提供用于基本保存、删除和查找操作的同步和反应 API。

  3. 保存并关闭 UserRepository.java 文件。

修改主应用程序类

  1. 在应用程序的包目录中找到主应用程序 Java 文件,例如:

    C:\SpringBoot\wingtiptoysdata\src\main\java\com\example\wingtiptoysdata\WingtiptoysdataApplication.java

    -或-

    /users/example/home/wingtiptoysdata/src/main/java/com/example/wingtiptoysdata/WingtiptoysdataApplication.java

  2. 在文本编辑器中打开主应用程序 Java 文件,并将以下行添加到该文件:

    package com.example.wingtiptoysdata;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.util.Assert;
    import reactor.core.publisher.Flux;
    import reactor.core.publisher.Mono;
    
    import java.util.Optional;
    
    @SpringBootApplication
    public class WingtiptoysdataApplication implements CommandLineRunner {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(WingtiptoysdataApplication.class);
    
        @Autowired
        private UserRepository repository;
    
        public static void main(String[] args) {
            SpringApplication.run(WingtiptoysdataApplication.class, args);
        }
    
        public void run(String... var1) {
            this.repository.deleteAll().block();
            LOGGER.info("Deleted all data in container.");
    
            final User testUser = new User("testId", "testFirstName", "testLastName", "test address line one");
    
            // Save the User class to Azure Cosmos DB database.
            final Mono<User> saveUserMono = repository.save(testUser);
    
            final Flux<User> firstNameUserFlux = repository.findByFirstName("testFirstName");
    
            //  Nothing happens until we subscribe to these Monos.
            //  findById won't return the user as user isn't present.
            final Mono<User> findByIdMono = repository.findById(testUser.getId());
            final User findByIdUser = findByIdMono.block();
            Assert.isNull(findByIdUser, "User must be null");
    
            final User savedUser = saveUserMono.block();
            Assert.state(savedUser != null, "Saved user must not be null");
            Assert.state(savedUser.getFirstName().equals(testUser.getFirstName()), "Saved user first name doesn't match");
    
            firstNameUserFlux.collectList().block();
    
            final Optional<User> optionalUserResult = repository.findById(testUser.getId()).blockOptional();
            Assert.isTrue(optionalUserResult.isPresent(), "Cannot find user.");
    
            final User result = optionalUserResult.get();
            Assert.state(result.getFirstName().equals(testUser.getFirstName()), "query result firstName doesn't match!");
            Assert.state(result.getLastName().equals(testUser.getLastName()), "query result lastName doesn't match!");
    
            LOGGER.info("findOne in User collection get result: {}", result.toString());
        }
    }
    
  3. 保存并关闭主应用程序 Java 文件。

生成和测试应用

  1. 打开命令提示符并导航到 pom.xml 文件所在的文件夹;例如:

    cd C:\SpringBoot\wingtiptoysdata

    -或-

    cd /users/example/home/wingtiptoysdata

  2. 使用以下命令生成并运行应用程序:

    ./mvnw clean
    

    此命令在测试阶段自动运行应用程序。 还可以使用:

    ./mvnw spring-boot:run
    

    生成和测试输出后,控制台窗口会显示类似于以下示例的消息:

    INFO 1365 --- [           main] c.e.w.WingtiptoysdataApplication         : Deleted all data in container.
    
    ... (omitting connection and diagnostics output) ...
    
    INFO 1365 --- [           main] c.e.w.WingtiptoysdataApplication         : findOne in User collection get result: testFirstName testLastName, test address line one
    

    这些输出消息指示数据已成功保存到 Azure Cosmos DB,然后再次检索。

清理资源

如果不打算继续使用此应用程序,请务必删除包含前面创建的 Azure Cosmos DB 的资源组。 可以从 Azure 门户删除资源组。

后续步骤

若要了解有关 Spring 和 Azure 的详细信息,请继续阅读 Azure 上的 Spring 文档中心。

更多资源

有关使用 Azure Cosmos DB 和 Java 的详细信息,请参阅以下文章:

有关在 Azure 上使用 Spring Boot 应用程序的详细信息,请参阅以下文章:

有关如何将 Azure 与 Java 配合使用的详细信息,请参阅面向 Java 开发人员的 Azure使用 Azure DevOps 和 Java

Spring Framework 是一种开源解决方案,可帮助 Java 开发人员创建企业级应用程序。 基于该平台构建的更受欢迎的项目之一是 Spring Boot,它提供了一种简化的方法来创建独立的 Java 应用程序。 为了帮助开发人员开始使用 Spring Boot,https://github.com/spring-guides/提供了几个示例 Spring Boot 包。 除了从基本 Spring Boot 项目列表中选择,Spring Initializr 还可帮助开发人员开始创建自定义 Spring Boot 应用程序。