在 Java(AWS SDK v2)中使用 DynamoDB UpdateItem

UpdateItem 改動單一項目的特定屬性(若項目不存在則建立),其餘一切保持不動。在 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());
        }
    }
}

說明

  • key — 要更新之項目的完整 primary key。
  • updateExpression — 一或多個子句:
    • SET 指派屬性(#upd0 = :updValue0 設定 Genre#upd1 = :updValue1 設定 Year)。每個屬性都透過 expressionAttributeNames 以別名表示,因此像 Year 這樣的保留字永遠安全。
    • ADD 對數字執行 atomic 遞增(ADD #upd2 :updValue2Awards 加 1)— 在並行下安全,沒有 read-modify-write 競爭。REMOVE 刪除一個屬性;DELETE 從 set 移除元素。
  • expressionAttributeValues:placeholder → 帶型別 AttributeValue 的 map。
  • returnValues(ReturnValue.ALL_NEW) — 在 response.attributes() 回傳更新後的完整項目(另有 UPDATED_NEWALL_OLDUPDATED_OLDNONE)。
  • Upsert 語意 — 若 key 不存在,UpdateItem 會建立該項目。加上 conditionExpression(例如 attribute_exists(Artist))可改為只更新。
  • 優先使用 update expression 而非舊式的 attributeUpdates map — 運算式在一個請求中支援多個子句、別名與條件。

改用視覺化操作

DynamoDB Expression Builder 會以 name/value map 建立 SET / ADD / REMOVE 子句並複製可執行的程式碼。

想在 GUI 中編輯項目 — 改動欄位、審視產生的 UpdateExpression、複製程式碼 — 下載 DynoTable

相關範例

References

最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。

不必透過主控台就能操作 DynamoDB

DynoTable 是一款快速的 DynamoDB 桌面用戶端 — 瀏覽表格、執行 SQL 風格的查詢,並在本機編輯項目。