Java (AWS SDK v2) での DynamoDB UpdateItem

UpdateItem は1つのアイテムの特定の属性を変更し(アイテムが存在しなければ作成し)、それ以外はそのまま残します。AWS SDK for Java 2.x では、updateExpression を持つ UpdateItemRequest を構築します。

Code

import java.util.HashMap;
import java.util.Map;

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.ReturnValue;
import software.amazon.awssdk.services.dynamodb.model.UpdateItemRequest;
import software.amazon.awssdk.services.dynamodb.model.UpdateItemResponse;

public class UpdateItemExample {
    public static void main(String[] args) {
        try (DynamoDbClient ddb = DynamoDbClient.builder()
                .region(Region.US_EAST_1)
                .build()) {

            Map<String, AttributeValue> key = new HashMap<>();
            key.put("Artist", AttributeValue.builder().s("Arturo Sandoval").build());
            key.put("SongTitle", AttributeValue.builder().s("Cubano Chant").build());

            Map<String, String> names = new HashMap<>();
            names.put("#upd0", "Genre");
            names.put("#upd1", "Year");
            names.put("#upd2", "Awards");

            Map<String, AttributeValue> values = new HashMap<>();
            values.put(":updValue0", AttributeValue.builder().s("Latin Jazz").build());
            values.put(":updValue1", AttributeValue.builder().n("1994").build());
            values.put(":updValue2", AttributeValue.builder().n("1").build());

            UpdateItemRequest request = UpdateItemRequest.builder()
                    .tableName("Music")
                    .key(key)
                    .updateExpression("SET #upd0 = :updValue0, #upd1 = :updValue1 ADD #upd2 :updValue2")
                    .expressionAttributeNames(names)
                    .expressionAttributeValues(values)
                    .returnValues(ReturnValue.ALL_NEW)
                    .build();

            UpdateItemResponse response = ddb.updateItem(request);
            System.out.println(response.attributes()); // the item after the update
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
        }
    }
}

Explanation

  • key — 更新するアイテムの完全なプライマリキー。
  • updateExpression — 1つ以上の句:
    • SET は属性を代入します(#upd0 = :updValue0Genre を設定、#upd1 = :updValue1Year を設定)。すべての属性は expressionAttributeNames を介してエイリアス化されるので、Year のような予約語は常に安全です。
    • 数値に対する ADDアトミックなインクリメントを行います(ADD #upd2 :updValue2Awards に 1 を加えます)。並行処理下でも安全で、read-modify-write の競合はありません。REMOVE は属性を削除し、DELETE はセットから要素を除去します。
  • expressionAttributeValues:placeholder → 型付き AttributeValue のマップ。
  • returnValues(ReturnValue.ALL_NEW) — 更新後の完全なアイテムを response.attributes() で返します(他に UPDATED_NEWALL_OLDUPDATED_OLDNONE)。
  • アップサートのセマンティクスUpdateItem はキーが存在しなければアイテムを作成します。更新のみにするには conditionExpression(例: attribute_exists(Artist))を追加します。
  • レガシーな attributeUpdates マップより更新式を優先しましょう。式は1回のリクエストで複数の句、エイリアス、条件をサポートします。

Do it visually

DynamoDB Expression Builder は名前/値のマップとともに SET / ADD / REMOVE の句を構築し、実行可能なコードをコピーします。

GUI でアイテムを編集するには(フィールドを変更し、生成された UpdateExpression を確認し、コードをコピー)、DynoTable をダウンロードしてください。

References

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

DynoTable は DynamoDB 向けの高速なデスクトップクライアントです — テーブルを閲覧し、SQL スタイルのクエリを実行し、アイテムをローカルで編集できます。