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— 要更新的项目的完整主键。updateExpression— 一个或多个子句:SET赋值属性(#upd0 = :updValue0设置Genre;#upd1 = :updValue1设置Year)。每个属性都通过expressionAttributeNames做了别名,因此像Year这样的保留字总是安全的。- 对数字使用
ADD会做一次原子递增(ADD #upd2 :updValue2给Awards加 1)——在并发下安全,没有读-改-写竞态。REMOVE删除一个属性;DELETE从集合中移除元素。
expressionAttributeValues—:placeholder→ 带类型AttributeValue映射。returnValues(ReturnValue.ALL_NEW)— 在response.attributes()中返回更新后的完整项目(另有UPDATED_NEW、ALL_OLD、UPDATED_OLD或NONE)。- Upsert 语义 — 若键不存在,
UpdateItem会创建该项目。加上一个conditionExpression(例如attribute_exists(Artist))可实现仅更新。 - 优先使用更新表达式而非旧式的
attributeUpdates映射——表达式支持在一次请求中使用多个子句、别名和条件。
可视化操作
DynamoDB Expression Builder 会连同名称/值映射构建 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" — 为什么这里的别名映射不是可选的。
- "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
Last verified 2026-07-13 against the official AWS documentation linked above.