在 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 :updValue2為Awards加 1)— 在並行下安全,沒有 read-modify-write 競爭。REMOVE刪除一個屬性;DELETE從 set 移除元素。
expressionAttributeValues—:placeholder→ 帶型別AttributeValue的 map。returnValues(ReturnValue.ALL_NEW)— 在response.attributes()回傳更新後的完整項目(另有UPDATED_NEW、ALL_OLD、UPDATED_OLD或NONE)。- Upsert 語意 — 若 key 不存在,
UpdateItem會建立該項目。加上conditionExpression(例如attribute_exists(Artist))可改為只更新。 - 優先使用 update expression 而非舊式的
attributeUpdatesmap — 運算式在一個請求中支援多個子句、別名與條件。
改用視覺化操作
DynamoDB Expression Builder 會以 name/value map 建立 SET / ADD / REMOVE 子句並複製可執行的程式碼。
想在 GUI 中編輯項目 — 改動欄位、審視產生的 UpdateExpression、複製程式碼 — 下載 DynoTable。
相關範例
- 在 Go 中使用 DynamoDB UpdateItem — 以 AWS SDK for Go v2 執行相同的更新。
- 在 Java 中使用 DynamoDB PutItem — 改為取代整個項目。
- DynamoDB 更新運算式 —
SET、ADD、REMOVE、DELETE與慣用手法。 - 認識 ReturnValues — 每個
ReturnValues選項給你什麼。 - "Attribute name is a reserved keyword" — 為什麼這裡的別名 map 並非選用。
- "Invalid UpdateExpression" syntax errors — 常見的 SET/ADD 語法錯誤,解碼說明。
References
- UpdateItem — Amazon DynamoDB API Reference
- Use UpdateItem with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- DynamoDbClient — AWS SDK for Java 2.x API Reference
- UpdateItemRequest — AWS SDK for Java 2.x API Reference
- Update expressions — Amazon DynamoDB Developer Guide
最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。