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 :updValue2Awards 加 1)——在并发下安全,没有读-改-写竞态。REMOVE 删除一个属性;DELETE 从集合中移除元素。
  • expressionAttributeValues:placeholder → 带类型 AttributeValue 映射。
  • returnValues(ReturnValue.ALL_NEW) — 在 response.attributes() 中返回更新后的完整项目(另有 UPDATED_NEWALL_OLDUPDATED_OLDNONE)。
  • Upsert 语义 — 若键不存在,UpdateItem 会创建该项目。加上一个 conditionExpression(例如 attribute_exists(Artist))可实现仅更新。
  • 优先使用更新表达式而非旧式的 attributeUpdates 映射——表达式支持在一次请求中使用多个子句、别名和条件。

可视化操作

DynamoDB Expression Builder 会连同名称/值映射构建 SET / ADD / REMOVE 子句并复制可运行代码。

想在 GUI 中编辑项目——更改某个字段、审阅生成的 UpdateExpression、复制代码——请下载 DynoTable

相关示例

References

Last verified 2026-07-13 against the official AWS documentation linked above.

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。