DynamoDB GetItem in Java (AWS SDK v2)

AWS SDK for Java 2.x modelliert ein Item als Map<String, AttributeValue>, zusammengesetzt über unveränderliche Builder. Zwei seiner Konventionen weichen von den meisten anderen SDKs ab: Zahlen sind als Strings typisiert, und Antwort-Collections sind nie null.

Der Request selbst braucht den vollständigen Primary Key, wie überall sonst auch.

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.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());
        }
    }
}

Erklärung

  • n() nimmt einen StringAttributeValue.builder().n(1994) kompiliert nicht. Das Javadoc nennt den Grund: "Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries." Also n("1994"), und das Parsen auf dem Rückweg ist deine Sache.
  • item() gibt nie null zurück — ein Fehlschlag liefert eine leere Map, isEmpty() ist also der Test. Um „der Dienst hat nichts zurückgegeben" von „der Dienst hat eine leere Map zurückgegeben" zu trennen, ruf hasItem() auf; das SDK konstruiert leere Collections automatisch, und hasItem() ist das Einzige, was da hindurchsieht.
  • Die zurückgegebene Map ist unveränderlich — das Javadoc sagt ausdrücklich, dass eine Änderung eine UnsupportedOperationException wirft. Kopiere sie erst in eine HashMap, wenn du sie bearbeiten willst.
  • Nichts validiert die Alias-Map lokalexpressionAttributeNames ist eine schlichte Map<String, String>. #proj3 ist hier nötig, weil Year ein reserviertes Wort ist, und ein Alias, den du deklarierst, aber nie referenzierst, ist ein eigener serverseitiger Fehler: „Value provided in ExpressionAttributeNames unused in expressions".
  • Ein Client für die ganze Anwendung — AWS sagt es unmissverständlich: "Service clients in the AWS SDK for Java 2.x are thread-safe." Der try-with-resources-Block passt zu einer einmaligen main; in einem langlaufenden Dienst baust du den Client beim Start und schließt ihn nie pro Request.
  • .consistentRead(true) verdoppelt die Lesekosten und wird auf einem GSI abgelehnt. Wenn AttributeValue-Maps mühsam werden: Der DynamoDB Enhanced Client (software.amazon.awssdk.enhanced.dynamodb) bildet Items über denselben Low-Level-Aufrufen auf annotierte Beans ab.

Mach es visuell

Ob dieses Lesen 0,5 oder 1 Kapazitätseinheit kostet, hängt daran, ob das Item in 4 KB passt. Der Item-Size-Rechner misst ein eingefügtes Item gegen diese Grenze.

DynoTable zeigt dieselben Items als gewöhnliche Zeilen und exportiert die Abfrage hinter dem Grid als Java-Programm, aufgebaut aus diesen Buildern. DynoTable herunterladen.

Verwandte Beispiele

Referenzen

Zuletzt verifiziert am 2026-07-28 gegen die oben verlinkte offizielle AWS-Dokumentation.

Mit DynamoDB ohne die Console arbeiten

Ein schneller DynamoDB-Desktop-Client, der das echte SQL ausführt, das DynamoDB nicht kann — JOINs, GROUP BY, Aggregationen — mit visueller Bearbeitung und einem KI-Agenten auf deinen eigenen Bedrock-Schlüsseln.

30 Tage kostenlos testen, keine Kreditkarte — danach der Kostenlos-Tarif ohne Zeitlimit.