クイックスタート: Java 用 Azure Cosmos DB for NoSQL

適用対象: NoSQL

Java 用 Azure Cosmos DB for NoSQL クライアント ライブラリを使って、コンテナー内のデータのクエリを実行し、個々の項目に対して一般的な操作を実行します。 Azure Developer CLI を使って最小限のソリューションを環境にデプロイするには、以下の手順に従います。

API のリファレンス ドキュメント | ライブラリのソース コード | パッケージ (Maven) | Azure Developer CLI

前提条件

設定

このプロジェクトの開発コンテナーをお使いの環境にデプロイします。 次に、Azure Developer CLI (azd) を使って、Azure Cosmos DB for NoSQL アカウントを作成し、コンテナー化されたサンプル アプリケーションをデプロイします。 サンプル アプリケーションでは、クライアント ライブラリを使って、サンプル データの管理、作成、読み取り、クエリを実行します。

GitHub codespaces で開く

開発コンテナーで開く

重要

GitHub アカウントには、ストレージとコア時間のエンタイトルメントが無料で含まれています。 詳細については、GitHub アカウントに含まれるストレージとコア時間に関する記事を参照してください。

  1. プロジェクトのルート ディレクトリでターミナルを開きます。

  2. azd auth login を使って Azure Developer CLI に対して認証します。 ツールによって指示された手順に従って、任意の Azure 資格情報を使って CLI に対して認証します。

    azd auth login
    
  3. azd init を使ってプロジェクトを初期化します。

    azd init --template cosmos-db-nosql-dotnet-quickstart
    

    Note

    このクイックスタートでは、azure-samples/cosmos-db-nosql-dotnet-quickstart テンプレート GitHub リポジトリを使用します。 まだない場合は、Azure Developer CLI によってこのプロジェクトがマシンに自動的にクローンされます。

  4. 初期化中に、一意の環境名を構成します。

    ヒント

    この環境名は、ターゲット リソース グループ名としても使用されます。 このクイックスタートでは、msdocs-cosmos-db の使用を検討してください。

  5. azd up を使って、Azure Cosmos DB アカウントをデプロイします。 Bicep テンプレートは、サンプル Web アプリケーションもデプロイします。

    azd up
    
  6. プロビジョニング プロセス中に、サブスクリプションと目的の場所を選択します。 プロビジョニング プロセスが完了するまで待ちます。 このプロセスには 5 分ほどかかる可能性があります。

  7. Azure リソースのプロビジョニングが完了すると、実行中の Web アプリケーションへの URL が出力に含まれます。

    Deploying services (azd deploy)
    
      (✓) Done: Deploying service web
    - Endpoint: <https://[container-app-sub-domain].azurecontainerapps.io>
    
    SUCCESS: Your application was provisioned and deployed to Azure in 5 minutes 0 seconds.
    
  8. コンソールで URL を使って、ブラウザーで Web アプリケーションに移動します。 実行中のアプリの出力を確認します。

    実行中の Web アプリケーションのスクリーンショット。

クライアント ライブラリをインストールする

クライアント ライブラリは、Maven を介して azure-spring-data-cosmos パッケージとして入手できます。

  1. /src/web フォルダーに移動し、pom.xml ファイルを開きます。

  2. まだ存在しない場合は、azure-spring-data-cosmos パッケージのエントリを追加します。

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-spring-data-cosmos</artifactId>
    </dependency>
    
  3. また、azure-identity パッケージに別の依存関係が存在しない場合は追加します。

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity</artifactId>
    </dependency>
    

オブジェクト モデル

名前 説明
EnableCosmosRepositories この型は、Azure Cosmos DB for NoSQL にアクセスするリポジトリを構成するために使われるメソッド デコレーターです。
CosmosRepository このクラスは主要なクライアント クラスであり、コンテナー内のデータを管理するために使われます。
CosmosClientBuilder このクラスは、リポジトリで使われるクライアントを作成するために使われるファクトリです。
Query この型は、リポジトリが実行するクエリを指定するために使われるメソッド デコレーターです。

コード例

