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 sebuahString—AttributeValue.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 tulisannyan("1994"), dan mem-parse-nya kembali adalah urusan Anda.item()tak pernah mengembalikannull— kalau tidak ketemu ia menghasilkan map kosong, jadiisEmpty()adalah ujinya. Untuk memisahkan "layanan tidak mengembalikan apa-apa" dari "layanan mengembalikan map kosong", panggilhasItem(); SDK membentuk koleksi kosong secara otomatis danhasItem()satu-satunya yang bisa menembus itu.- Map yang dikembalikannya immutable — Javadoc menyatakan dengan jelas bahwa memodifikasinya melempar
UnsupportedOperationException. Salin dulu keHashMapkalau Anda berniat menyuntingnya. - Tak ada yang memvalidasi map alias itu secara lokal —
expressionAttributeNameshanyalahMap<String, String>biasa.#proj3wajib di sini karenaYearadalah 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
mainsekali 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 mapAttributeValuemulai 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
- DynamoDB GetItem di Go — pembacaan yang sama dengan AWS SDK for Go v2.
- DynamoDB Query di Java — baca satu partisi utuh alih-alih satu item.
- Cara kerja partition key DynamoDB — mengapa
GetItembutuh key lengkap. - DynamoDB ResourceNotFoundException — error pertama yang biasa muncul di sini: nama tabel atau region yang salah.
- "The provided key element does not match the schema" — key yang Anda lewatkan tidak cocok dengan key schema tabelnya.
Referensi
- 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
Terakhir diverifikasi 2026-07-28 terhadap dokumentasi resmi AWS yang ditautkan di atas.