

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Java 用 Amazon QLDB ドライバー
<a name="getting-started.java"></a>

**重要**  
サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了まで Amazon QLDB を使用できます。詳細については、[「Amazon QLDB 台帳を Amazon Aurora PostgreSQL に移行する](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)」を参照してください。

台帳内のデータを操作するには、 AWS が提供するドライバーを使用して、Java アプリケーションから Amazon QLDB に接続できます。次のトピックでは、Java 用 QLDB ドライバーの使用を開始する方法について説明します。

**Topics**
+ [ドライバーに関するリソース](#getting-started.java.resources)
+ [前提条件](#getting-started.java.prereqs)
+ [デフォルトの AWS の認証情報とリージョンを設定する](#getting-started.java.credentials)
+ [インストール](#getting-started.java.install)
+ [クイックスタートチュートリアル](driver-quickstart-java.md)
+ [クックブックリファレンス](driver-cookbook-java.md)

## ドライバーに関するリソース
<a name="getting-started.java.resources"></a>

Java ドライバーでサポートされる機能の詳細については、以下のリソースを参照してください。
+ API リファレンス: [2.x](https://javadoc.io/doc/software.amazon.qldb/amazon-qldb-driver-java/latest/)、[1.x](https://javadoc.io/doc/software.amazon.qldb/amazon-qldb-driver-java/1.1.0/index.html)
+ [ドライバーのソースコード (GitHub)](https://github.com/awslabs/amazon-qldb-driver-java)
+ [サンプルアプリケーションのソースコード (GitHub)](https://github.com/aws-samples/amazon-qldb-dmv-sample-java)
+ [レジャーローダーフレームワーク (GitHub)](https://github.com/awslabs/amazon-qldb-ledger-load-java)
+ [Amazon Ion コード例](ion.code-examples.md)

## 前提条件
<a name="getting-started.java.prereqs"></a>

Java 用 QLDB ドライバーを開始する前に、次の操作を行う必要があります。

1.  AWS 「」のセットアップ手順に従ってください[Amazon QLDB へのアクセス](accessing.md)。これには以下が含まれます。

   1. にサインアップします AWS。

   1. QLDB の適切なアクセス許可を持つユーザーを作成します。

   1. 開発に必要なプログラムへのアクセスを提供します。

1. 以下をダウンロードおよびインストールして、Java 開発環境を設定します。

   1. Java SE 開発キット 8 ([Amazon Corretto 8](https://docs.aws.amazon.com/corretto/latest/corretto-8-ug/downloads-list.html) など)。

   1. (オプション) 任意の Java 統合開発環境 (IDE) ([Eclipse](http://www.eclipse.org) や [IntelliJ](https://www.jetbrains.com/idea/) など)。

1.  AWS SDK for Java によって の開発環境を設定します[デフォルトの AWS の認証情報とリージョンを設定する](#getting-started.java.credentials)。

次に、すべてのチュートリアル用のサンプルアプリケーションをダウンロードするか、Java プロジェクトにのみドライバーをインストールして短いコード例を実行できます。
+ QLDB ドライバーと を既存のプロジェクト AWS SDK for Java にインストールするには、「」に進みます[インストール](#getting-started.java.install)。
+ プロジェクトを設定し、台帳の基本的なデータトランザクションを示す短いコード例については、「[クイックスタートチュートリアル](driver-quickstart-java.md)」を参照してください。
+ チュートリアルのサンプルアプリケーション全体のデータプレーンと管理 API の両方のオペレーションを実行する詳細な例については、「[Java チュートリアル](getting-started.java.tutorial.md)」を参照してください。

## デフォルトの AWS の認証情報とリージョンを設定する
<a name="getting-started.java.credentials"></a>

QLDB ドライバーと基盤となる [AWS SDK for Java](https://aws.amazon.com/sdk-for-java) では、実行時にアプリケーションに AWS 認証情報を指定する必要があります。このガイドのコード例では、 AWS 認証情報ファイルを使用していることを前提としています。詳細については、「AWS SDK for Java 2.x デベロッパーガイド」の「[デフォルトの認証情報とリージョンを設定する](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup.html#setup-credentials)」を参照してください。

これらのステップの一環として、デフォルトの QLDB エンドポイントを決定する AWS リージョン ためにデフォルトも設定する必要があります。コード例では、デフォルトの AWS リージョンで QLDB に接続します。QLDB が利用可能なリージョンの完全なリストについては、「AWS 全般のリファレンス」の「[Amazon QLDB エンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/qldb.html)」を参照してください。

以下は、 という名前の AWS 認証情報ファイルの例です。チルダ文字 (`~`) `~/.aws/credentials`はホームディレクトリを表します。

```
[default] 
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key
```

your*\$1access\$1key\$1id と your*\$1secret\$1access\$1key の値に独自の AWS 認証情報値を置き換えます。 **

## インストール
<a name="getting-started.java.install"></a>

QLDB は、次の Java ドライバーバージョンとその AWS SDK 依存関係をサポートしています。


****  

| ドライバーバージョン | AWS SDK | ステータス | 最新リリース日 | 
| --- | --- | --- | --- | 
| [1.x](https://search.maven.org/artifact/software.amazon.qldb/amazon-qldb-driver-java/1.1.0/jar) | AWS SDK for Java 1.x | 本番リリース | 2020 年 3 月 20 日 | 
| [2.x](https://search.maven.org/artifact/software.amazon.qldb/amazon-qldb-driver-java/2.3.1/jar) | AWS SDK for Java 2.x | 本番リリース | 2021 年 6 月 4 日 | 

QLDB ドライバーをインストールするには、Gradle や Maven などの依存関係管理システムを使用することをお勧めします。例えば、以下のアーティファクトを Java プロジェクトの依存関係として追加します。

------
#### [ 2.x ]

**Gradle**

`build.gradle` 設定ファイルにこの依存関係を追加します。

```
dependencies {
    compile group: 'software.amazon.qldb', name: 'amazon-qldb-driver-java', version: '2.3.1'
}
```

**Maven**

`pom.xml` 設定ファイルにこの依存関係を追加します。

```
<dependencies>
  <dependency>
    <groupId>software.amazon.qldb</groupId>
    <artifactId>amazon-qldb-driver-java</artifactId>
    <version>2.3.1</version>
  </dependency>
</dependencies>
```

このアーティファクトには、 AWS SDK for Java 2.x コアモジュール、[Amazon Ion](ion.md) ライブラリ、およびその他の必要な依存関係が自動的に含まれます。

------
#### [ 1.x ]

**Gradle**

`build.gradle` 設定ファイルにこの依存関係を追加します。

```
dependencies {
    compile group: 'software.amazon.qldb', name: 'amazon-qldb-driver-java', version: '1.1.0'
}
```

**Maven**

`pom.xml` 設定ファイルにこの依存関係を追加します。

```
<dependencies>
  <dependency>
    <groupId>software.amazon.qldb</groupId>
    <artifactId>amazon-qldb-driver-java</artifactId>
    <version>1.1.0</version>
  </dependency>
</dependencies>
```

このアーティファクトには、 AWS SDK for Java コアモジュール、[Amazon Ion](ion.md) ライブラリ、およびその他の必要な依存関係が自動的に含まれます。

**重要**  
**Amazon Ion 名前空間** — アプリケーションに Amazon Ion クラスをインポートする場合は、名前空間 `com.amazon.ion` の下にあるパッケージを使用する必要があります。 AWS SDK for Java は、名前空間 `software.amazon.ion` の別の Ion パッケージに依存しますが、これは QLDB ドライバーと互換性がないレガシーパッケージです。

------

台帳に対して基本的なデータトランザクションを実行する方法を示す短いコード例については、「[クックブックリファレンス](driver-cookbook-java.md)」を参照してください。

### 他のオプションのライブラリ
<a name="getting-started.java.install-optional"></a>

オプションで、プロジェクトに以下の便利なライブラリを追加することもできます。これらのアーティファクトは、[Java チュートリアル](getting-started.java.tutorial.md)サンプルアプリケーションで必須の依存関係にあります。

1. [aws-java-sdk-qldb](https://search.maven.org/artifact/com.amazonaws/aws-java-sdk-qldb/1.11.785/jar) - AWS SDK for Javaの QLDB モジュール。QLDB でサポートされる最小のバージョンは、`1.11.785` です。

   このモジュールを使用することで、アプリケーションは [Amazon QLDB API リファレンス](api-reference.md) に表示されている管理 API オペレーションと直接やり取りできます。

1. [jackson-dataformat-ion](https://search.maven.org/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-ion/2.10.0/bundle) - Ion 用の FasterXML の Jackson データフォーマットモジュール。サンプルアプリケーションにはバージョン `2.10.0` 以降が必要です。

------
#### [ Gradle ]

`build.gradle` 設定ファイルにこれら依存関係を追加します。

```
dependencies {
    compile group: 'com.amazonaws', name: 'aws-java-sdk-qldb', version: '1.11.785'
    compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-ion', version: '2.10.0'
}
```

------
#### [ Maven ]

`pom.xml` 設定ファイルにこれら依存関係を追加します。

```
<dependencies>
  <dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-qldb</artifactId>
    <version>1.11.785</version>
  </dependency>
  <dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-ion</artifactId>
    <version>2.10.0</version>
  </dependency>
</dependencies>
```

------

# Java 用 Amazon QLDB ドライバー — クイックスタートチュートリアル
<a name="driver-quickstart-java"></a>

**重要**  
サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了まで Amazon QLDB を使用できます。詳細については、[「Amazon QLDB 台帳を Amazon Aurora PostgreSQL に移行する](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)」を参照してください。

このチュートリアルでは、Java 用 Amazon QLDB ドライバーの最新バージョンを使用して単純なアプリケーションを設定する方法について説明します。このガイドには、ドライバのインストール手順と、*作成、読み取り、更新、削除* (CRUD) の基本的なオペレーションを実行する短いコード例が含まれています。これらのオペレーションを完全なサンプルアプリケーションで実行する詳細な例については、「[Java チュートリアル](getting-started.java.tutorial.md)」を参照してください。

**Topics**
+ [前提条件](#driver-quickstart-java.prereqs)
+ [ステップ 1: プロジェクトを設定する](#driver-quickstart-java.step-1)
+ [ステップ 2: ドライバーを初期化する](#driver-quickstart-java.step-2)
+ [ステップ 3: テーブルとインデックスを作成する](#driver-quickstart-java.step-3)
+ [ステップ 4: ドキュメントを挿入する](#driver-quickstart-java.step-4)
+ [ステップ 5: ドキュメントにクエリを実行する](#driver-quickstart-java.step-5)
+ [ステップ 6: ドキュメントを更新する](#driver-quickstart-java.step-6)
+ [完全なアプリケーションの実行](#driver-quickstart-java.complete)

## 前提条件
<a name="driver-quickstart-java.prereqs"></a>

作業を始める前に、次の操作を実行してください。

1. Java ドライバー用の「[前提条件](getting-started.java.md#getting-started.java.prereqs)」を完了します (まだ完了していない場合)。これには、 へのサインアップ AWS、開発用のプログラムによるアクセスの許可、Java 統合開発環境 (IDE) のインストールが含まれます。

1. `quick-start` という名前の台帳を作成します。

   台帳の作成方法については、「[Amazon QLDB 台帳の基本的なオペレーション](ledger-management.basics.md)」、または「**コンソールの開始方法」の「[ステップ 1: 新しい台帳を作成する](getting-started-step-1.md)」を参照してください。

## ステップ 1: プロジェクトを設定する
<a name="driver-quickstart-java.step-1"></a>

まず、Java プロジェクトをセットアップします。このチュートリアルでは、[Maven](https://maven.apache.org/index.html) 依存関係管理システムを使用することをお勧めします。

**注記**  
これらのセットアップ手順を自動化する機能を備えた IDE を使用する場合は、「[ステップ 2: ドライバーを初期化する](#driver-quickstart-java.step-2)」までスキップできます。

1. アプリケーション用のフォルダを作成します。

   ```
   $ mkdir myproject
   $ cd myproject
   ```

1. Maven テンプレートからプロジェクトを初期化するには、次のコマンドを入力します。必要に応じて *project-package*、*project-name*、*maven-template* を自分の値で置換します。

   ```
   $ mvn archetype:generate
     -DgroupId=project-package \
     -DartifactId=project-name \
     -DarchetypeArtifactId=maven-template \
     -DinteractiveMode=false
   ```

   *maven-template* では、基本的な Maven テンプレート `maven-archetype-quickstart` を使用できます。

1. [Java 用 QLDB ドライバー](https://search.maven.org/artifact/software.amazon.qldb/amazon-qldb-driver-java/2.3.1/jar)をプロジェクトの依存関係として追加するには、新しく作成した `pom.xml` ファイルに移動し、以下のアーティファクトを追加します。

   ```
   <dependency>
       <groupId>software.amazon.qldb</groupId>
       <artifactId>amazon-qldb-driver-java</artifactId>
       <version>2.3.1</version>
   </dependency>
   ```

   このアーティファクトには、[AWS SDK for Java 2.x](https://aws.amazon.com/sdk-for-java) コアモジュール、[Amazon Ion](ion.md) ライブラリ、およびその他の必要な依存関係が自動的に含まれています。`pom.xml` ファイルは以下のようになります。

   ```
   <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 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>software.amazon.qldb</groupId>
     <artifactId>qldb-quickstart</artifactId>
     <packaging>jar</packaging>
     <version>1.0-SNAPSHOT</version>
     <name>qldb-quickstart</name>
     <url>http://maven.apache.org</url>
     <dependencies>
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>3.8.1</version>
         <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>software.amazon.qldb</groupId>
           <artifactId>amazon-qldb-driver-java</artifactId>
           <version>2.3.1</version>
       </dependency>
     </dependencies>
   </project>
   ```

1. `App.java` ファイルを開きます。

   次に、以下のステップのコード例を段階的に追加し、いくつかの基本的な CRUD オペレーションを試します。または、ステップバイステップのチュートリアルをスキップして、代わりに[完全なアプリケーション](#driver-quickstart-java.complete)を実行することもできます。

## ステップ 2: ドライバーを初期化する
<a name="driver-quickstart-java.step-2"></a>

`quick-start` という名前の台帳に接続するドライバーのインスタンスを初期化します。以下のコードを `App.java` ファイルに追加します。

```
import java.util.*;
import com.amazon.ion.*;
import com.amazon.ion.system.*;
import software.amazon.awssdk.services.qldbsession.QldbSessionClient;
import software.amazon.qldb.*;

public final class App {
    public static IonSystem ionSys = IonSystemBuilder.standard().build();
    public static QldbDriver qldbDriver;

    public static void main(final String... args) {
        System.out.println("Initializing the driver");
        qldbDriver = QldbDriver.builder()
            .ledger("quick-start")
            .transactionRetryPolicy(RetryPolicy
                .builder()
                .maxRetries(3)
                .build())
            .sessionClientBuilder(QldbSessionClient.builder())
            .build();
    }
}
```

## ステップ 3: テーブルとインデックスを作成する
<a name="driver-quickstart-java.step-3"></a>

以下のコード例は、`CREATE TABLE` および `CREATE INDEX` ステートメントの実行方法を示しています。

`main` メソッドで以下のコードを追加して、`People` という名前のテーブルと、そのテーブルの `lastName` フィールドのインデックスを作成します。クエリのパフォーマンスを最適化し、[オプティミスティック同時実行制御 (OCC)](concurrency.md) 競合例外を制限するために、[インデックス](ql-reference.create-index.md)が必要です。

```
// Create a table and an index in the same transaction
qldbDriver.execute(txn -> {
    System.out.println("Creating a table and an index");
    txn.execute("CREATE TABLE People");
    txn.execute("CREATE INDEX ON People(lastName)");
});
```

## ステップ 4: ドキュメントを挿入する
<a name="driver-quickstart-java.step-4"></a>

次のコード例は、`INSERT` ステートメントの実行方法を示しています。QLDB は [PartiQL](ql-reference.md) クエリ言語 (SQL 互換) と [Amazon Ion](ion.md) データ形式 (JSON のスーパーセット) をサポートします。

`People` テーブルにドキュメントを挿入する以下のコードを追加します。

```
// Insert a document
qldbDriver.execute(txn -> {
    System.out.println("Inserting a document");
    IonStruct person = ionSys.newEmptyStruct();
    person.put("firstName").newString("John");
    person.put("lastName").newString("Doe");
    person.put("age").newInt(32);
    txn.execute("INSERT INTO People ?", person);
});
```

この例では、疑問符 (`?`) を変数プレースホルダーとして使用して、ドキュメント情報をステートメントに渡します。プレースホルダーを使用する場合、`IonValue` 型の値を渡す必要があります。

**ヒント**  
1 つの [INSERT](ql-reference.insert.md) ステートメントを使用して複数のドキュメントを挿入するために、次のように型 [IonList](driver-working-with-ion.md#driver-ion-list) のパラメータを (明示的に `IonValue` にキャストして) ステートメントに渡すことができます。  

```
// people is an IonList explicitly cast as an IonValue
txn.execute("INSERT INTO People ?", (IonValue) people);
```
`IonList` を渡すときは、変数プレースホルダー (`?`) を二重山括弧 (`<<...>>`) で囲まないでください。マニュアルの PartiQL ステートメントでは、二重山括弧は**バッグと呼ばれる順序付けされていないコレクションを表します。

## ステップ 5: ドキュメントにクエリを実行する
<a name="driver-quickstart-java.step-5"></a>

次のコード例は、`SELECT` ステートメントの実行方法を示しています。

`People` テーブルからドキュメントをクエリする以下のコードを追加します。

```
// Query the document
qldbDriver.execute(txn -> {
    System.out.println("Querying the table");
    Result result = txn.execute("SELECT * FROM People WHERE lastName = ?",
            ionSys.newString("Doe"));
    IonStruct person = (IonStruct) result.iterator().next();
    System.out.println(person.get("firstName")); // prints John
    System.out.println(person.get("lastName")); // prints Doe
    System.out.println(person.get("age")); // prints 32
});
```

## ステップ 6: ドキュメントを更新する
<a name="driver-quickstart-java.step-6"></a>

次のコード例は、`UPDATE` ステートメントの実行方法を示しています。

1. `age` を `42` に更新して `People` テーブルのドキュメントを更新する以下のコードを追加します。

   ```
   // Update the document
   qldbDriver.execute(txn -> {
       System.out.println("Updating the document");
       final List<IonValue> parameters = new ArrayList<>();
       parameters.add(ionSys.newInt(42));
       parameters.add(ionSys.newString("Doe"));
       txn.execute("UPDATE People SET age = ? WHERE lastName = ?", parameters);
   });
   ```

1. ドキュメントを再度クエリして、更新された値を確認します。

   ```
   // Query the updated document
   qldbDriver.execute(txn -> {
       System.out.println("Querying the table for the updated document");
       Result result = txn.execute("SELECT * FROM People WHERE lastName = ?",
               ionSys.newString("Doe"));
       IonStruct person = (IonStruct) result.iterator().next();
       System.out.println(person.get("firstName")); // prints John
       System.out.println(person.get("lastName")); // prints Doe
       System.out.println(person.get("age")); // prints 32
   });
   ```

1. Maven または IDE を使用して、`App.java` ファイルを実行します。

## 完全なアプリケーションの実行
<a name="driver-quickstart-java.complete"></a>

以下のコード例は、`App.java` アプリケーションの完全なバージョンです。上のステップを個別に実行する代わりに、このコード例を最初から最後までコピーして実行することもできます。このアプリケーションは、`quick-start` という名前の台帳に対するいくつかの基本的な CRUD オペレーションを実行します。

**注記**  
このコードを実行する前に、`quick-start` 台帳に `People` という名前のアクティブなテーブルが存在しないことを確認してください。  
最初の行で、*project-package* を [ステップ 1: プロジェクトを設定する](#driver-quickstart-java.step-1)で Maven コマンドに使用した `groupId` 値に置換します。

```
package project-package;

import java.util.*;
import com.amazon.ion.*;
import com.amazon.ion.system.*;
import software.amazon.awssdk.services.qldbsession.QldbSessionClient;
import software.amazon.qldb.*;

public class App {
    public static IonSystem ionSys = IonSystemBuilder.standard().build();
    public static QldbDriver qldbDriver;

    public static void main(final String... args) {
        System.out.println("Initializing the driver");
        qldbDriver = QldbDriver.builder()
            .ledger("quick-start")
            .transactionRetryPolicy(RetryPolicy
                .builder()
                .maxRetries(3)
                .build())
            .sessionClientBuilder(QldbSessionClient.builder())
            .build();

        // Create a table and an index in the same transaction
        qldbDriver.execute(txn -> {
            System.out.println("Creating a table and an index");
            txn.execute("CREATE TABLE People");
            txn.execute("CREATE INDEX ON People(lastName)");
        });
        
        // Insert a document
        qldbDriver.execute(txn -> {
            System.out.println("Inserting a document");
            IonStruct person = ionSys.newEmptyStruct();
            person.put("firstName").newString("John");
            person.put("lastName").newString("Doe");
            person.put("age").newInt(32);
            txn.execute("INSERT INTO People ?", person);
        });
        
        // Query the document
        qldbDriver.execute(txn -> {
            System.out.println("Querying the table");
            Result result = txn.execute("SELECT * FROM People WHERE lastName = ?",
                    ionSys.newString("Doe"));
            IonStruct person = (IonStruct) result.iterator().next();
            System.out.println(person.get("firstName")); // prints John
            System.out.println(person.get("lastName")); // prints Doe
            System.out.println(person.get("age")); // prints 32
        });
        
        // Update the document
        qldbDriver.execute(txn -> {
            System.out.println("Updating the document");
            final List<IonValue> parameters = new ArrayList<>();
            parameters.add(ionSys.newInt(42));
            parameters.add(ionSys.newString("Doe"));
            txn.execute("UPDATE People SET age = ? WHERE lastName = ?", parameters);
        });
        
        // Query the updated document
        qldbDriver.execute(txn -> {
            System.out.println("Querying the table for the updated document");
            Result result = txn.execute("SELECT * FROM People WHERE lastName = ?",
                    ionSys.newString("Doe"));
            IonStruct person = (IonStruct) result.iterator().next();
            System.out.println(person.get("firstName")); // prints John
            System.out.println(person.get("lastName")); // prints Doe
            System.out.println(person.get("age")); // prints 42
        });
    }
}
```

Maven または IDE を使用して、`App.java` ファイルを実行します。

# Java 用 Amazon QLDB ドライバー — クックブックリファレンス
<a name="driver-cookbook-java"></a>

**重要**  
サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了まで Amazon QLDB を使用できます。詳細については、[「Amazon QLDB 台帳を Amazon Aurora PostgreSQL に移行する](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)」を参照してください。

このリファレンスガイドでは、Java 用 Amazon QLDB ドライバーの一般的なユースケースについて説明します。Java コード例を提供し、ドライバーを使用して**作成、読み取り、更新、および削除 (CRUD) の基本的なオペレーションを実行する方法を説明しています。Amazon Ion データを処理するためのコード例も含まれています。さらに、このガイドでは、トランザクションをべき等にし、一意性の制約を実装するためのベストプラクティスを取り上げています。

**注記**  
該当する場合、一部のユースケースでは、サポートされているメジャーバージョンの Java 用 QLDB ドライバーに対して異なるコード例があります。

**Contents**
+ [ドライバーのインポート](#cookbook-java.importing)
+ [ドライバーのインスタンス化](#cookbook-java.instantiating)
+ [CRUD オペレーション](#cookbook-java.crud)
  + [テーブルの作成](#cookbook-java.crud.creating-tables)
  + [インデックスの作成](#cookbook-java.crud.creating-indexes)
  + [ドキュメントの読み取り](#cookbook-java.crud.reading)
  + [ドキュメントの挿入](#cookbook-java.crud.inserting)
    + [1 つのステートメントで複数のドキュメントの挿入](#cookbook-java.crud.inserting.multiple)
  + [ドキュメントの更新](#cookbook-java.crud.updating)
  + [ドキュメントの削除](#cookbook-java.crud.deleting)
  + [トランザクションで複数のステートメントの実行](#cookbook-java.crud.multi-statement)
  + [再試行ロジック](#cookbook-java.crud.retry-logic)
  + [一意性制約の実装](#cookbook-java.crud.uniqueness-constraints)
+ [Amazon Ion の操作](#cookbook-java.ion)
  + [Ion パッケージのインポート](#cookbook-java.ion.importing)
  + [Ion の初期化](#cookbook-java.ion.initializing)
  + [Ion オブジェクトの作成](#cookbook-java.ion.creating)
  + [Ion オブジェクトの作成](#cookbook-java.ion.reading)

## ドライバーのインポート
<a name="cookbook-java.importing"></a>

次のコード例では、ドライバー、QLDB セッションクライアント、Amazon Ion パッケージ、およびその他の関連する依存関係をインポートします。

------
#### [ 2.x ]

```
import com.amazon.ion.IonStruct;
import com.amazon.ion.IonSystem;
import com.amazon.ion.IonValue;
import com.amazon.ion.system.IonSystemBuilder;

import software.amazon.awssdk.services.qldbsession.QldbSessionClient;
import software.amazon.qldb.QldbDriver;
import software.amazon.qldb.Result;
```

------
#### [ 1.x ]

```
import com.amazon.ion.IonStruct;
import com.amazon.ion.IonSystem;
import com.amazon.ion.IonValue;
import com.amazon.ion.system.IonSystemBuilder;

import com.amazonaws.services.qldbsession.AmazonQLDBSessionClientBuilder;
import software.amazon.qldb.PooledQldbDriver;
import software.amazon.qldb.Result;
```

------

## ドライバーのインスタンス化
<a name="cookbook-java.instantiating"></a>

次のコード例では、指定された台帳名に接続するドライバーインスタンスを作成し、指定された[再試行ロジック](#cookbook-java.crud.retry-logic)をカスタム再試行制限で使用します。

**注記**  
この例では、Amazon Ion システムオブジェクト (`IonSystem`) もインスタンス化します。このリファレンスでいくつかのデータオペレーションを実行するときに Ion データを処理するには、このオブジェクトが必要です。詳細については、「[Amazon Ion の操作](#cookbook-java.ion)」を参照してください。

------
#### [ 2.x ]

```
QldbDriver qldbDriver = QldbDriver.builder()
    .ledger("vehicle-registration")
    .transactionRetryPolicy(RetryPolicy
        .builder()
        .maxRetries(3)
        .build())
    .sessionClientBuilder(QldbSessionClient.builder())
    .build();

IonSystem SYSTEM = IonSystemBuilder.standard().build();
```

------
#### [ 1.x ]

```
PooledQldbDriver qldbDriver = PooledQldbDriver.builder()
    .withLedger("vehicle-registration")
    .withRetryLimit(3)
    .withSessionClientBuilder(AmazonQLDBSessionClientBuilder.standard())
    .build();

IonSystem SYSTEM = IonSystemBuilder.standard().build();
```

------

## CRUD オペレーション
<a name="cookbook-java.crud"></a>

QLDB は**作成、読み取り、更新、および削除 (CRUD) オペレーションをトランザクションの一部として実行します。

**警告**  
ベストプラクティスとして、書き込みトランザクションを厳密にべき等にしてください。

**トランザクションをべき等にする**

再試行の場合に予期しない結果を避けるために、書き込みトランザクションをべき等にすることをお勧めします。トランザクションは、複数回実行して毎回同じ結果を生成できる場合、*idempotent* です。

例えば、`Person` という名前のテーブルにドキュメントを挿入するトランザクションについて考えてみます。トランザクションは、まずドキュメントがテーブル内に既に存在するかどうかをチェックする必要があります。このチェックを行わないと、テーブルに重複するドキュメントができる可能性があります。

QLDB がサーバー側でトランザクションを正常にコミットできるが、レスポンスを待機中にクライアントはタイムアウトするとします。トランザクションがべき等でない場合、再試行時に同じドキュメントが複数回挿入される可能性があります。

**インデックスを使用してテーブル全体のスキャンを回避する**

インデックス付きフィールドまたはドキュメント ID で**等価演算子を使用する `WHERE` 述語句でステートメントを実行する (例: `WHERE indexedField = 123` または `WHERE indexedField IN (456, 789)`) こともお勧めします。このインデックス付きのルックアップがない場合、QLDB はテーブルスキャンを実行する必要があり、トランザクションタイムアウトや**オプティミスティック同時実行制御 (OCC) 競合が発生する可能性があります。

OCC の詳細については、「[Amazon QLDB 同時実行モデル](concurrency.md)」を参照してください。

**暗黙的に作成されたトランザクション**

[QldbDriver.execute](https://javadoc.io/doc/software.amazon.qldb/amazon-qldb-driver-java/latest/software/amazon/qldb/QldbDriver.html) メソッドは、[Executor](https://javadoc.io/doc/software.amazon.qldb/amazon-qldb-driver-java/latest/software/amazon/qldb/Executor.html) のインスタンスを受け取る Lambda 関数を受け入れます。これを使用してステートメントを実行できます。`Executor` インスタンスは、暗黙的に作成されたトランザクションをラップします。

`Executor.execute` メソッドを使用して、Lambda 関数内でステートメントを実行できます。ドライバーは、Lambda 関数が戻ったときに暗黙的にトランザクションをコミットします。

次のセクションでは、基本的な CRUD オペレーションの実行、カスタム再試行ロジックの指定、一意性制約の実装方法について説明します。

**注記**  
該当する場合、これらのセクションでは、組み込みの Ion ライブラリと Jackson Ion マッパーライブラリの両方を使用して Amazon Ion データを処理するコード例を示します。詳細については、「[Amazon Ion の操作](#cookbook-java.ion)」を参照してください。

**Contents**
+ [テーブルの作成](#cookbook-java.crud.creating-tables)
+ [インデックスの作成](#cookbook-java.crud.creating-indexes)
+ [ドキュメントの読み取り](#cookbook-java.crud.reading)
+ [ドキュメントの挿入](#cookbook-java.crud.inserting)
  + [1 つのステートメントで複数のドキュメントの挿入](#cookbook-java.crud.inserting.multiple)
+ [ドキュメントの更新](#cookbook-java.crud.updating)
+ [ドキュメントの削除](#cookbook-java.crud.deleting)
+ [トランザクションで複数のステートメントの実行](#cookbook-java.crud.multi-statement)
+ [再試行ロジック](#cookbook-java.crud.retry-logic)
+ [一意性制約の実装](#cookbook-java.crud.uniqueness-constraints)

### テーブルの作成
<a name="cookbook-java.crud.creating-tables"></a>

```
qldbDriver.execute(txn -> {
    txn.execute("CREATE TABLE Person");
});
```

### インデックスの作成
<a name="cookbook-java.crud.creating-indexes"></a>

```
qldbDriver.execute(txn -> {
    txn.execute("CREATE INDEX ON Person(GovId)");
});
```

### ドキュメントの読み取り
<a name="cookbook-java.crud.reading"></a>

```
// Assumes that Person table has documents as follows:
// { GovId: "TOYENC486FH", FirstName: "Brent" }

qldbDriver.execute(txn -> {
    Result result = txn.execute("SELECT * FROM Person WHERE GovId = 'TOYENC486FH'");
    IonStruct person = (IonStruct) result.iterator().next();
    System.out.println(person.get("GovId")); // prints TOYENC486FH
    System.out.println(person.get("FirstName")); // prints Brent
});
```

**クエリパラメータの使用**

次のコード例では、Ion 型のクエリパラメータを使用します。

```
qldbDriver.execute(txn -> {
    Result result = txn.execute("SELECT * FROM Person WHERE GovId = ?",
            SYSTEM.newString("TOYENC486FH"));
    IonStruct person = (IonStruct) result.iterator().next();
    System.out.println(person.get("GovId")); // prints TOYENC486FH
    System.out.println(person.get("FirstName")); // prints Brent
});
```

次のコード例では、複数のクエリパラメータを使用します。

```
qldbDriver.execute(txn -> {
    Result result = txn.execute("SELECT * FROM Person WHERE GovId = ? AND FirstName = ?",
            SYSTEM.newString("TOYENC486FH"),
            SYSTEM.newString("Brent"));
    IonStruct person = (IonStruct) result.iterator().next();
    System.out.println(person.get("GovId")); // prints TOYENC486FH
    System.out.println(person.get("FirstName")); // prints Brent
});
```

次のコード例では、クエリパラメータのリストを使用します。

```
qldbDriver.execute(txn -> {
    final List<IonValue> parameters = new ArrayList<>();
    parameters.add(SYSTEM.newString("TOYENC486FH"));
    parameters.add(SYSTEM.newString("ROEE1"));
    parameters.add(SYSTEM.newString("YH844"));
    Result result = txn.execute("SELECT * FROM Person WHERE GovId IN (?,?,?)", parameters);
    IonStruct person = (IonStruct) result.iterator().next();
    System.out.println(person.get("GovId")); // prints TOYENC486FH
    System.out.println(person.get("FirstName")); // prints Brent
});
```

#### Jackson マッパーの使用
<a name="cookbook-java.crud.reading.jackson"></a>

```
// Assumes that Person table has documents as follows:
// {GovId: "TOYENC486FH", FirstName: "Brent" }

qldbDriver.execute(txn -> {
    try {
        Result result = txn.execute("SELECT * FROM Person WHERE GovId = 'TOYENC486FH'");
        Person person = MAPPER.readValue(result.iterator().next(), Person.class);
        System.out.println(person.getFirstName()); // prints Brent
        System.out.println(person.getGovId()); // prints TOYENC486FH
    } catch (IOException e) {
        e.printStackTrace();
    }
});
```

**クエリパラメータの使用**

次のコード例では、Ion 型のクエリパラメータを使用します。

```
qldbDriver.execute(txn -> {
    try {
        Result result = txn.execute("SELECT * FROM Person WHERE GovId = ?",
                MAPPER.writeValueAsIonValue("TOYENC486FH"));
        Person person = MAPPER.readValue(result.iterator().next(), Person.class);
        System.out.println(person.getFirstName()); // prints Brent
        System.out.println(person.getGovId()); // prints TOYENC486FH
    } catch (IOException e) {
        e.printStackTrace();
    }
});
```

次のコード例では、複数のクエリパラメータを使用します。

```
qldbDriver.execute(txn -> {
    try {
        Result result = txn.execute("SELECT * FROM Person WHERE GovId = ? AND FirstName = ?",
                MAPPER.writeValueAsIonValue("TOYENC486FH"),
                MAPPER.writeValueAsIonValue("Brent"));
        Person person = MAPPER.readValue(result.iterator().next(), Person.class);
        System.out.println(person.getFirstName()); // prints Brent
        System.out.println(person.getGovId()); // prints TOYENC486FH
    } catch (IOException e) {
        e.printStackTrace();
    }
});
```

次のコード例では、クエリパラメータのリストを使用します。

```
qldbDriver.execute(txn -> {
    try {
        final List<IonValue> parameters = new ArrayList<>();
        parameters.add(MAPPER.writeValueAsIonValue("TOYENC486FH"));
        parameters.add(MAPPER.writeValueAsIonValue("ROEE1"));
        parameters.add(MAPPER.writeValueAsIonValue("YH844"));
        Result result = txn.execute("SELECT * FROM Person WHERE GovId IN (?,?,?)", parameters);
        Person person = MAPPER.readValue(result.iterator().next(), Person.class);
        System.out.println(person.getFirstName()); // prints Brent
        System.out.println(person.getGovId()); // prints TOYENC486FH
    } catch (IOException e) {
        e.printStackTrace();
    }
});
```

**注記**  
インデックス付きルックアップなしでクエリを実行すると、完全なテーブルスキャンが呼び出されます。この例では、`GovId` フィールドで[インデックス](ql-reference.create-index.md)を使用して、パフォーマンスを最適化することをお勧めします。`GovId` でインデックスをオンにしないと、クエリのレイテンシーが大きくなり、OCC 競合例外やトランザクションタイムアウトが発生する可能性があります。

### ドキュメントの挿入
<a name="cookbook-java.crud.inserting"></a>

次のコード例では、Ion データ型を挿入します。

```
qldbDriver.execute(txn -> {
    // Check if a document with GovId:TOYENC486FH exists
    // This is critical to make this transaction idempotent
    Result result = txn.execute("SELECT * FROM Person WHERE GovId = ?",
            SYSTEM.newString("TOYENC486FH"));
    // Check if there is a result
    if (!result.iterator().hasNext()) {
        IonStruct person = SYSTEM.newEmptyStruct();
        person.put("GovId").newString("TOYENC486FH");
        person.put("FirstName").newString("Brent");
        // Insert the document
        txn.execute("INSERT INTO Person ?", person);
    }
});
```

#### Jackson マッパーの使用
<a name="cookbook-java.crud.inserting.jackson"></a>

次のコード例では、Ion データ型を挿入します。

```
qldbDriver.execute(txn -> {
    try {
        // Check if a document with GovId:TOYENC486FH exists
        // This is critical to make this transaction idempotent
        Result result = txn.execute("SELECT * FROM Person WHERE GovId = ?",
                MAPPER.writeValueAsIonValue("TOYENC486FH"));
        // Check if there is a result
        if (!result.iterator().hasNext()) {
            // Insert the document
            txn.execute("INSERT INTO Person ?",
                    MAPPER.writeValueAsIonValue(new Person("Brent", "TOYENC486FH")));
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
});
```

このトランザクションは、ドキュメントを `Person` テーブルに挿入します。挿入する前に、まずドキュメントがテーブル内に既に存在しているかどうかをチェックします。**このチェックにより、トランザクションは本質的にべき等になります。**このトランザクションを複数回実行しても、意図しない副作用は発生しません。

**注記**  
この例では、`GovId` フィールドでインデックスを使用して、パフォーマンスを最適化することをお勧めします。`GovId` でインデックスをオンにしないと、ステートメントのレイテンシーが大きくなり、OCC 競合例外やトランザクションタイムアウトが発生する可能性があります。

#### 1 つのステートメントで複数のドキュメントの挿入
<a name="cookbook-java.crud.inserting.multiple"></a>

1 つの [INSERT](ql-reference.insert.md) ステートメントを使用して複数のドキュメントを挿入するために、次のように型 [IonList](driver-working-with-ion.md#driver-ion-list) のパラメータを (明示的に `IonValue` にキャストして) ステートメントに渡すことができます。

```
// people is an IonList explicitly cast as an IonValue
txn.execute("INSERT INTO People ?", (IonValue) people);
```

`IonList` を渡すときは、変数プレースホルダー (`?`) を二重山括弧 (`<<...>>`) で囲まないでください。マニュアルの PartiQL ステートメントでは、二重山括弧は**バッグと呼ばれる順序付けされていないコレクションを表します。

##### 明示的なキャストが必要なのはなぜですか？
<a name="cookbook-java.crud.inserting.multiple.cast"></a>

[TransactionExecutor.execute](https://javadoc.io/doc/software.amazon.qldb/amazon-qldb-driver-java/latest/software/amazon/qldb/TransactionExecutor.html) メソッドはオーバーロードされています。これは、可変数の `IonValue` 引数 (*varargs*)、または単一の `List<IonValue>` 引数を受け入れます。[ion-java](https://www.javadoc.io/doc/com.amazon.ion/ion-java/latest/index.html) では、`IonList` が `List<IonValue>` として実装されます。

Java では、オーバーロードされたメソッドを呼び出すと、デフォルトで最も具体的なメソッド実装が使用されます。この場合、`IonList` パラメータを渡すと、`List<IonValue>` を使用するメソッドがデフォルトで使用されます。このメソッド実装は、呼び出されるとリストの `IonValue` 要素を個別の値として渡します。したがって、代わりに varargs メソッドを呼び出すには、`IonList` パラメータを `IonValue` に明示的にキャストする必要があります。

### ドキュメントの更新
<a name="cookbook-java.crud.updating"></a>

```
qldbDriver.execute(txn -> {
    final List<IonValue> parameters = new ArrayList<>();
    parameters.add(SYSTEM.newString("John"));
    parameters.add(SYSTEM.newString("TOYENC486FH"));
    txn.execute("UPDATE Person SET FirstName = ? WHERE GovId = ?", parameters);
});
```

#### Jackson マッパーの使用
<a name="cookbook-java.crud.updating.jackson"></a>

```
qldbDriver.execute(txn -> {
    try {
        final List<IonValue> parameters = new ArrayList<>();
        parameters.add(MAPPER.writeValueAsIonValue("John"));
        parameters.add(MAPPER.writeValueAsIonValue("TOYENC486FH"));
        txn.execute("UPDATE Person SET FirstName = ? WHERE GovId = ?", parameters);
    } catch (IOException e) {
        e.printStackTrace();
    }
});
```

**注記**  
この例では、`GovId` フィールドでインデックスを使用して、パフォーマンスを最適化することをお勧めします。`GovId` でインデックスをオンにしないと、ステートメントのレイテンシーが大きくなり、OCC 競合例外やトランザクションタイムアウトが発生する可能性があります。

### ドキュメントの削除
<a name="cookbook-java.crud.deleting"></a>

```
qldbDriver.execute(txn -> {
    txn.execute("DELETE FROM Person WHERE GovId = ?",
            SYSTEM.newString("TOYENC486FH"));
});
```

#### Jackson マッパーの使用
<a name="cookbook-java.crud.deleting.jackson"></a>

```
qldbDriver.execute(txn -> {
    try {
        txn.execute("DELETE FROM Person WHERE GovId = ?",
                MAPPER.writeValueAsIonValue("TOYENC486FH"));
    } catch (IOException e) {
        e.printStackTrace();
    }
});
```

**注記**  
この例では、`GovId` フィールドでインデックスを使用して、パフォーマンスを最適化することをお勧めします。`GovId` でインデックスをオンにしないと、ステートメントのレイテンシーが大きくなり、OCC 競合例外やトランザクションタイムアウトが発生する可能性があります。

### トランザクションで複数のステートメントの実行
<a name="cookbook-java.crud.multi-statement"></a>

```
// This code snippet is intentionally trivial. In reality you wouldn't do this because you'd
// set your UPDATE to filter on vin and insured, and check if you updated something or not.
public static boolean InsureCar(QldbDriver qldbDriver, final String vin) {
    final IonSystem ionSystem = IonSystemBuilder.standard().build();
    final IonString ionVin = ionSystem.newString(vin);

    return qldbDriver.execute(txn -> {
        Result result = txn.execute(
                "SELECT insured FROM Vehicles WHERE vin = ? AND insured = FALSE",
                ionVin);
        if (!result.isEmpty()) {
            txn.execute("UPDATE Vehicles SET insured = TRUE WHERE vin = ?", ionVin);
            return true;
        }
        return false;
    });
}
```

### 再試行ロジック
<a name="cookbook-java.crud.retry-logic"></a>

ドライバーの `execute` メソッドには、再試行可能な例外 (タイムアウトや OCC 競合など) が発生した場合にトランザクションを再試行する組み込みの再試行メカニズムがあります。

------
#### [ 2.x ]

再試行の最大数とバックオフ戦略を設定できます。

デフォルトの再試行制限は `4` であり、デフォルトのバックオフ戦略は [DefaultQldbTransactionBackoffStrategy](https://javadoc.io/doc/software.amazon.qldb/amazon-qldb-driver-java/latest/software/amazon/qldb/DefaultQldbTransactionBackoffStrategy.html) です。再試行設定は、[RetryPolicy](https://javadoc.io/doc/software.amazon.qldb/amazon-qldb-driver-java/latest/software/amazon/qldb/RetryPolicy.html) のインスタンスを使用して、ドライバーインスタンスごとおよびトランザクションごとに設定できます。

次のコード例では、ドライバーのインスタンスのカスタム再試行制限とカスタムバックオフ戦略を使用して再試行ロジックを指定します。

```
public void retry() {
    QldbDriver qldbDriver = QldbDriver.builder()
            .ledger("vehicle-registration")
            .transactionRetryPolicy(RetryPolicy.builder()
                    .maxRetries(2)
                    .backoffStrategy(new CustomBackOffStrategy()).build())
            .sessionClientBuilder(QldbSessionClient.builder())
            .build();
}

private class CustomBackOffStrategy implements BackoffStrategy {

    @Override
    public Duration calculateDelay(RetryPolicyContext retryPolicyContext) {
        return Duration.ofMillis(1000 * retryPolicyContext.retriesAttempted());
    }
}
```

次のコード例では、特定のトランザクションのカスタム再試行制限とカスタムバックオフ戦略を使用して再試行ロジックを指定します。`execute` のこの設定は、ドライバーインスタンスに設定された再試行ロジックを上書きします。

```
public void retry() {
    Result result = qldbDriver.execute(txn -> { txn.execute("SELECT * FROM Person WHERE GovId = ?",
            SYSTEM.newString("TOYENC486FH")); },
            RetryPolicy.builder()
                    .maxRetries(2)
                    .backoffStrategy(new CustomBackOffStrategy())
                    .build());
}

private class CustomBackOffStrategy implements BackoffStrategy {

    // Configuring a custom backoff which increases delay by 1s for each attempt.
    @Override
    public Duration calculateDelay(RetryPolicyContext retryPolicyContext) {
        return Duration.ofMillis(1000 * retryPolicyContext.retriesAttempted());
    }
}
```

------
#### [ 1.x ]

再試行の最大数は設定可能です。再試行制限を設定するには、`PooledQldbDriver` の初期化時に `retryLimit` プロパティを設定します。

デフォルトの再試行制限回数は `4` です。

------

### 一意性制約の実装
<a name="cookbook-java.crud.uniqueness-constraints"></a>

QLDB はユニークインデックスをサポートしていませんが、この動作をアプリケーションに実装できます。

`Person` テーブル内の `GovId` フィールドに対して一意性制約を実装するとします。これを行うには、以下を実行するトランザクションを記述します。

1. テーブルに指定された `GovId` を持つ既存のドキュメントがないことをアサートします。

1. アサーションに合格した場合は、ドキュメントを挿入します。

競合するトランザクションが同時にアサーションに合格すると、一方のトランザクションだけが正常にコミットされます。もう一方のトランザクションは OCC 競合例外で失敗します。

次のコード例は、この一意性制約ロジックを実装する方法を示しています。

```
qldbDriver.execute(txn -> {
    Result result = txn.execute("SELECT * FROM Person WHERE GovId = ?",
            SYSTEM.newString("TOYENC486FH"));
    // Check if there is a result
    if (!result.iterator().hasNext()) {
        IonStruct person = SYSTEM.newEmptyStruct();
        person.put("GovId").newString("TOYENC486FH");
        person.put("FirstName").newString("Brent");
        // Insert the document
        txn.execute("INSERT INTO Person ?", person);
    }
});
```

**注記**  
この例では、`GovId` フィールドでインデックスを使用して、パフォーマンスを最適化することをお勧めします。`GovId` でインデックスをオンにしないと、ステートメントのレイテンシーが大きくなり、OCC 競合例外やトランザクションタイムアウトが発生する可能性があります。

## Amazon Ion の操作
<a name="cookbook-java.ion"></a>

QLDB で Amazon Ion データを処理するには、複数の方法があります。[Ion ライブラリ](https://github.com/amzn/ion-java)から組み込みメソッドを使用するには、必要に応じて、ドキュメントを柔軟に作成および変更します。または、FasterXML の [Ion 用 Jackson データフォーマットモジュール](https://github.com/FasterXML/jackson-dataformats-binary/tree/master/ion)を使用して Ion ドキュメントを *Plain Old Java Object* (POJO) モデルにマップすることもできます。

次のセクションでは、両方の手法を使用して Ion データを処理するコード例について説明します。

**Contents**
+ [Ion パッケージのインポート](#cookbook-java.ion.importing)
+ [Ion の初期化](#cookbook-java.ion.initializing)
+ [Ion オブジェクトの作成](#cookbook-java.ion.creating)
+ [Ion オブジェクトの作成](#cookbook-java.ion.reading)

### Ion パッケージのインポート
<a name="cookbook-java.ion.importing"></a>

アーティファクト [ion-java](https://search.maven.org/artifact/com.amazon.ion/ion-java/1.6.1/bundle) を Java プロジェクトの依存関係として追加します。

------
#### [ Gradle ]

```
dependencies {
    compile group: 'com.amazon.ion', name: 'ion-java', version: '1.6.1'
}
```

------
#### [ Maven ]

```
<dependencies>
  <dependency>
    <groupId>com.amazon.ion</groupId>
    <artifactId>ion-java</artifactId>
    <version>1.6.1</version>
  </dependency>
</dependencies>
```

------

次の Ion パッケージをインポートします。

```
import com.amazon.ion.IonStruct;
import com.amazon.ion.IonSystem;
import com.amazon.ion.system.IonSystemBuilder;
```

#### Jackson マッパーの使用
<a name="cookbook-java.ion.importing.jackson"></a>

アーティファクト [jackson-dataformat-ion](https://search.maven.org/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-ion/2.10.0/bundle) を Java プロジェクトの依存関係として追加します。QLDB にはバージョン `2.10.0` 以降が必要です。

------
#### [ Gradle ]

```
dependencies {
    compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-ion', version: '2.10.0'
}
```

------
#### [ Maven ]

```
<dependencies>
  <dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-ion</artifactId>
    <version>2.10.0</version>
  </dependency>
</dependencies>
```

------

次の Ion パッケージをインポートします。

```
import com.amazon.ion.IonReader;
import com.amazon.ion.IonStruct;
import com.amazon.ion.system.IonReaderBuilder;
import com.amazon.ion.system.IonSystemBuilder;

import com.fasterxml.jackson.dataformat.ion.IonObjectMapper;
import com.fasterxml.jackson.dataformat.ion.ionvalue.IonValueMapper;
```

### Ion の初期化
<a name="cookbook-java.ion.initializing"></a>

```
IonSystem SYSTEM = IonSystemBuilder.standard().build();
```

#### Jackson マッパーの使用
<a name="cookbook-java.ion.initializing.jackson"></a>

```
IonObjectMapper MAPPER = new IonValueMapper(IonSystemBuilder.standard().build());
```

### Ion オブジェクトの作成
<a name="cookbook-java.ion.creating"></a>

次のコード例では、`IonStruct` インターフェイスとその組み込みメソッドを使用して Ion オブジェクトを作成します。

```
IonStruct ionStruct = SYSTEM.newEmptyStruct();

ionStruct.put("GovId").newString("TOYENC486FH");
ionStruct.put("FirstName").newString("Brent");

System.out.println(ionStruct.toPrettyString()); // prints a nicely formatted copy of ionStruct
```

#### Jackson マッパーの使用
<a name="cookbook-java.ion.creating.jackson"></a>

以下のような `Person` という名前の JSON にマップされたモデルクラスがあるとします。

```
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public static class Person {
    private final String firstName;
    private final String govId;

    @JsonCreator
    public Person(@JsonProperty("FirstName") final String firstName,
                  @JsonProperty("GovId") final String govId) {
        this.firstName = firstName;
        this.govId = govId;
    }

    @JsonProperty("FirstName")
    public String getFirstName() {
        return firstName;
    }

    @JsonProperty("GovId")
    public String getGovId() {
        return govId;
    }
}
```

次のコード例では、`Person` のインスタンスから `IonStruct` オブジェクトを作成します。

```
IonStruct ionStruct = (IonStruct) MAPPER.writeValueAsIonValue(new Person("Brent", "TOYENC486FH"));
```

### Ion オブジェクトの作成
<a name="cookbook-java.ion.reading"></a>

次のコード例では、`ionStruct` インスタンスの各フィールドを出力します。

```
// ionStruct is an instance of IonStruct
System.out.println(ionStruct.get("GovId")); // prints TOYENC486FH
System.out.println(ionStruct.get("FirstName")); // prints Brent
```

#### Jackson マッパーの使用
<a name="cookbook-java.ion.reading.jackson"></a>

次のコード例では、`IonStruct` オブジェクトを読み取り、`Person` のインスタンスにマップします。

```
// ionStruct is an instance of IonStruct
IonReader reader = IonReaderBuilder.standard().build(ionStruct);
Person person = MAPPER.readValue(reader, Person.class);
System.out.println(person.getFirstName()); // prints Brent
System.out.println(person.getGovId()); // prints TOYENC486FH
```

Ion の操作方法の詳細については、GitHub で [Amazon Ion のドキュメント](http://amzn.github.io/ion-docs/)を参照してください。QLDB で Ion を操作するコード例については、「[Amazon QLDB で Amazon Ion のデータ型を操作する](driver-working-with-ion.md)」を参照してください。