テンプレートのサンプル コードでは、cosmicworks というデータベースと products というコンテナーを使います。 products コンテナーには、各製品の名前、カテゴリ、数量、一意識別子、販売フラグなどの詳細が含まれています。 コンテナーでは、論理パーティション キーとして /category プロパティを使います。

クライアントを認証する

ほとんどの Azure サービスに対するアプリケーション要求は、承認される必要があります。 アプリケーションと Azure Cosmos DB for NoSQL の間でパスワードレスの接続を実装するため、推奨される方法として、DefaultAzureCredential 型を使います。 DefaultAzureCredential は複数の認証方法をサポートしており、実行時に使用する方法が決定されます。

重要

パスワード、接続文字列、その他の資格情報を使用して、Azure サービスへの要求を直接承認することもできます。 ただし、この方法は慎重に使用する必要があります。 開発者は、安全でない場所にこれらのシークレットを公開しないように注意する必要があります。 パスワードまたは秘密鍵へのアクセス権を取得したユーザーは誰でも、データベース サービスに対して認証を行うことができます。 DefaultAzureCredential では、アカウント キーよりも管理とセキュリティの利点が向上し、キーを保存するリスクなしでパスワードレス認証が可能になります。

まず、このサンプルは、Azure Cosmos DB for NoSQL への接続を構成するために、AbstractCosmosConfiguration から継承する新しいクラスを作成します。

@Configuration
@EnableCosmosRepositories
public class CosmosConfiguration extends AbstractCosmosConfiguration {

}

このサンプルでは、構成クラス内で、CosmosClientBuilder クラスの新しいインスタンスを作成し、DefaultAzureCredential インスタンスを使って認証を構成します。

    @Bean
    public CosmosClientBuilder getCosmosClientBuilder() {
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
            .build();
            
        return new CosmosClientBuilder()
            .endpoint("<azure-cosmos-db-nosql-account-endpoint>")
            .credential(credential);
    }

データベースの取得

構成クラスで、サンプルでは、cosmicworks という既存のデータベースの名前を返すメソッドを実装します。

@Override
protected String getDatabaseName() {
    return "cosmicworks";
}

コンテナーの取得

Container メソッド デコレーターを使って、コンテナー内の項目を表すクラスを構成します。 JSON にシリアル化するすべてのメンバーを含むクラスを作成します。 この例では、型には一意識別子と、カテゴリ、名前、数量、価格、在庫一掃セールのフィールドがあります。

@Container(containerName = "products", autoCreateContainer = false)
public class Item {
    private String id;
    private String name;
    private Integer quantity;
    private Boolean sale;

    @PartitionKey
    private String category;

    // Extra members omitted for brevity
}

項目を作成する

repository.save を使ってコンテナー内に項目を作成します。

Item item = new Item(
    "70b63682-b93a-4c77-aad2-65501347265f",
    "gear-surf-surfboards",
    "Yamba Surfboard",
    12,
    false
);
Item created_item = repository.save(item);

項目を読み取る

一意識別子 (id) フィールドとパーティション キー フィールドの両方を使って、ポイント読み取り操作を実行できます。 repository.findById を使って、特定の項目を効率的に取得できます。

PartitionKey partitionKey = new PartitionKey("gear-surf-surfboards");
Optional<Item> existing_item = repository.findById("70b63682-b93a-4c77-aad2-65501347265f", partitionKey);
if (existing_item.isPresent()) {
    // Do something
}

クエリ項目

リポジトリのインターフェイスでクエリを定義することにより、コンテナー内の複数の項目に対してクエリを実行します。 このサンプルでは、Query メソッド デコレーターを使って、このパラメーター化されたクエリを実行するメソッドを定義します。

SELECT * FROM products p WHERE p.category = @category
@Repository
public interface ItemRepository extends CosmosRepository<Item, String> {

    @Query("SELECT * FROM products p WHERE p.category = @category")
    List<Item> getItemsByCategory(@Param("category") String category);

}

repository.getItemsByCategory を使ってクエリの結果をすべて取り込みます。 クエリの結果をループ処理します。

List<Item> items = repository.getItemsByCategory("gear-surf-surfboards");
for (Item item : items) {
    // Do something
}