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()接受的是String—AttributeValue.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 Client(software.amazon.awssdk.enhanced.dynamodb),它能在這些相同的低階呼叫之上,把項目映射到加了註解的 bean。
改用視覺化操作
這次讀取要算 0.5 還是 1 個容量單位,取決於項目是否塞得進 4 KB。項目大小計算機會拿貼上的項目去量那條界線。
DynoTable 把同樣的項目顯示成普通的資料列,並把格線背後的查詢匯出成一支用這些建構器寫成的 Java 程式。下載 DynoTable。
相關範例
- Go 中的 DynamoDB GetItem — 以 AWS SDK for Go v2 做同一次讀取。
- Java 中的 DynamoDB Query — 讀取整個分割區,而不是單一項目。
- DynamoDB partition key 的運作方式 — 為什麼
GetItem需要完整的 key。 - DynamoDB ResourceNotFoundException — 這裡常見的第一個錯誤:表格名稱或 region 錯誤。
- "The provided key element does not match the schema" — 你傳入的 key 與表格的 key schema 不符。
參考資料
- GetItem — Amazon DynamoDB API Reference
- Use GetItem with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- DynamoDbClient — AWS SDK for Java 2.x API Reference
- GetItemRequest — AWS SDK for Java 2.x API Reference
- Read consistency — Amazon DynamoDB Developer Guide
- Use singleton service client instances with the AWS SDK for Java 2.x
最後驗證於 2026-07-28,對照上方連結的 AWS 官方文件。