Java(AWS SDK v2)中的 DynamoDB GetItem

AWS SDK for Java 2.x 把項目模型化為一個 Map<String, AttributeValue>,並透過不可變的建構器組出來。它有兩個慣例和多數其他 SDK 不同:數字以字串型別表示,而回應中的集合永遠不會是 null。

請求本身需要完整的 primary key,這一點跟其他地方一樣。

程式碼

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.GetItemRequest;

public class GetItemExample {
    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("#proj0", "Artist");
            names.put("#proj1", "SongTitle");
            names.put("#proj2", "AlbumTitle");
            names.put("#proj3", "Year");

            GetItemRequest request = GetItemRequest.builder()
                    .tableName("Music")
                    .key(key)
                    .projectionExpression("#proj0, #proj1, #proj2, #proj3")
                    .expressionAttributeNames(names)
                    .build();

            Map<String, AttributeValue> item = ddb.getItem(request).item();
            if (item.isEmpty()) {
                System.out.println("Item not found");
            } else {
                System.out.println(item);
            }
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
        }
    }
}

說明

  • n() 接受的是 StringAttributeValue.builder().n(1994) 無法通過編譯。Javadoc 給了理由:"Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries." 所以要寫 n("1994"),而回程的剖析是你自己的事。
  • item() 永遠不會回傳 null — 沒有命中時得到的是空 map,所以測試方式是 isEmpty()。若要區分「服務什麼都沒回」與「服務回了一個空 map」,請呼叫 hasItem();SDK 會自動建出空集合,而 hasItem() 是唯一能看穿這一點的東西。
  • 它交還的 map 是不可變的 — Javadoc 明確指出修改它會拋出 UnsupportedOperationException。若你打算編輯,請先複製到 HashMap
  • 本機端不會驗證別名對應expressionAttributeNames 只是一個普通的 Map<String, String>。這裡需要 #proj3 是因為 Year保留字,而宣告了卻從未被引用的別名本身就是一個服務端錯誤:"Value provided in ExpressionAttributeNames unused in expressions"
  • 整個應用共用一個用戶端 — AWS 說得很直白:"Service clients in the AWS SDK for Java 2.x are thread-safe." try-with-resources 區塊適合一次性的 main;在長時間執行的服務裡,請在啟動時建立用戶端,而且絕不要每個請求就關掉它。
  • .consistentRead(true) 會讓讀取成本加倍,而且在 GSI 上會被拒絕。如果 AttributeValue 對應開始讓你嫌煩,可以改用 DynamoDB Enhanced Clientsoftware.amazon.awssdk.enhanced.dynamodb),它能在這些相同的低階呼叫之上,把項目映射到加了註解的 bean。

改用視覺化操作

這次讀取要算 0.5 還是 1 個容量單位,取決於項目是否塞得進 4 KB。項目大小計算機會拿貼上的項目去量那條界線。

DynoTable 把同樣的項目顯示成普通的資料列,並把格線背後的查詢匯出成一支用這些建構器寫成的 Java 程式。下載 DynoTable

相關範例

參考資料

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

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

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。