Java'da DynamoDB PutItem (AWS SDK v2)

PutItem bir öğenin tamamını yazar; onu oluşturur ya da aynı birincil anahtara sahip mevcut bir öğenin yerine geçer. Java 2.x için AWS SDK'da, item eşlemesi her özniteliği türlü bir AttributeValue olarak tutan bir PutItemRequest oluşturursunuz (dizeler için .s(...), sayılar için .n(...)).

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.ConditionalCheckFailedException;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.PutItemRequest;

public class PutItemExample {
    public static void main(String[] args) {
        try (DynamoDbClient ddb = DynamoDbClient.builder()
                .region(Region.US_EAST_1)
                .build()) {

            Map<String, AttributeValue> item = new HashMap<>();
            item.put("Artist", AttributeValue.builder().s("Arturo Sandoval").build());
            item.put("SongTitle", AttributeValue.builder().s("Cubano Chant").build());
            item.put("AlbumTitle", AttributeValue.builder().s("Danzon").build());
            item.put("Year", AttributeValue.builder().n("1994").build());
            item.put("Awards", AttributeValue.builder().n("0").build());

            Map<String, String> names = new HashMap<>();
            names.put("#cond0", "Artist");
            names.put("#cond1", "SongTitle");

            PutItemRequest request = PutItemRequest.builder()
                    .tableName("Music")
                    .item(item)
                    .conditionExpression("attribute_not_exists(#cond0) AND attribute_not_exists(#cond1)")
                    .expressionAttributeNames(names)
                    .build();

            try {
                ddb.putItem(request);
                System.out.println("Song written");
            } catch (ConditionalCheckFailedException e) {
                System.out.println("A song with that key already exists — not overwritten");
            }
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
        }
    }
}

Açıklama

  • item — tablonun tam birincil anahtarını, artı diğer öznitelikleri içermelidir. Sayılar N türü altında dizedir (AttributeValue.builder().n("1994")).
  • Put yerine geçer — koşul olmadan PutItem, aynı anahtara sahip mevcut bir öğeyi sessizce üzerine yazar. Gerisini ezmeden birkaç özniteliği değiştirmek için UpdateItem kullanın.
  • conditionExpression — anahtar öznitelikleri üzerinde attribute_not_exists(...), yazmayı yalnızca oluşturma amaçlı bir eklemeye dönüştürür; öğe zaten varsa yazma ConditionalCheckFailedException ile başarısız olur. Bu, DynamoDB'nin iyimser-kilitleme ilkelidir. #cond0/#cond1 takma adları expressionAttributeNames aracılığıyla Artist/SongTitle'a çözümlenir (ayrılmış sözcük güvenli).
  • ConditionalCheckFailedException, DynamoDbException'ı genişletir — başarısız koşulun diğer hizmet hatalarından ayrı ele alınması için onu önce yakalayın (yukarıdaki iç try).
  • Üzerine yazılan öğeyi geri almak için .returnValues(ReturnValue.ALL_OLD) ekleyin.
  • Düz Java nesnelerini mi tercih edersiniz? DynamoDB Enhanced Client (software.amazon.awssdk.enhanced.dynamodb), AttributeValue eşlemeleri yerine açıklamalı bean sınıfları yazar.

Görsel olarak yapın

Koşullu bir put'u elle mi yazıyorsunuz? DynamoDB Expression Builder, ConditionExpression'ı bir araya getirir ve kodu kopyalar.

Öğeleri bir grafik arayüzde (GUI) eklemek ve düzenlemek için — öznitelik başına bir form, tür seçiciler ve kod olarak kopyalama — DynoTable'ı indirin.

İlgili örnekler

References

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalışın

DynoTable, DynamoDB için hızlı bir masaüstü istemcisidir — tablolara göz atın, SQL tarzı sorgular çalıştırın ve item'ları yerel olarak düzenleyin.