DynamoDB GetItem di Java (AWS SDK v2)

AWS SDK for Java 2.x memodelkan sebuah item sebagai Map<String, AttributeValue> yang dirakit lewat builder immutable. Dua konvensinya berbeda dari kebanyakan SDK lain: angka bertipe string, dan koleksi respons tak pernah null.

Request-nya sendiri butuh primary key lengkap, sama seperti di mana pun.

Kode

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

Penjelasan

  • n() menerima sebuah StringAttributeValue.builder().n(1994) tidak akan terkompilasi. Javadoc-nya memberi alasannya: "Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries." Jadi tulisannya n("1994"), dan mem-parse-nya kembali adalah urusan Anda.
  • item() tak pernah mengembalikan null — kalau tidak ketemu ia menghasilkan map kosong, jadi isEmpty() adalah ujinya. Untuk memisahkan "layanan tidak mengembalikan apa-apa" dari "layanan mengembalikan map kosong", panggil hasItem(); SDK membentuk koleksi kosong secara otomatis dan hasItem() satu-satunya yang bisa menembus itu.
  • Map yang dikembalikannya immutable — Javadoc menyatakan dengan jelas bahwa memodifikasinya melempar UnsupportedOperationException. Salin dulu ke HashMap kalau Anda berniat menyuntingnya.
  • Tak ada yang memvalidasi map alias itu secara lokalexpressionAttributeNames hanyalah Map<String, String> biasa. #proj3 wajib di sini karena Year adalah reserved word, dan alias yang Anda deklarasikan tapi tak pernah dirujuk punya error sisi-layanannya sendiri: "Value provided in ExpressionAttributeNames unused in expressions".
  • Satu client untuk seluruh aplikasi — AWS menyatakannya terus terang: "Service clients in the AWS SDK for Java 2.x are thread-safe." Blok try-with-resources cocok untuk main sekali jalan; dalam layanan berumur panjang, bangun client-nya saat startup dan jangan pernah menutupnya per request.
  • .consistentRead(true) melipatgandakan biaya baca dan ditolak pada sebuah GSI. Kalau map AttributeValue mulai terasa merepotkan, DynamoDB Enhanced Client (software.amazon.awssdk.enhanced.dynamodb) memetakan item ke bean beranotasi di atas panggilan tingkat rendah yang sama ini.

Lakukan secara visual

Apakah pembacaan ini menagih 0,5 atau 1 unit kapasitas bergantung pada apakah item-nya muat di bawah 4 KB. Kalkulator ukuran item mengukur item yang Anda tempelkan terhadap batas itu.

DynoTable menampilkan item yang sama sebagai baris biasa, dan mengekspor query di balik grid itu sebagai program Java yang dibangun dari builder-builder ini. Unduh DynoTable.

Contoh terkait

Referensi

Terakhir diverifikasi 2026-07-28 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.