

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Ikhtisar dukungan AWS SDK untuk DynamoDB
<a name="Programming.SDKOverview"></a>

Diagram berikut memberikan gambaran tingkat tinggi pemrograman aplikasi Amazon DynamoDB menggunakan file. AWS SDKs

![\[Model pemrograman untuk menggunakan DynamoDB dengan. AWS SDKs\]](http://docs.aws.amazon.com/id_id/amazondynamodb/latest/developerguide/images/SDKSupport.png)


1. Anda menulis aplikasi menggunakan AWS SDK untuk bahasa pemrograman Anda.

1. Setiap AWS SDK menyediakan satu atau lebih antarmuka terprogram untuk bekerja dengan DynamoDB. Antarmuka spesifik yang tersedia bergantung pada bahasa pemrograman dan AWS SDK yang Anda gunakan. Opsinya meliputi:
   + [Antarmuka tingkat rendah yang bekerja dengan DynamoDB](Programming.SDKs.Interfaces.md#Programming.SDKs.Interfaces.LowLevel)
   + [Antarmuka dokumen yang bekerja dengan DynamoDB](Programming.SDKs.Interfaces.md#Programming.SDKs.Interfaces.Document)
   + [Antarmuka persistensi objek yang bekerja dengan DynamoDB](Programming.SDKs.Interfaces.md#Programming.SDKs.Interfaces.Mapper)
   + [Antarmuka Tingkat Tinggi](HigherLevelInterfaces.md)

1.  AWS SDK membuat permintaan HTTP (S) untuk digunakan dengan API DynamoDB tingkat rendah.

1.  AWS SDK mengirimkan permintaan ke titik akhir DynamoDB.

1. DynamoDB menjalankan permintaan. Jika permintaan berhasil, DynamoDB mengembalikan kode respons HTTP 200 (OK). Jika permintaan tidak berhasil, DynamoDB mengembalikan kode galat dan pesan kesalahan HTTP.

1.  AWS SDK memproses respons dan menyebarkannya kembali ke aplikasi Anda.

Masing-masing AWS SDKs menyediakan layanan penting untuk aplikasi Anda, termasuk yang berikut:
+ Memformat permintaan HTTP(S) dan menyerialisasi parameter permintaan.
+ Menghasilkan tanda tangan kriptografi untuk setiap permintaan.
+ Meneruskan permintaan ke titik akhir DynamoDB dan menerima respons dari DynamoDB.
+ Mengekstraksi hasil dari respons tersebut.
+ Menerapkan logika coba lagi dasar dalam kasus kesalahan.

Anda tidak perlu menulis kode untuk semua tugas ini.

**catatan**  
Untuk informasi selengkapnya AWS SDKs, termasuk petunjuk penginstalan dan dokumentasi, lihat [Alat untuk Amazon Web Services](https://aws.amazon.com/tools).

## Dukungan SDK dari endpoint berbasis AWS akun
<a name="Programming.SDKs.endpoints"></a>

AWS meluncurkan dukungan SDK untuk AWS titik akhir berbasis akun untuk DynamoDB, dimulai dengan SDK for AWS Java V1 pada 4 September 2024. Titik akhir baru ini membantu AWS memastikan kinerja dan skalabilitas yang tinggi. Yang diperbarui SDKs akan secara otomatis menggunakan titik akhir baru, yang memiliki format`https://(account-id).ddb.(region).amazonaws.com`.

Jika Anda menggunakan satu instance klien SDK untuk membuat permintaan ke beberapa akun, aplikasi Anda akan memiliki lebih sedikit kesempatan untuk menggunakan kembali koneksi. AWS merekomendasikan untuk memodifikasi aplikasi Anda untuk terhubung ke lebih sedikit akun per instans klien SDK. Alternatifnya adalah menyetel klien SDK Anda untuk terus menggunakan titik akhir Regional menggunakan `ACCOUNT_ID_ENDPOINT_MODE` pengaturan, seperti yang didokumentasikan dalam Panduan [https://docs.aws.amazon.com/sdkref/latest/guide/feature-account-endpoints.html](https://docs.aws.amazon.com/sdkref/latest/guide/feature-account-endpoints.html).

# Antarmuka terprogram yang bekerja dengan DynamoDB
<a name="Programming.SDKs.Interfaces"></a>

Setiap [AWS SDK](https://aws.amazon.com/tools) menyediakan satu atau lebih antarmuka program untuk bekerja dengan Amazon DynamoDB. Antarmuka ini memiliki rentang dari pembungkus DynamoDB level rendah sederhana hingga lapisan persistensi berorientasi objek. Antarmuka yang tersedia bervariasi tergantung pada AWS SDK dan bahasa pemrograman yang Anda gunakan.

![\[Antarmuka terprogram tersedia dalam berbagai cara AWS SDKs untuk bekerja dengan DynamoDB.\]](http://docs.aws.amazon.com/id_id/amazondynamodb/latest/developerguide/images/SDKSupport.SDKInterfaces.png)


Bagian berikut menyoroti beberapa antarmuka yang tersedia, menggunakan AWS SDK untuk Java sebagai contoh. (Tidak semua antarmuka tersedia di semua AWS SDKs.)

**Topics**
+ [Antarmuka tingkat rendah yang bekerja dengan DynamoDB](#Programming.SDKs.Interfaces.LowLevel)
+ [Antarmuka dokumen yang bekerja dengan DynamoDB](#Programming.SDKs.Interfaces.Document)
+ [Antarmuka persistensi objek yang bekerja dengan DynamoDB](#Programming.SDKs.Interfaces.Mapper)

## Antarmuka tingkat rendah yang bekerja dengan DynamoDB
<a name="Programming.SDKs.Interfaces.LowLevel"></a>

Setiap AWS SDK khusus bahasa menyediakan antarmuka tingkat rendah untuk Amazon DynamoDB, dengan metode yang sangat mirip dengan permintaan API DynamoDB tingkat rendah.

Dalam beberapa kasus, Anda akan perlu untuk mengidentifikasi jenis data dari atribut-atribut tersebut menggunakan [Deskriptor jenis data](Programming.LowLevelAPI.md#Programming.LowLevelAPI.DataTypeDescriptors), seperti `S` untuk string, atau `N` untuk angka.

**catatan**  
Antarmuka tingkat rendah tersedia dalam setiap AWS SDK khusus bahasa.

Program Java berikut menggunakan antarmuka AWS SDK untuk Java tingkat rendah. 

### Contoh antarmuka tingkat rendah
<a name="low-level-example"></a>

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 *
 * To get an item from an Amazon DynamoDB table using the AWS SDK for Java V2,
 * its better practice to use the
 * Enhanced Client, see the EnhancedGetItem example.
 */
public class GetItem {
    public static void main(String[] args) {
        final String usage = """

                Usage:
                    <tableName> <key> <keyVal>

                Where:
                    tableName - The Amazon DynamoDB table from which an item is retrieved (for example, Music3).\s
                    key - The key used in the Amazon DynamoDB table (for example, Artist).\s
                    keyval - The key value that represents the item to get (for example, Famous Band).
                """;

        if (args.length != 3) {
            System.out.println(usage);
            System.exit(1);
        }

        String tableName = args[0];
        String key = args[1];
        String keyVal = args[2];
        System.out.format("Retrieving item \"%s\" from \"%s\"\n", keyVal, tableName);
        Region region = Region.US_EAST_1;
        DynamoDbClient ddb = DynamoDbClient.builder()
                .region(region)
                .build();

        getDynamoDBItem(ddb, tableName, key, keyVal);
        ddb.close();
    }

    public static void getDynamoDBItem(DynamoDbClient ddb, String tableName, String key, String keyVal) {
        HashMap<String, AttributeValue> keyToGet = new HashMap<>();
        keyToGet.put(key, AttributeValue.builder()
                .s(keyVal)
                .build());

        GetItemRequest request = GetItemRequest.builder()
                .key(keyToGet)
                .tableName(tableName)
                .build();

        try {
            // If there is no matching item, GetItem does not return any data.
            Map<String, AttributeValue> returnedItem = ddb.getItem(request).item();
            if (returnedItem.isEmpty())
                System.out.format("No item found with the key %s!\n", key);
            else {
                Set<String> keys = returnedItem.keySet();
                System.out.println("Amazon DynamoDB table attributes: \n");
                for (String key1 : keys) {
                    System.out.format("%s: %s\n", key1, returnedItem.get(key1).toString());
                }
            }

        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }
}
```

## Antarmuka dokumen yang bekerja dengan DynamoDB
<a name="Programming.SDKs.Interfaces.Document"></a>

Banyak yang AWS SDKs menyediakan antarmuka dokumen, memungkinkan Anda untuk melakukan operasi bidang data (membuat, membaca, memperbarui, menghapus) pada tabel dan indeks. Dengan antarmuka dokumen, Anda tidak perlu menentukan [Deskriptor jenis data](Programming.LowLevelAPI.md#Programming.LowLevelAPI.DataTypeDescriptors). Jenis data yang tersirat oleh semantik data itu sendiri. Ini AWS SDKs juga menyediakan metode untuk dengan mudah mengonversi dokumen JSON ke dan dari tipe data Amazon DynamoDB asli.

**catatan**  
Antarmuka dokumen tersedia di AWS SDKs untuk [Java](https://aws.amazon.com/sdk-for-java), [.NET](https://aws.amazon.com/sdk-for-net), [Node.js](https://aws.amazon.com/sdk-for-node-js), dan [JavaScriptSDK](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/).

Program Java berikut menggunakan antarmuka dokumen AWS SDK untuk Java. Program ini menciptakan objek `Table` yang merepresentasikan tabel `Music`, lalu meminta objek tersebut untuk menggunakan `GetItem` guna mengambil lagu. Program ini selanjutnya mencetak tahun lagu tersebut dirilis.

Kelas `software.amazon.dynamodb.document.DynamoDB` mengimplementasikan antarmuka dokumen DynamoDB. Perhatikan bagaimana `DynamoDB` berfungsi sebagai pembungkus di sekitar klien tingkat rendah (`AmazonDynamoDB`).

### Contoh antarmuka dokumen
<a name="document-level-example"></a>

```
package com.amazonaws.codesamples.gsg;

import software.amazon.dynamodb.AmazonDynamoDB;
import software.amazon.dynamodb.AmazonDynamoDBClientBuilder;
import software.amazon.dynamodb.document.DynamoDB;
import software.amazon.dynamodb.document.GetItemOutcome;
import software.amazon.dynamodb.document.Table;

public class MusicDocumentDemo {

    public static void main(String[] args) {

        AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
        DynamoDB docClient = new DynamoDB(client);

        Table table = docClient.getTable("Music");
        GetItemOutcome outcome = table.getItemOutcome(
                "Artist", "No One You Know",
                "SongTitle", "Call Me Today");

        int year = outcome.getItem().getInt("Year");
        System.out.println("The song was released in " + year);

    }
}
```

## Antarmuka persistensi objek yang bekerja dengan DynamoDB
<a name="Programming.SDKs.Interfaces.Mapper"></a>

Beberapa AWS SDKs menyediakan antarmuka persistensi objek di mana Anda tidak secara langsung melakukan operasi bidang data. Sebagai gantinya, Anda akan membuat objek yang mewakili item dalam tabel dan indeks Amazon DynamoDB, dan hanya berinteraksi dengan objek tersebut. Ini memungkinkan Anda menulis kode yang berfokus pada objek, bukan kode yang berfokus pada basis data.

**catatan**  
Antarmuka persistensi objek tersedia di AWS SDKs untuk Java dan .NET. Untuk informasi selengkapnya, lihat [Antarmuka pemrograman tingkat tinggi untuk DynamoDB](HigherLevelInterfaces.md) DynamoDB.

### Contoh antarmuka ketekunan objek
<a name="mapper-level-example"></a>

```
import com.example.dynamodb.Customer;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.enhanced.dynamodb.Key;
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
import software.amazon.awssdk.enhanced.dynamodb.model.GetItemEnhancedRequest;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
```

```
import com.example.dynamodb.Customer;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.enhanced.dynamodb.Key;
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
import software.amazon.awssdk.enhanced.dynamodb.model.GetItemEnhancedRequest;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;

/*
 * Before running this code example, create an Amazon DynamoDB table named Customer with these columns:
 *   - id - the id of the record that is the key. Be sure one of the id values is `id101`
 *   - custName - the customer name
 *   - email - the email value
 *   - registrationDate - an instant value when the item was added to the table. These values
 *                        need to be in the form of `YYYY-MM-DDTHH:mm:ssZ`, such as 2022-07-11T00:00:00Z
 *
 * Also, ensure that you have set up your development environment, including your credentials.
 *
 * For information, see this documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */

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

        DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
                .dynamoDbClient(ddb)
                .build();

        getItem(enhancedClient);
        ddb.close();
    }

    public static String getItem(DynamoDbEnhancedClient enhancedClient) {
        Customer result = null;
        try {
            DynamoDbTable<Customer> table = enhancedClient.table("Customer", TableSchema.fromBean(Customer.class));
            Key key = Key.builder()
                    .partitionValue("id101").sortValue("tred@noserver.com")
                    .build();

            // Get the item by using the key.
            result = table.getItem(
                    (GetItemEnhancedRequest.Builder requestBuilder) -> requestBuilder.key(key));
            System.out.println("******* The description value is " + result.getCustName());

        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
        return result.getCustName();
    }
}
```

# Antarmuka pemrograman tingkat tinggi untuk DynamoDB
<a name="HigherLevelInterfaces"></a>

 AWS SDKs Menyediakan aplikasi dengan antarmuka tingkat rendah untuk bekerja dengan Amazon DynamoDB. Metode dan kelas sisi klien ini berkaitan langsung dengan DynamoDB API tingkat rendah. Namun, banyak developer mengalami putusnya koneksi, atau *ketidakcocokan impedansi*, ketika mereka perlu memetakan jenis data yang kompleks untuk item dalam tabel basis data. Dengan antarmuka basis data tingkat rendah, developer harus menulis metode untuk membaca atau menulis data objek ke tabel basis data, dan sebaliknya. Jumlah kode tambahan yang diperlukan untuk setiap kombinasi jenis objek dan tabel basis data dapat terlihat sangat banyak.

Untuk menyederhanakan pengembangan, AWS SDKs untuk Java dan .NET menyediakan antarmuka tambahan dengan tingkat abstraksi yang lebih tinggi. Antarmuka tingkat yang lebih tinggi untuk DynamoDB memungkinkan Anda menentukan hubungan di antara objek dalam program Anda dan tabel basis data yang menyimpan data objek tersebut. Setelah menentukan pemetaan ini, Anda memanggil metode objek sederhana seperti `save`, `load`, atau `delete`, dan operasi DynamoDB tingkat rendah yang mendasarinya akan dipanggil secara otomatis atas nama Anda. Ini memungkinkan Anda menulis kode yang berfokus pada objek, bukan kode yang berfokus pada basis data.

Antarmuka pemrograman tingkat tinggi untuk DynamoDB tersedia di untuk Java dan .NET. AWS SDKs 

**Java**
+ [Java 1.x: Dinamo DBMapper](DynamoDBMapper.md)
+ [Java 2.x: DynamoDB Enhanced Client](DynamoDBEnhanced.md)

**.NET**
+ [Bekerja dengan model dokumen.NET di DynamoDB](DotNetSDKMidLevel.md)
+ [Bekerja dengan model persistensi objek.NET dan DynamoDB](DotNetSDKHighLevel.md)

# Java 1.x: Dinamo DBMapper
<a name="DynamoDBMapper"></a>

**catatan**  
SDK for Java memiliki dua versi: 1.x dan 2.x. end-of-supportUntuk 1.x [diumumkan](https://aws.amazon.com/blogs/developer/announcing-end-of-support-for-aws-sdk-for-java-v1-x-on-december-31-2025/) pada 12 Januari 2024. Itu akan dan akan jatuh tempo pada 31 Desember 2025. end-of-support Untuk pengembangan baru, kami sangat menyarankan Anda menggunakan 2.x.

 AWS SDK untuk Java Ini menyediakan `DynamoDBMapper` kelas, memungkinkan Anda untuk memetakan kelas sisi klien Anda ke tabel Amazon DynamoDB. Untuk menggunakan `DynamoDBMapper`, tentukan hubungan antara item dalam tabel DynamoDB dan instans objek yang sesuai dalam kode Anda. Kelas `DynamoDBMapper` memungkinkan Anda melakukan berbagai operasi buat, baca, perbarui, dan hapus (CRUD) pada item, dan menjalankan kueri serta memindai tabel.

**Topics**
+ [Kelas Dynamo DBMapper](DynamoDBMapper.Methods.md)
+ [Tipe data yang didukung untuk Dynamo DBMapper untuk Java](DynamoDBMapper.DataTypes.md)
+ [Anotasi Java untuk DynamoDB](DynamoDBMapper.Annotations.md)
+ [Pengaturan konfigurasi opsional untuk Dynamo DBMapper](DynamoDBMapper.OptionalConfig.md)
+ [DynamoDB dan penguncian optimis dengan nomor versi](DynamoDBMapper.OptimisticLocking.md)
+ [Memetakan data arbitrer di DynamoDB](DynamoDBMapper.ArbitraryDataMapping.md)
+ [Contoh Dynamo DBMapper](DynamoDBMapper.Examples.md)

**catatan**  
Kelas `DynamoDBMapper` tidak memungkinkan Anda membuat, memperbarui, atau menghapus tabel. Untuk melakukan tugas tersebut, gunakan antarmuka SDK untuk Java tingkat rendah.

SDK untuk Java menyediakan serangkaian jenis anotasi agar Anda dapat memetakan kelas ke tabel. Misalnya, pertimbangkan tabel `ProductCatalog` yang memiliki `Id` sebagai kunci partisi. 

```
ProductCatalog(Id, ...)
```

Anda dapat memetakan kelas di aplikasi klien ke tabel `ProductCatalog` seperti yang ditunjukkan dalam kode Java berikut. Kode ini menentukan plain old Java object (POJO) bernama `CatalogItem`, yang menggunakan anotasi untuk memetakan bidang objek ke nama atribut DynamoDB.

**Example**  

```
package com.amazonaws.codesamples;

import java.util.Set;

import software.amazon.dynamodb.datamodeling.DynamoDBAttribute;
import software.amazon.dynamodb.datamodeling.DynamoDBHashKey;
import software.amazon.dynamodb.datamodeling.DynamoDBIgnore;
import software.amazon.dynamodb.datamodeling.DynamoDBTable;

@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {

    private Integer id;
    private String title;
    private String ISBN;
    private Set<String> bookAuthors;
    private String someProp;

    @DynamoDBHashKey(attributeName="Id")
    public Integer getId() { return id; }
    public void setId(Integer id) {this.id = id; }

    @DynamoDBAttribute(attributeName="Title")
    public String getTitle() {return title; }
    public void setTitle(String title) { this.title = title; }

    @DynamoDBAttribute(attributeName="ISBN")
    public String getISBN() { return ISBN; }
    public void setISBN(String ISBN) { this.ISBN = ISBN; }

    @DynamoDBAttribute(attributeName="Authors")
    public Set<String> getBookAuthors() { return bookAuthors; }
    public void setBookAuthors(Set<String> bookAuthors) { this.bookAuthors = bookAuthors; }

    @DynamoDBIgnore
    public String getSomeProp() { return someProp; }
    public void setSomeProp(String someProp) { this.someProp = someProp; }
}
```

Dalam kode sebelumnya, anotasi `@DynamoDBTable` memetakan kelas `CatalogItem` ke tabel `ProductCatalog`. Anda dapat menyimpan masing-masing instans kelas sebagai item dalam tabel. Dalam definisi kelas, anotasi `@DynamoDBHashKey` memetakan properti `Id` ke kunci primer. 

Secara default, properti kelas memetakan atribut nama yang sama dalam tabel. Properti `Title` dan `ISBN` memetakan atribut nama yang sama di tabel. 

Anotasi `@DynamoDBAttribute` bersifat opsional saat nama atribut DynamoDB cocok dengan nama properti yang dinyatakan di kelas. Jika namanya berbeda, gunakan anotasi ini dengan parameter `attributeName` untuk menentukan atribut DynamoDB yang sesuai dengan properti ini. 

Dalam contoh sebelumnya, `@DynamoDBAttribute` anotasi ditambahkan ke setiap properti untuk memastikan bahwa nama properti cocok persis dengan tabel yang dibuat pada langkah sebelumnya, dan agar konsisten dengan nama atribut yang digunakan dalam contoh kode lain dalam panduan ini. 

Definisi kelas Anda dapat memiliki properti yang tidak dipetakan ke setiap atribut dalam tabel. Anda mengidentifikasi properti ini dengan menambahkan anotasi `@DynamoDBIgnore`. Dalam contoh sebelumnya, properti `SomeProp` ditandai dengan anotasi `@DynamoDBIgnore`. Saat Anda mengunggah instans `CatalogItem` ke tabel, instans `DynamoDBMapper` tidak menyertakan properti `SomeProp`. Selain itu, pemeta tidak mengembalikan atribut ini ketika Anda mengambil item dari tabel. 

Setelah menentukan kelas pemetaan, Anda dapat menggunakan metode `DynamoDBMapper` untuk menulis instans kelas tersebut untuk item yang sesuai dalam tabel `Catalog`. Contoh kode berikut mendemonstrasikan teknik ini.

```
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();

DynamoDBMapper mapper = new DynamoDBMapper(client);

CatalogItem item = new CatalogItem();
item.setId(102);
item.setTitle("Book 102 Title");
item.setISBN("222-2222222222");
item.setBookAuthors(new HashSet<String>(Arrays.asList("Author 1", "Author 2")));
item.setSomeProp("Test");

mapper.save(item);
```

Contoh kode berikut menunjukkan cara mengambil item dan mengakses beberapa atributnya.

```
CatalogItem partitionKey = new CatalogItem();

partitionKey.setId(102);
DynamoDBQueryExpression<CatalogItem> queryExpression = new DynamoDBQueryExpression<CatalogItem>()
    .withHashKeyValues(partitionKey);

List<CatalogItem> itemList = mapper.query(CatalogItem.class, queryExpression);

for (int i = 0; i < itemList.size(); i++) {
    System.out.println(itemList.get(i).getTitle());
    System.out.println(itemList.get(i).getBookAuthors());
}
```

`DynamoDBMapper` menawarkan cara natural yang intuitif untuk menggunakan data DynamoDB dalam Java. Ini juga menyediakan beberapa fitur bawaan, seperti penguncian optimis, transaksi ACID, nilai kunci urutan dan kunci partisi yang dibuat secara otomatis, serta objek penentuan versi.

# Kelas Dynamo DBMapper
<a name="DynamoDBMapper.Methods"></a>



Kelas `DynamoDBMapper` adalah titik masuk ke Amazon DynamoDB. Kelas ini menyediakan akses ke titik akhir DynamoDB dan memungkinkan Anda mengakses data Anda dalam berbagai tabel. Kelas ini juga memungkinkan Anda melakukan berbagai operasi buat, baca, perbarui, dan hapus (CRUD) pada item, dan menjalankan kueri serta memindai tabel. Kelas ini menyediakan metode berikut agar berfungsi dengan DynamoDB.

*Untuk dokumentasi Javadoc yang sesuai, lihat [Dynamo DBMapper](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html) di Referensi API.AWS SDK untuk Java *

**Topics**
+ [save](#DynamoDBMapper.Methods.save)
+ [muat](#DynamoDBMapper.Methods.load)
+ [hapus](#DynamoDBMapper.Methods.delete)
+ [kueri](#DynamoDBMapper.Methods.query)
+ [queryPage](#DynamoDBMapper.Methods.queryPage)
+ [scan](#DynamoDBMapper.Methods.scan)
+ [scanPage](#DynamoDBMapper.Methods.scanPage)
+ [parallelScan](#DynamoDBMapper.Methods.parallelScan)
+ [batchSave](#DynamoDBMapper.Methods.batchSave)
+ [batchLoad](#DynamoDBMapper.Methods.batchLoad)
+ [batchDelete](#DynamoDBMapper.Methods.batchDelete)
+ [batchWrite](#DynamoDBMapper.Methods.batchWrite)
+ [transactionWrite](#DynamoDBMapper.Methods.transactionWrite)
+ [transactionLoad](#DynamoDBMapper.Methods.transactionLoad)
+ [count](#DynamoDBMapper.Methods.count)
+ [generateCreateTablePermintaan](#DynamoDBMapper.Methods.generateCreateTableRequest)
+ [createS3Link](#DynamoDBMapper.Methods.createS3Link)
+ [GetS3 ClientCache](#DynamoDBMapper.Methods.getS3ClientCache)

## save
<a name="DynamoDBMapper.Methods.save"></a>

Menyimpan objek tertentu ke tabel. Objek yang ingin Anda simpan adalah satu-satunya parameter yang diperlukan untuk metode ini. Anda dapat memberikan parameter konfigurasi opsional menggunakan objek `DynamoDBMapperConfig`. 

Jika item yang memiliki kunci primer yang sama tidak ada, metode ini akan membuat item baru dalam tabel. Jika item yang memiliki kunci primer yang sama ada, item yang ada akan diperbarui. Jika kunci partisi dan kunci urutan berupa String jenis dan dianotasikan dengan `@DynamoDBAutoGeneratedKey`, kunci tersebut diberi pengidentifikasi unik universal acak (UUID) jika tidak diinisialisasi. Bidang versi yang diberi anotasi dengan `@DynamoDBVersionAttribute` bertambah satu. Selain itu, jika bidang versi diperbarui atau kunci dibuat, objek yang diteruskan akan diperbarui sebagai hasil operasi. 

Secara default, hanya atribut yang sesuai dengan properti kelas yang dipetakan yang akan diperbarui. Atribut tambahan yang ada pada item tidak akan terpengaruh. Namun, jika menentukan `SaveBehavior.CLOBBER`, Anda dapat memaksa item untuk ditimpa sepenuhnya.

```
DynamoDBMapperConfig config = DynamoDBMapperConfig.builder()
    .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.CLOBBER).build();
        
mapper.save(item, config);
```

Jika penentuan versi diaktifkan, versi item sisi klien dan sisi server harus cocok. Namun, versi tidak harus cocok jika opsi `SaveBehavior.CLOBBER` digunakan. Untuk informasi selengkapnya tentang penentuan versi, lihat [DynamoDB dan penguncian optimis dengan nomor versi](DynamoDBMapper.OptimisticLocking.md).

## muat
<a name="DynamoDBMapper.Methods.load"></a>

Mengambil item dari tabel. Anda harus menyediakan kunci primer item yang ingin Anda ambil. Anda dapat memberikan parameter konfigurasi opsional menggunakan objek `DynamoDBMapperConfig`. Misalnya, Anda secara opsional dapat meminta bacaan sangat konsisten untuk memastikan bahwa metode ini hanya mengambil nilai item terbaru seperti yang ditunjukkan dalam pernyataan Java berikut. 

```
DynamoDBMapperConfig config = DynamoDBMapperConfig.builder()
    .withConsistentReads(DynamoDBMapperConfig.ConsistentReads.CONSISTENT).build();

CatalogItem item = mapper.load(CatalogItem.class, item.getId(), config);
```

Secara default, DynamoDB akan mengembalikan item yang memiliki nilai yang akhirnya konsisten. Untuk informasi tentang model konsistensi akhir DynamoDB, lihat [DynamoDB membaca konsistensi](HowItWorks.ReadConsistency.md).

## hapus
<a name="DynamoDBMapper.Methods.delete"></a>

Menghapus item dari tabel. Anda harus meneruskan instans objek dari kelas yang dipetakan. 

Jika penentuan versi diaktifkan, versi item sisi klien dan sisi server harus cocok. Namun, versi tidak harus cocok jika opsi `SaveBehavior.CLOBBER` digunakan. Untuk informasi selengkapnya tentang penentuan versi, lihat [DynamoDB dan penguncian optimis dengan nomor versi](DynamoDBMapper.OptimisticLocking.md). 

## kueri
<a name="DynamoDBMapper.Methods.query"></a>

Mengkueri tabel atau indeks sekunder.

Misalnya, Anda memiliki tabel, `Reply`, yang menyimpan balasan utas forum. Setiap subjek utas dapat berisi nol atau beberapa balasan. Kunci primer tabel `Reply` terdiri dari bidang `Id` dan `ReplyDateTime`, dengan `Id` sebagai kunci partisi dan `ReplyDateTime` sebagai kunci urutan kunci primer.

```
Reply ( Id, ReplyDateTime, ... )
```

Misalnya, Anda membuat pemetaan antara kelas `Reply` dan tabel `Reply` yang sesuai di DynamoDB. Kode Java berikut menggunakan `DynamoDBMapper` untuk menemukan semua balasan dalam dua minggu terakhir untuk subjek utas tertentu.

**Example**  

```
String forumName = "&DDB;";
String forumSubject = "&DDB; Thread 1";
String partitionKey = forumName + "#" + forumSubject;

long twoWeeksAgoMilli = (new Date()).getTime() - (14L*24L*60L*60L*1000L);
Date twoWeeksAgo = new Date();
twoWeeksAgo.setTime(twoWeeksAgoMilli);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
String twoWeeksAgoStr = df.format(twoWeeksAgo);

Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":v1", new AttributeValue().withS(partitionKey));
eav.put(":v2",new AttributeValue().withS(twoWeeksAgoStr.toString()));

DynamoDBQueryExpression<Reply> queryExpression = new DynamoDBQueryExpression<Reply>()
    .withKeyConditionExpression("Id = :v1 and ReplyDateTime > :v2")
    .withExpressionAttributeValues(eav);

List<Reply> latestReplies = mapper.query(Reply.class, queryExpression);
```

Kueri ini mengembalikan koleksi objek `Reply`. 

Secara default, metode `query` mengembalikan koleksi "lazy-loaded". Metode ini awalnya hanya mengembalikan satu halaman hasil, lalu membuat panggilan layanan untuk halaman berikutnya jika diperlukan. Untuk mendapatkan semua item yang cocok, iterasikan ke koleksi `latestReplies`. 

Perhatikan bahwa memanggil metode `size()` pada koleksi akan memuat setiap hasil untuk memberikan jumlah yang akurat. Hal ini dapat mengakibatkan penggunaan banyak throughput yang disediakan, dan bahkan bisa menghabiskan semua memori di JVM Anda pada tabel yang sangat besar.

Untuk mencari indeks, Anda harus membuat model indeks sebagai kelas pemeta terlebih dahulu. Misalkan `Reply` tabel memiliki indeks sekunder global bernama *PostedBy-Message-Index*. Kunci partisi untuk indeks ini adalah `PostedBy`, dan kunci urutannya adalah `Message`. Definisi kelas untuk item dalam indeks akan tampak seperti berikut ini.

```
@DynamoDBTable(tableName="Reply")
public class PostedByMessage {
    private String postedBy;
    private String message;

    @DynamoDBIndexHashKey(globalSecondaryIndexName = "PostedBy-Message-Index", attributeName = "PostedBy")
    public String getPostedBy() { return postedBy; }
    public void setPostedBy(String postedBy) { this.postedBy = postedBy; }

    @DynamoDBIndexRangeKey(globalSecondaryIndexName = "PostedBy-Message-Index", attributeName = "Message")
    public String getMessage() { return message; }
    public void setMessage(String message) { this.message = message; }

   // Additional properties go here.
}
```

Anotasi `@DynamoDBTable` menunjukkan bahwa indeks ini terkait dengan tabel `Reply`. `@DynamoDBIndexHashKey`Anotasi menunjukkan kunci partisi (*PostedBy*) dari indeks, dan `@DynamoDBIndexRangeKey` menunjukkan kunci sortir (*Pesan*) indeks.

Sekarang, Anda dapat menggunakan `DynamoDBMapper` untuk mengkueri indeks, mengambil subset pesan yang diposting oleh pengguna tertentu. Anda tidak perlu menentukan nama indeks jika Anda tidak memiliki pemetaan yang bertentangan di seluruh tabel dan indeks serta pemetaan sudah dibuat di mapper. Pemeta akan menyimpulkan berdasarkan kunci primer dan kunci urutan. Kode berikut mengkueri indeks sekunder global. Karena indeks sekunder global mendukung bacaan akhir konsisten tetapi bukan bacaan sangat konsisten, Anda harus menentukan `withConsistentRead(false)`.

```
HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":v1",  new AttributeValue().withS("User A"));
eav.put(":v2",  new AttributeValue().withS("DynamoDB"));

DynamoDBQueryExpression<PostedByMessage> queryExpression = new DynamoDBQueryExpression<PostedByMessage>()
    .withIndexName("PostedBy-Message-Index")
    .withConsistentRead(false)
    .withKeyConditionExpression("PostedBy = :v1 and begins_with(Message, :v2)")
    .withExpressionAttributeValues(eav);

List<PostedByMessage> iList =  mapper.query(PostedByMessage.class, queryExpression);
```

Kueri ini mengembalikan koleksi objek `PostedByMessage`.

## queryPage
<a name="DynamoDBMapper.Methods.queryPage"></a>

Mengkueri tabel atau indeks sekunder dan mengembalikan satu halaman hasil yang cocok. Seperti metode `query`, Anda harus menentukan nilai kunci partisi dan filter kueri yang diterapkan pada atribut kunci urutan. Namun, `queryPage` hanya mengembalikan “halaman” pertama data, yaitu jumlah data yang sesuai dalam ukuran 1 MB 

## scan
<a name="DynamoDBMapper.Methods.scan"></a>

Memindai seluruh tabel atau indeks sekunder. Anda dapat menentukan `FilterExpression` untuk memfilter kumpulan hasil secara opsional.

Misalnya, Anda memiliki tabel, `Reply`, yang menyimpan balasan utas forum. Setiap subjek utas dapat berisi nol atau beberapa balasan. Kunci primer tabel `Reply` terdiri dari bidang `Id` dan `ReplyDateTime`, dengan `Id` sebagai kunci partisi dan `ReplyDateTime` sebagai kunci urutan kunci primer.

```
Reply ( Id, ReplyDateTime, ... )
```

Jika memetakan kelas Java ke tabel `Reply`, Anda dapat menggunakan `DynamoDBMapper` untuk memindai tabel. Misalnya, kode Java berikut memindai seluruh tabel `Reply`, sehingga hanya mengembalikan balasan untuk tahun tertentu.

**Example**  

```
HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":v1", new AttributeValue().withS("2015"));

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
    .withFilterExpression("begins_with(ReplyDateTime,:v1)")
    .withExpressionAttributeValues(eav);

List<Reply> replies =  mapper.scan(Reply.class, scanExpression);
```

Secara default, metode `scan` mengembalikan koleksi "lazy-loaded". Metode ini awalnya hanya mengembalikan satu halaman hasil, lalu membuat panggilan layanan untuk halaman berikutnya jika diperlukan. Untuk mendapatkan semua item yang cocok, iterasikan ke koleksi `replies`.

Perhatikan bahwa memanggil metode `size()` pada koleksi akan memuat setiap hasil untuk memberikan jumlah yang akurat. Hal ini dapat mengakibatkan penggunaan banyak throughput yang disediakan, dan bahkan bisa menghabiskan semua memori di JVM Anda pada tabel yang sangat besar.

Untuk memindai indeks, Anda harus membuat model indeks sebagai kelas pemeta terlebih dahulu. Misalkan tabel `Reply` memiliki indeks sekunder global bernama `PostedBy-Message-Index`. Kunci partisi untuk indeks ini adalah `PostedBy`, dan kunci urutannya adalah `Message`. Kelas pemeta untuk indeks ini ditampilkan di bagian [kueri](#DynamoDBMapper.Methods.query). Kelas ini menggunakan anotasi `@DynamoDBIndexHashKey` dan `@DynamoDBIndexRangeKey` untuk menentukan kunci partisi indeks dan kunci urutan.

Contoh kode berikut memindai `PostedBy-Message-Index`. Contoh kode ini tidak menggunakan filter pemindaian, sehingga semua item dalam indeks dikembalikan kepada Anda.

```
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
    .withIndexName("PostedBy-Message-Index")
    .withConsistentRead(false);

    List<PostedByMessage> iList =  mapper.scan(PostedByMessage.class, scanExpression);
    Iterator<PostedByMessage> indexItems = iList.iterator();
```

## scanPage
<a name="DynamoDBMapper.Methods.scanPage"></a>

Memindai tabel atau indeks sekunder dan mengembalikan satu halaman hasil yang cocok. Seperti halnya metode `scan`, Anda dapat menentukan `FilterExpression` untuk memfilter kumpulan hasil secara opsional. Namun, `scanPage` hanya mengembalikan “halaman” pertama data, yaitu jumlah data yang sesuai dalam ukuran 1 MB.

## parallelScan
<a name="DynamoDBMapper.Methods.parallelScan"></a>

Melakukan pemindaian paralel dari seluruh tabel atau indeks sekunder. Anda menentukan sejumlah segmen logis untuk tabel, beserta ekspresi pemindaian untuk memfilter hasil. `parallelScan` membagi tugas pemindaian antara beberapa pekerja, satu tugas untuk setiap segmen logis; pekerja akan memproses data secara paralel dan mengembalikan hasilnya.

Contoh kode Java berikut melakukan pemindaian paralel pada tabel `Product`.

```
int numberOfThreads = 4;

Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":n", new AttributeValue().withN("100"));

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
    .withFilterExpression("Price <= :n")
    .withExpressionAttributeValues(eav);

List<Product> scanResult = mapper.parallelScan(Product.class, scanExpression, numberOfThreads);
```

## batchSave
<a name="DynamoDBMapper.Methods.batchSave"></a>

Menyimpan objek ke satu atau beberapa tabel menggunakan satu atau beberapa panggilan ke metode `AmazonDynamoDB.batchWriteItem`. Metode ini tidak memberikan jaminan transaksi.

Kode Java berikut menyimpan dua item (buku) ke tabel `ProductCatalog`.

```
Book book1 = new Book();
book1.setId(901);
book1.setProductCategory("Book");
book1.setTitle("Book 901 Title");

Book book2 = new Book();
book2.setId(902);
book2.setProductCategory("Book");
book2.setTitle("Book 902 Title");

mapper.batchSave(Arrays.asList(book1, book2));
```

## batchLoad
<a name="DynamoDBMapper.Methods.batchLoad"></a>

Mengambil beberapa item dari satu atau beberapa tabel menggunakan kunci primernya.

Kode Java berikut akan mengambil dua item dari dua tabel yang berbeda.

```
ArrayList<Object> itemsToGet = new ArrayList<Object>();

ForumItem forumItem = new ForumItem();
forumItem.setForumName("Amazon DynamoDB");
itemsToGet.add(forumItem);

ThreadItem threadItem = new ThreadItem();
threadItem.setForumName("Amazon DynamoDB");
threadItem.setSubject("Amazon DynamoDB thread 1 message text");
itemsToGet.add(threadItem);

Map<String, List<Object>> items = mapper.batchLoad(itemsToGet);
```

## batchDelete
<a name="DynamoDBMapper.Methods.batchDelete"></a>

Menghapus objek dari satu atau beberapa tabel menggunakan satu atau beberapa panggilan ke metode `AmazonDynamoDB.batchWriteItem`. Metode ini tidak memberikan jaminan transaksi. 

Kode Java berikut akan menghapus dua item (buku) dari tabel `ProductCatalog`.

```
Book book1 = mapper.load(Book.class, 901);
Book book2 = mapper.load(Book.class, 902);
mapper.batchDelete(Arrays.asList(book1, book2));
```

## batchWrite
<a name="DynamoDBMapper.Methods.batchWrite"></a>

Menyimpan objek ke dan menghapus objek dari satu atau beberapa tabel menggunakan satu atau beberapa panggilan ke metode `AmazonDynamoDB.batchWriteItem`. Metode ini tidak memberikan jaminan transaksi atau penentuan versi dukungan (penempatan atau penghapusan bersyarat).

Kode Java berikut menulis item baru ke tabel `Forum`, menulis item baru ke tabel `Thread`, dan menghapus item dari tabel `ProductCatalog`.

```
// Create a Forum item to save
Forum forumItem = new Forum();
forumItem.setName("Test BatchWrite Forum");

// Create a Thread item to save
Thread threadItem = new Thread();
threadItem.setForumName("AmazonDynamoDB");
threadItem.setSubject("My sample question");

// Load a ProductCatalog item to delete
Book book3 = mapper.load(Book.class, 903);

List<Object> objectsToWrite = Arrays.asList(forumItem, threadItem);
List<Book> objectsToDelete = Arrays.asList(book3);

mapper.batchWrite(objectsToWrite, objectsToDelete);
```

## transactionWrite
<a name="DynamoDBMapper.Methods.transactionWrite"></a>

Menyimpan objek ke dan menghapus objek dari satu atau beberapa tabel menggunakan satu panggilan ke metode `AmazonDynamoDB.transactWriteItems`. 

[Untuk daftar pengecualian khusus transaksi, lihat kesalahan. TransactWriteItems ](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html#API_TransactWriteItems_Errors) 

Untuk informasi selengkapnya tentang transaksi DynamoDB dan jaminan atomisitas, konsistensi, isolasi, dan durabilitas atau atomicity, consistency, isolation, and durability (ACID), lihat [Amazon DynamoDB Transactions](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transactions.html). 

**catatan**  
 Metode ini tidak mendukung hal berikut:  
[Konfigurasi DynamoDBMapper. SaveBehavior](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptionalConfig.html).

Kode Java berikut menulis item baru ke setiap tabel `Forum` dan `Thread`, secara transaksional.

```
Thread s3ForumThread = new Thread();
s3ForumThread.setForumName("S3 Forum");
s3ForumThread.setSubject("Sample Subject 1");
s3ForumThread.setMessage("Sample Question 1");

Forum s3Forum = new Forum();
s3Forum.setName("S3 Forum");
s3Forum.setCategory("Amazon Web Services");
s3Forum.setThreads(1);

TransactionWriteRequest transactionWriteRequest = new TransactionWriteRequest();
transactionWriteRequest.addPut(s3Forum);
transactionWriteRequest.addPut(s3ForumThread);
mapper.transactionWrite(transactionWriteRequest);
```

## transactionLoad
<a name="DynamoDBMapper.Methods.transactionLoad"></a>

Memuat objek dari satu atau beberapa tabel menggunakan satu panggilan ke metode `AmazonDynamoDB.transactGetItems`. 

[Untuk daftar pengecualian khusus transaksi, lihat kesalahan. TransactGetItems ](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html#API_TransactGetItems_Errors) 

Untuk informasi selengkapnya tentang transaksi DynamoDB dan jaminan atomisitas, konsistensi, isolasi, dan durabilitas atau atomicity, consistency, isolation, and durability (ACID), lihat [Amazon DynamoDB Transactions](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transactions.html). 

Kode Java berikut akan memuat satu item dari setiap tabel `Forum` dan `Thread`, secara transaksional.

```
Forum dynamodbForum = new Forum();
dynamodbForum.setName("DynamoDB Forum");
Thread dynamodbForumThread = new Thread();
dynamodbForumThread.setForumName("DynamoDB Forum");

TransactionLoadRequest transactionLoadRequest = new TransactionLoadRequest();
transactionLoadRequest.addLoad(dynamodbForum);
transactionLoadRequest.addLoad(dynamodbForumThread);
mapper.transactionLoad(transactionLoadRequest);
```

## count
<a name="DynamoDBMapper.Methods.count"></a>

Mengevaluasi ekspresi pemindaian yang ditentukan dan mengembalikan jumlah item yang cocok. Tidak ada data item yang dikembalikan.

## generateCreateTablePermintaan
<a name="DynamoDBMapper.Methods.generateCreateTableRequest"></a>

Mengurai kelas POJO yang mewakili tabel DynamoDB, dan mengembalikan `CreateTableRequest` untuk tabel tersebut.

## createS3Link
<a name="DynamoDBMapper.Methods.createS3Link"></a>

Membuat tautan ke objek di Amazon S3. Anda harus menentukan nama bucket dan nama kunci, yang secara unik mengidentifikasi objek di bucket.

Untuk menggunakan `createS3Link`, kelas pemeta Anda harus menentukan metode getter dan setter. Contoh kode berikut menggambarkan hal ini dengan menambahkan atribut dan getter/setter metode baru ke `CatalogItem` kelas.

```
@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {

    ...

    public S3Link productImage;

    ....

    @DynamoDBAttribute(attributeName = "ProductImage")
    public S3Link getProductImage() {
            return productImage;
    }

    public void setProductImage(S3Link productImage) {
        this.productImage = productImage;
    }

...
}
```

Kode Java berikut mendefinisikan item baru yang akan ditulis ke tabel `Product`. Item tersebut termasuk link ke gambar produk; data gambar diunggah ke Amazon S3.

```
CatalogItem item = new CatalogItem();

item.setId(150);
item.setTitle("Book 150 Title");

String amzn-s3-demo-bucket = "amzn-s3-demo-bucket";
String myS3Key = "productImages/book_150_cover.jpg";
item.setProductImage(mapper.createS3Link(amzn-s3-demo-bucket, myS3Key));

item.getProductImage().uploadFrom(new File("/file/path/book_150_cover.jpg"));

mapper.save(item);
```

Kelas `S3Link` menyediakan banyak metode lain untuk memanipulasi objek di Amazon S3. Untuk informasi selengkapnya, lihat [Javadocs untuk `S3Link`](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/S3Link.html).

## GetS3 ClientCache
<a name="DynamoDBMapper.Methods.getS3ClientCache"></a>

Mengembalikan `S3ClientCache` yang mendasarinya untuk mengakses Amazon S3. `S3ClientCache` adalah Peta cerdas untuk objek `AmazonS3Client`. Jika Anda memiliki banyak klien, an `S3ClientCache` dapat membantu Anda menjaga klien tetap terorganisir berdasarkan AWS Wilayah, dan dapat membuat klien Amazon S3 baru sesuai permintaan.

# Tipe data yang didukung untuk Dynamo DBMapper untuk Java
<a name="DynamoDBMapper.DataTypes"></a>

Bagian ini menjelaskan jenis data Java primitif, koleksi, dan jenis data arbitrer yang didukung di Amazon DynamoDB. 

Amazon DynamoDB mendukung jenis data Java primitif dan kelas pembungkus primitif berikut. 
+ `String`
+ `Boolean`, `boolean`
+ `Byte`, `byte`
+ `Date` (sebagai string [ISO\$18601](http://en.wikipedia.org/wiki/ISO_8601) millisecond-precision, yang beralih ke UTC)
+ `Calendar` (sebagai string [ISO\$18601](http://en.wikipedia.org/wiki/ISO_8601) millisecond-precision, yang beralih ke UTC)
+ `Long`, `long`
+ `Integer`, `int`
+ `Double`, `double`
+ `Float`, `float`
+ `BigDecimal`
+ `BigInteger`

**catatan**  
Untuk informasi selengkapnya tentang aturan penamaan DynamoDB dan berbagai jenis data yang didukung, lihat [Jenis data dan aturan penamaan yang didukung di Amazon DynamoDB](HowItWorks.NamingRulesDataTypes.md). 
Nilai biner kosong didukung oleh DynamoDBMapper.
Nilai String kosong didukung oleh AWS SDK for Java 2.x.  
Dalam AWS SDK for Java 1.x, DBMapper Dynamo mendukung pembacaan nilai atribut String kosong, namun, itu tidak akan menulis nilai atribut String kosong karena atribut ini dijatuhkan dari permintaan.

DynamoDB mendukung jenis koleksi [Kumpulan](http://docs.oracle.com/javase/6/docs/api/java/util/Set.html), [Daftar](http://docs.oracle.com/javase/6/docs/api/java/util/List.html), dan [Peta](http://docs.oracle.com/javase/6/docs/api/java/util/Map.html) Java. Tabel berikut merangkum bagaimana jenis Java ini dipetakan untuk jenis DynamoDB.


****  

| Jenis Java | Jenis DynamoDB | 
| --- | --- | 
|  Semua jenis angka  |  `N` (jenis angka)  | 
|  String  |  `S` (jenis string)   | 
|  Boolean  |  `BOOL` (jenis Boolean), 0 atau 1.  | 
|  ByteBuffer  |  `B` (jenis biner)  | 
|  Tanggal  |  `S` (jenis string). Nilai data disimpan sebagai string berformat ISO-8601.  | 
| Jenis koleksi [Kumpulan](http://docs.oracle.com/javase/6/docs/api/java/util/Set.html) |  Jenis `SS` (kumpulan biner), jenis `NS` (kumpulan angka), atau jenis `BS` (kumpulan biner).  | 

 Antarmuka `DynamoDBTypeConverter` memungkinkan Anda memetakan jenis data arbitrer Anda sendiri ke jenis data yang secara asli didukung oleh DynamoDB. Untuk informasi selengkapnya, lihat [Memetakan data arbitrer di DynamoDB](DynamoDBMapper.ArbitraryDataMapping.md). 

# Anotasi Java untuk DynamoDB
<a name="DynamoDBMapper.Annotations"></a>

Bagian ini menjelaskan anotasi yang tersedia untuk memetakan kelas dan properti ke tabel dan atribut di Amazon DynamoDB.

Untuk dokumentasi Javadoc yang sesuai, lihat [Ringkasan Jenis Anotasi](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/package-summary.html) di [Referensi API AWS SDK untuk Java](https://docs.aws.amazon.com/sdk-for-java/latest/reference/).

**catatan**  
Dalam anotasi berikut, hanya `DynamoDBTable` dan `DynamoDBHashKey` yang diperlukan. 

**Topics**
+ [Dinamo DBAttribute](#DynamoDBMapper.Annotations.DynamoDBAttribute)
+ [Dinamo DBAuto GeneratedKey](#DynamoDBMapper.Annotations.DynamoDBAutoGeneratedKey)
+ [Dinamo DBAuto GeneratedTimestamp](#DynamoDBMapper.Annotations.DynamoDBAutoGeneratedTimestamp)
+ [Dinamo DBDocument](#DynamoDBMapper.Annotations.DynamoDBDocument)
+ [Kunci Dynamo DBHash](#DynamoDBMapper.Annotations.DynamoDBHashKey)
+ [Dinamo DBIgnore](#DynamoDBMapper.Annotations.DynamoDBIgnore)
+ [Dinamo DBIndex HashKey](#DynamoDBMapper.Annotations.DynamoDBIndexHashKey)
+ [Dinamo DBIndex RangeKey](#DynamoDBMapper.Annotations.DynamoDBIndexRangeKey)
+ [Kunci Dynamo DBRange](#DynamoDBMapper.Annotations.DynamoDBRangeKey)
+ [Dinamo DBTable](#DynamoDBMapper.Annotations.DynamoDBTable)
+ [Dynamo Dikonversi DBType](#DynamoDBMapper.Annotations.DynamoDBTypeConverted)
+ [Dinamo DBTyped](#DynamoDBMapper.Annotations.DynamoDBTyped)
+ [Atribut Dynamo DBVersion](#DynamoDBMapper.Annotations.DynamoDBVersionAttribute)

## Dinamo DBAttribute
<a name="DynamoDBMapper.Annotations.DynamoDBAttribute"></a>

Memetakan properti ke atribut tabel. Secara default, setiap properti kelas dipetakan ke atribut item dengan nama yang sama. Namun, jika nama tidak sama, Anda dapat menggunakan anotasi ini untuk memetakan properti ke atribut. Dalam cuplikan Java berikut, `DynamoDBAttribute` memetakan properti `BookAuthors` ke nama atribut `Authors` dalam tabel.

```
@DynamoDBAttribute(attributeName = "Authors")
public List<String> getBookAuthors() { return BookAuthors; }
public void setBookAuthors(List<String> BookAuthors) { this.BookAuthors = BookAuthors; }
```

`DynamoDBMapper` menggunakan `Authors` sebagai nama atribut saat menyimpan objek ke tabel. 

## Dinamo DBAuto GeneratedKey
<a name="DynamoDBMapper.Annotations.DynamoDBAutoGeneratedKey"></a>

Menandai kunci partisi atau properti kunci urutan sebagai dibuat otomatis. `DynamoDBMapper` membuat [UUID](http://docs.oracle.com/javase/6/docs/api/java/util/UUID.html) acak saat menyimpan atribut ini. Hanya properti String yang dapat ditandai sebagai kunci yang dibuat otomatis. 

Contoh berikut mendemonstrasikan menggunakan kunci yang dibuat otomatis.

```
@DynamoDBTable(tableName="AutoGeneratedKeysExample")
public class AutoGeneratedKeys {
    private String id;
    private String payload;

    @DynamoDBHashKey(attributeName = "Id")
    @DynamoDBAutoGeneratedKey
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }

    @DynamoDBAttribute(attributeName="payload")
    public String getPayload() { return this.payload; }
    public void setPayload(String payload) { this.payload = payload; }

    public static void saveItem() {
        AutoGeneratedKeys obj = new AutoGeneratedKeys();
        obj.setPayload("abc123");

        // id field is null at this point
        DynamoDBMapper mapper = new DynamoDBMapper(dynamoDBClient);
        mapper.save(obj);

        System.out.println("Object was saved with id " + obj.getId());
    }
}
```

## Dinamo DBAuto GeneratedTimestamp
<a name="DynamoDBMapper.Annotations.DynamoDBAutoGeneratedTimestamp"></a>

Membuat stempel waktu secara otomatis.

```
@DynamoDBAutoGeneratedTimestamp(strategy=DynamoDBAutoGenerateStrategy.ALWAYS)
public Date getLastUpdatedDate() { return lastUpdatedDate; }
public void setLastUpdatedDate(Date lastUpdatedDate) { this.lastUpdatedDate = lastUpdatedDate; }
```

Secara opsional, strategi pembuatan otomatis dapat didefinisikan dengan menyediakan atribut strategi. Nilai default-nya `ALWAYS`.

## Dinamo DBDocument
<a name="DynamoDBMapper.Annotations.DynamoDBDocument"></a>

Menunjukkan bahwa kelas dapat diserialisasi sebagai dokumen Amazon DynamoDB.

Misalnya, katakanlah Anda ingin memetakan dokumen JSON ke atribut DynamoDB untuk jenis Peta (`M`). Contoh kode berikut mendefinisikan item yang berisi atribut bersarang (Gambar) untuk jenis Peta.

```
public class ProductCatalogItem {

    private Integer id;  //partition key
    private Pictures pictures;
    /* ...other attributes omitted... */

    @DynamoDBHashKey(attributeName="Id")
    public Integer getId() { return id;}
    public void setId(Integer id) {this.id = id;}

    @DynamoDBAttribute(attributeName="Pictures")
    public Pictures getPictures() { return pictures;}
    public void setPictures(Pictures pictures) {this.pictures = pictures;}

    // Additional properties go here.

    @DynamoDBDocument
    public static class Pictures {
        private String frontView;
        private String rearView;
        private String sideView;

        @DynamoDBAttribute(attributeName = "FrontView")
        public String getFrontView() { return frontView; }
        public void setFrontView(String frontView) { this.frontView = frontView; }

        @DynamoDBAttribute(attributeName = "RearView")
        public String getRearView() { return rearView; }
        public void setRearView(String rearView) { this.rearView = rearView; }

        @DynamoDBAttribute(attributeName = "SideView")
        public String getSideView() { return sideView; }
        public void setSideView(String sideView) { this.sideView = sideView; }

     }
}
```

Kemudian, Anda dapat menyimpan item `ProductCatalog`, dengan `Pictures`, seperti yang ditunjukkan dalam contoh berikut.

```
ProductCatalogItem item = new ProductCatalogItem();

Pictures pix = new Pictures();
pix.setFrontView("http://example.com/products/123_front.jpg");
pix.setRearView("http://example.com/products/123_rear.jpg");
pix.setSideView("http://example.com/products/123_left_side.jpg");
item.setPictures(pix);

item.setId(123);

mapper.save(item);
```

Item `ProductCatalog` yang dihasilkan akan tampak seperti berikut (dalam format JSON).

```
{
  "Id" : 123
  "Pictures" : {
    "SideView" : "http://example.com/products/123_left_side.jpg",
    "RearView" : "http://example.com/products/123_rear.jpg",
    "FrontView" : "http://example.com/products/123_front.jpg"
  }
}
```

## Kunci Dynamo DBHash
<a name="DynamoDBMapper.Annotations.DynamoDBHashKey"></a>

Memetakan properti kelas ke kunci partisi tabel. Properti harus berupa salah satu string skalar, angka, atau jenis biner. Properti tidak dapat berupa jenis koleksi. 

Asumsikan bahwa Anda memiliki tabel, `ProductCatalog`, yang memiliki `Id` sebagai kunci primer. Kode Java berikut mendefinisikan kelas `CatalogItem` dan memetakan properti `Id`-nya ke kunci primer dari tabel `ProductCatalog` menggunakan tanda `@DynamoDBHashKey`.

```
@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {
    private Integer Id;
   @DynamoDBHashKey(attributeName="Id")
   public Integer getId() {
        return Id;
   }
   public void setId(Integer Id) {
        this.Id = Id;
   }
   // Additional properties go here.
}
```

## Dinamo DBIgnore
<a name="DynamoDBMapper.Annotations.DynamoDBIgnore"></a>

Menunjukkan ke instans `DynamoDBMapper` bahwa properti terkait harus diabaikan. Saat menyimpan data ke tabel, `DynamoDBMapper` tidak menyimpan properti ini ke tabel.

 Diterapkan pada metode getter atau bidang kelas untuk properti yang tidak dimodelkan. Jika anotasi diterapkan langsung ke bidang kelas, getter dan setter yang sesuai harus dinyatakan di kelas yang sama. 

## Dinamo DBIndex HashKey
<a name="DynamoDBMapper.Annotations.DynamoDBIndexHashKey"></a>

Memetakan properti kelas ke kunci partisi untuk indeks sekunder global. Properti harus berupa salah satu string skalar, angka, atau jenis biner. Properti tidak dapat berupa jenis koleksi. 

Gunakan anotasi ini jika Anda perlu `Query` indeks sekunder global. Anda harus menentukan nama indeks (`globalSecondaryIndexName`). Jika nama properti kelas berbeda dari kunci partisi indeks, Anda juga harus menentukan nama atribut indeks (`attributeName`).

## Dinamo DBIndex RangeKey
<a name="DynamoDBMapper.Annotations.DynamoDBIndexRangeKey"></a>

Memetakan properti kelas untuk kunci urutan indeks sekunder global atau indeks sekunder lokal. Properti harus berupa salah satu string skalar, angka, atau jenis biner. Properti tidak dapat berupa jenis koleksi. 

Gunakan anotasi ini jika anda perlu `Query` indeks sekunder lokal atau indeks sekunder global dan ingin menyempurnakan hasil menggunakan kunci urutan indeks. Anda harus menentukan nama indeks (baik `globalSecondaryIndexName` maupun `localSecondaryIndexName`). Jika nama properti kelas berbeda dari kunci urutan indeks, Anda juga harus menentukan nama atribut indeks (`attributeName`).

## Kunci Dynamo DBRange
<a name="DynamoDBMapper.Annotations.DynamoDBRangeKey"></a>

Memetakan properti kelas untuk kunci urutan tabel. Properti harus berupa salah satu string skalar, angka, atau jenis biner. Properti ini tidak boleh berupa jenis koleksi. 

Jika kunci primer adalah komposit (kunci partisi dan kunci urutan), Anda dapat menggunakan tanda ini untuk memetakan bidang kelas Anda ke kunci urutan. Misalnya, Anda memiliki tabel `Reply` yang menyimpan balasan untuk utas forum. Setiap utas dapat berisi banyak balasan. Jadi, kunci primer tabel ini adalah `ThreadId` dan `ReplyDateTime`. `ThreadId` adalah kunci partisinya, dan `ReplyDateTime` adalah kunci urutannya. 

Kode Java berikut akan mendefinisikan `Reply` dan memetakannya ke tabel `Reply`. Kode tersebut menggunakan tanda `@DynamoDBHashKey` dan `@DynamoDBRangeKey` untuk mengidentifikasi properti kelas yang dipetakan ke kunci primer.

```
@DynamoDBTable(tableName="Reply")
public class Reply {
    private Integer id;
    private String replyDateTime;

    @DynamoDBHashKey(attributeName="Id")
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }

    @DynamoDBRangeKey(attributeName="ReplyDateTime")
    public String getReplyDateTime() { return replyDateTime; }
    public void setReplyDateTime(String replyDateTime) { this.replyDateTime = replyDateTime; }

   // Additional properties go here.
}
```

## Dinamo DBTable
<a name="DynamoDBMapper.Annotations.DynamoDBTable"></a>

Mengidentifikasi tabel target di DynamoDB. Misalnya, kode Java berikut menentukan kelas `Developer` dan memetakannya ke tabel `People` di DynamoDB. 

```
@DynamoDBTable(tableName="People")
public class Developer { ...}
```

Anotasi `@DynamoDBTable` dapat diwariskan. Setiap kelas baru yang diwariskan dari kelas `Developer` juga dipetakan ke tabel `People` yang sama. Misalnya, Anda membuat kelas `Lead` yang diwariskan dari kelas `Developer`. Karena Anda memetakan kelas `Developer` ke tabel `People`, objek kelas `Lead` juga disimpan dalam tabel yang sama.

`@DynamoDBTable` juga dapat diganti. Setiap kelas baru yang diwariskan dari kelas `Developer` secara default dipetakan ke tabel `People` yang sama. Namun, Anda dapat mengganti pemetaan default ini. Misalnya, jika Anda membuat kelas yang diwariskan dari kelas `Developer`, Anda dapat secara eksplisit memetakannya ke tabel lain dengan menambahkan anotasi `@DynamoDBTable` seperti yang ditunjukkan dalam contoh kode Java berikut.

```
@DynamoDBTable(tableName="Managers")
public class Manager extends Developer { ...}
```

## Dynamo Dikonversi DBType
<a name="DynamoDBMapper.Annotations.DynamoDBTypeConverted"></a>

Anotasi untuk menandai properti sebagai menggunakan konverter jenis khusus. Dapat dianotasikan pada anotasi yang ditetapkan pengguna untuk meneruskan properti tambahan ke `DynamoDBTypeConverter`. 

 Antarmuka `DynamoDBTypeConverter` memungkinkan Anda memetakan jenis data arbitrer Anda sendiri ke jenis data yang secara asli didukung oleh DynamoDB. Untuk informasi selengkapnya, lihat [Memetakan data arbitrer di DynamoDB](DynamoDBMapper.ArbitraryDataMapping.md).

## Dinamo DBTyped
<a name="DynamoDBMapper.Annotations.DynamoDBTyped"></a>

Anotasi untuk menimpa pengikatan jenis atribut standar. Jenis standar tidak memerlukan anotasi jika menerapkan pengikatan atribut default untuk jenis tersebut. 

## Atribut Dynamo DBVersion
<a name="DynamoDBMapper.Annotations.DynamoDBVersionAttribute"></a>

Mengidentifikasi properti kelas untuk menyimpan nomor versi penguncian optimis. `DynamoDBMapper` menetapkan nomor versi untuk properti ini ketika menyimpan item baru, dan menambahkannya setiap kali Anda memperbarui item. Hanya jenis skalar nomor yang didukung. Untuk informasi selengkapnya tentang jenis data, lihat [Jenis Data](HowItWorks.NamingRulesDataTypes.md#HowItWorks.DataTypes). Untuk informasi selengkapnya tentang penentuan versi, lihat [DynamoDB dan penguncian optimis dengan nomor versi](DynamoDBMapper.OptimisticLocking.md).

# Pengaturan konfigurasi opsional untuk Dynamo DBMapper
<a name="DynamoDBMapper.OptionalConfig"></a>

Saat Anda membuat instans `DynamoDBMapper`, instans tersebut memiliki perilaku default tertentu; Anda dapat menimpa pengaturan default ini menggunakan kelas `DynamoDBMapperConfig`. 

Cuplikan kode berikut akan membuat `DynamoDBMapper` dengan pengaturan kustom:

```
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();

DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder()
        .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.CLOBBER)
        .withConsistentReads(DynamoDBMapperConfig.ConsistentReads.CONSISTENT)
        .withTableNameOverride(null)
        .withPaginationLoadingStrategy(DynamoDBMapperConfig.PaginationLoadingStrategy.EAGER_LOADING)
    .build();

DynamoDBMapper mapper = new DynamoDBMapper(client, mapperConfig);
```

Untuk informasi selengkapnya, lihat [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapperConfig.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapperConfig.html) di Referensi API [AWS SDK untuk Java .](https://docs.aws.amazon.com/sdk-for-java/latest/reference/)

Anda dapat menggunakan argumen berikut untuk instans `DynamoDBMapperConfig`:
+ Nilai enumerasi `DynamoDBMapperConfig.ConsistentReads`:
  + `EVENTUAL`—instans pemeta menggunakan permintaan bacaan akhir konsisten.
  + `CONSISTENT`—instans pemeta menggunakan permintaan bacaan sangat konsisten. Anda dapat menggunakan pengaturan opsional ini dengan operasi `load`, `query`, atau `scan`. Bacaan sangat konsisten memiliki implikasi terhadap performa dan penagihan; lihat [halaman detail produk](https://aws.amazon.com/dynamodb) DynamoDB untuk informasi selengkapnya.

  Jika Anda tidak menentukan pengaturan konsistensi baca untuk instans pemeta Anda, pengaturan defaultnya adalah `EVENTUAL`.
**catatan**  
Nilai ini diterapkan dalam`query`,, `querypage``load`, dan `batch load` operasi DynamoDBMapper.
+ Nilai enumerasi `DynamoDBMapperConfig.PaginationLoadingStrategy`—Mengontrol cara instans pemeta memproses daftar data yang diberi nomor halaman, seperti hasil dari `query` atau `scan`:
  + `LAZY_LOADING`—instans pemeta memuat data jika memungkinkan, dan menyimpan semua hasil yang dimuat dalam memori.
  + `EAGER_LOADING`—instans pemeta memuat data segera setelah daftar diinisialisasi.
  + `ITERATION_ONLY`—Anda hanya dapat menggunakan Iterator untuk membaca dari daftar. Selama iterasi, daftar akan menghapus semua hasil lama sebelum memuat halaman berikutnya, sehingga daftar akan menyimpan maksimal satu halaman dari hasil yang dimuat dalam memori. Hal ini juga berarti bahwa daftar hanya dapat diiterasi satu kali. Strategi ini direkomendasikan saat menangani item besar, guna mengurangi overhead memori.

  Jika Anda tidak menentukan strategi pemuatan pemberian nomor halaman untuk instans pemeta Anda, pengaturan defaultnya adalah `LAZY_LOADING`.
+ Nilai enumerasi `DynamoDBMapperConfig.SaveBehavior` - Menentukan cara instans pemeta akan menangani atribut selama operasi simpan:
  + `UPDATE`—selama operasi simpan, semua atribut model diperbarui, dan atribut yang tidak dibuat modelnya tidak terpengaruh. Jenis angka primitif (byte, int, long) diatur ke 0. Jenis objek diatur ke null. 
  + `CLOBBER`—menghapus dan mengganti semua atribut, termasuk yang tidak dibuat modelnya, selama operasi simpan. Hal ini dilakukan dengan menghapus item lalu membuatnya kembali. Batasan bidang dengan versi juga diabaikan.

   Jika Anda tidak menentukan perilaku simpan untuk instans pemeta, pengaturan defaultnya adalah `UPDATE`.
**catatan**  
Operasi DBMapper transaksional Dynamo tidak mendukung pencacahan. `DynamoDBMapperConfig.SaveBehavior` 
+ Objek `DynamoDBMapperConfig.TableNameOverride`—Menginstruksikan instans pemeta untuk mengabaikan nama tabel yang ditentukan oleh anotasi `DynamoDBTable` kelas, dan menggunakan nama tabel lain yang Anda berikan. Ini berguna saat mempartisi data Anda menjadi beberapa tabel saat runtime. 

Anda dapat mengganti objek konfigurasi default untuk `DynamoDBMapper` per operasi, jika diperlukan.

# DynamoDB dan penguncian optimis dengan nomor versi
<a name="DynamoDBMapper.OptimisticLocking"></a>

*Penguncian optimis* adalah strategi untuk memastikan bahwa item sisi klien yang Anda perbarui (atau hapus) sama dengan item di Amazon DynamoDB. Jika Anda menggunakan strategi ini, penulisan basis data Anda dilindungi agar tidak ditimpa oleh penulisan orang lain, dan sebaliknya.

Dengan penguncian optimis, setiap item memiliki atribut yang berfungsi sebagai nomor versi. Jika Anda mengambil item dari tabel, aplikasi akan mencatat nomor versi item tersebut. Anda dapat memperbarui item, tetapi hanya jika nomor versi di sisi server tidak berubah. Jika ada ketidakcocokan versi, artinya orang lain telah mengubah item sebelum Anda melakukannya. Upaya pembaruan gagal, karena versi item Anda sudah usang. Jika ini terjadi, coba lagi dengan mengambil item dan kemudian mencoba memperbaruinya. Penguncian optimis mencegah Anda menimpa perubahan secara tidak sengaja yang dibuat oleh orang lain. Penguncian optimis juga mencegah orang lain menimpa perubahan Anda secara tidak sengaja.

Meskipun Anda dapat menerapkan strategi penguncian optimis Anda sendiri, AWS SDK untuk Java memberikan `@DynamoDBVersionAttribute` anotasi. Di kelas pemetaan untuk tabel, Anda menetapkan satu properti untuk menyimpan nomor versi, dan menandainya menggunakan anotasi ini. Saat Anda menyimpan objek, item terkait dalam tabel DynamoDB akan memiliki atribut yang menyimpan nomor versi. `DynamoDBMapper` menetapkan nomor versi saat Anda pertama kali menyimpan objek, dan otomatis menambahkan nomor versi setiap kali Anda memperbarui item. Permintaan perbarui atau hapus Anda hanya akan berhasil jika versi objek sisi klien cocok dengan nomor versi item yang sesuai dalam tabel DynamoDB.

 `ConditionalCheckFailedException` ditampilkan jika: 
+  Anda menggunakan penguncian optimis dengan `@DynamoDBVersionAttribute` dan nilai versi pada server yang berbeda dari nilai pada sisi klien. 
+  Anda menentukan batasan bersyarat Anda sendiri saat menyimpan data menggunakan `DynamoDBMapper` dengan `DynamoDBSaveExpression` dan batasan ini gagal. 

**catatan**  
Tabel global DynamoDB menggunakan rekonsiliasi “penulis terakhir menang” antara pembaruan bersamaan. Jika Anda menggunakan tabel global, kebijakan penulis terakhir akan menang. Jadi dalam hal ini, strategi penguncian tidak berfungsi seperti yang diharapkan.
Operasi tulis transaksional `DynamoDBMapper` tidak mendukung ekspresi syarat dan anotasi `@DynamoDBVersionAttribute` pada objek yang sama. Jika sebuah objek dalam penulisan transaksional dianotasi dengan `@DynamoDBVersionAttribute` dan juga memiliki ekspresi kondisi, maka akan dilemparkan. SdkClientException 

Misalnya, kode Java berikut mendefinisikan kelas `CatalogItem` yang memiliki beberapa properti. Properti `Version` ditandai dengan anotasi `@DynamoDBVersionAttribute`.

**Example**  

```
@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {

    private Integer id;
    private String title;
    private String ISBN;
    private Set<String> bookAuthors;
    private String someProp;
    private Long version;

    @DynamoDBHashKey(attributeName="Id")
    public Integer getId() { return id; }
    public void setId(Integer Id) { this.id = Id; }

    @DynamoDBAttribute(attributeName="Title")
    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }

    @DynamoDBAttribute(attributeName="ISBN")
    public String getISBN() { return ISBN; }
    public void setISBN(String ISBN) { this.ISBN = ISBN;}

    @DynamoDBAttribute(attributeName = "Authors")
    public Set<String> getBookAuthors() { return bookAuthors; }
    public void setBookAuthors(Set<String> bookAuthors) { this.bookAuthors = bookAuthors; }

    @DynamoDBIgnore
    public String getSomeProp() { return someProp;}
    public void setSomeProp(String someProp) {this.someProp = someProp;}

    @DynamoDBVersionAttribute
    public Long getVersion() { return version; }
    public void setVersion(Long version) { this.version = version;}
}
```

Anda dapat menerapkan anotasi `@DynamoDBVersionAttribute` untuk jenis yang dapat dinihilkan yang diberikan oleh kelas pembungkus primitif yang menyediakan jenis yang dapat di-null-kan, seperti `Long` dan `Integer`. 

Penguncian optimis memiliki dampak sebagai berikut pada metode `DynamoDBMapper` ini:
+ `save` — Untuk item baru, `DynamoDBMapper` menetapkan nomor versi awal 1. Jika Anda mengambil item, memperbarui satu atau beberapa propertinya, dan mencoba untuk menyimpan perubahan, operasi simpan hanya akan berhasil jika nomor versi di sisi klien dan sisi server cocok. `DynamoDBMapper` menambah nomor versi secara otomatis.
+ `delete` — Metode `delete` mengambil sebuah objek sebagai parameter, dan `DynamoDBMapper` melakukan pemeriksaan versi sebelum menghapus item. Pemeriksaan versi dapat dinonaktifkan jika `DynamoDBMapperConfig.SaveBehavior.CLOBBER` ditentukan dalam permintaan.

  Implementasi internal penguncian optimis dalam `DynamoDBMapper` menggunakan pembaruan bersyarat dan dukungan penghapusan bersyarat yang disediakan oleh DynamoDB. 
+ `transactionWrite` —
  + `Put` — Untuk item baru, `DynamoDBMapper` menetapkan nomor versi awal 1. Jika Anda mengambil item, memperbarui satu atau beberapa propertinya, dan mencoba untuk menyimpan perubahan, operasi masukkan hanya akan berhasil jika nomor versi di sisi klien dan sisi server cocok. `DynamoDBMapper` menambah nomor versi secara otomatis.
  + `Update` — Untuk item baru, `DynamoDBMapper` menetapkan nomor versi awal 1. Jika Anda mengambil item, memperbarui satu atau beberapa propertinya, dan mencoba untuk menyimpan perubahan, operasi perbarui hanya akan berhasil jika nomor versi di sisi klien dan sisi server cocok. `DynamoDBMapper` menambah nomor versi secara otomatis.
  + `Delete` — `DynamoDBMapper` melakukan pemeriksaan versi sebelum menghapus item. Operasi hapus hanya akan berhasil jika nomor versi pada sisi klien dan sisi server cocok.
  + `ConditionCheck` — Anotasi `@DynamoDBVersionAttribute` tidak didukung untuk operasi `ConditionCheck`. An SdkClientException akan dilemparkan ketika `ConditionCheck` item dianotasi dengan. `@DynamoDBVersionAttribute` 

## Menonaktifkan penguncian optimis
<a name="DynamoDBMapper.OptimisticLocking.Disabling"></a>

Untuk menonaktifkan penguncian optimis, Anda dapat mengubah nilai enumerasi `DynamoDBMapperConfig.SaveBehavior` dari `UPDATE` menjadi `CLOBBER`. Anda dapat melakukannya dengan membuat instans `DynamoDBMapperConfig` yang melewatkan pemeriksaan versi dan menggunakan instans ini untuk semua permintaan Anda. Untuk informasi tentang `DynamoDBMapperConfig.SaveBehavior` dan parameter `DynamoDBMapper` opsional lainnya, lihat [Pengaturan konfigurasi opsional untuk Dynamo DBMapper](DynamoDBMapper.OptionalConfig.md). 

Anda juga dapat mengatur perilaku penguncian untuk operasi tertentu saja. Misalnya, cuplikan Java berikut menggunakan `DynamoDBMapper` untuk menyimpan item katalog. Cuplikan ini menentukan `DynamoDBMapperConfig.SaveBehavior` dengan menambahkan parameter `DynamoDBMapperConfig` opsional untuk metode `save`. 

**catatan**  
Metode TransactionWrite tidak mendukung Dynamo Config. DBMapper SaveBehaviorkonfigurasi. Menonaktifkan penguncian optimis untuk transactionWrite tidak didukung.

**Example**  

```
DynamoDBMapper mapper = new DynamoDBMapper(client);

// Load a catalog item.
CatalogItem item = mapper.load(CatalogItem.class, 101);
item.setTitle("This is a new title for the item");
...
// Save the item.
mapper.save(item,
    new DynamoDBMapperConfig(
        DynamoDBMapperConfig.SaveBehavior.CLOBBER));
```

# Memetakan data arbitrer di DynamoDB
<a name="DynamoDBMapper.ArbitraryDataMapping"></a>

Selain jenis Java yang didukung (lihat [Tipe data yang didukung untuk Dynamo DBMapper untuk Java](DynamoDBMapper.DataTypes.md)), Anda dapat menggunakan jenis di aplikasi Anda yang tidak memiliki pemetaan langsung ke jenis Amazon DynamoDB. Untuk memetakan jenis ini, Anda harus menyediakan implementasi yang mengonversi jenis kompleks Anda ke jenis yang didukung DynamoDB dan sebaliknya, serta menganotasi metode penilai jenis kompleks menggunakan anotasi `@DynamoDBTypeConverted`. Kode konverter mengubah data ketika objek disimpan atau dimuat. Kode ini juga digunakan untuk semua operasi yang mengonsumsi jenis kompleks. Perhatikan bahwa saat membandingkan data selama operasi kueri dan pindai, perbandingan pada data yang disimpan dalam DynamoDB akan dilakukan.

Misalnya, pertimbangkan kelas `CatalogItem` berikut yang mendefinisikan properti, `Dimension`, yaitu `DimensionType`. Properti ini menyimpan dimensi item sebagai tinggi, lebar, dan ketebalan. Misalnya Anda memutuskan untuk menyimpan dimensi item ini sebagai string (seperti 8.5x11x.05) dalam DynamoDB. Contoh berikut memberikan kode konverter yang mengonversi objek `DimensionType` menjadi string dan string menjadi `DimensionType`.



**catatan**  
Contoh kode ini mengasumsikan bahwa Anda telah memuat data ke DynamoDB untuk akun Anda dengan mengikuti petunjuk di bagian [Membuat tabel dan memuat data untuk contoh kode di DynamoDB](SampleData.md).  
Untuk step-by-step instruksi untuk menjalankan contoh berikut, lihat[Contoh kode Java](CodeSamples.Java.md).

**Example**  

```
public class DynamoDBMapperExample {

    static AmazonDynamoDB client;

    public static void main(String[] args) throws IOException {

        // Set the AWS region you want to access.
        Regions usWest2 = Regions.US_WEST_2;
        client = AmazonDynamoDBClientBuilder.standard().withRegion(usWest2).build();

        DimensionType dimType = new DimensionType();
        dimType.setHeight("8.00");
        dimType.setLength("11.0");
        dimType.setThickness("1.0");

        Book book = new Book();
        book.setId(502);
        book.setTitle("Book 502");
        book.setISBN("555-5555555555");
        book.setBookAuthors(new HashSet<String>(Arrays.asList("Author1", "Author2")));
        book.setDimensions(dimType);

        DynamoDBMapper mapper = new DynamoDBMapper(client);
        mapper.save(book);

        Book bookRetrieved = mapper.load(Book.class, 502);
        System.out.println("Book info: " + "\n" + bookRetrieved);

        bookRetrieved.getDimensions().setHeight("9.0");
        bookRetrieved.getDimensions().setLength("12.0");
        bookRetrieved.getDimensions().setThickness("2.0");

        mapper.save(bookRetrieved);

        bookRetrieved = mapper.load(Book.class, 502);
        System.out.println("Updated book info: " + "\n" + bookRetrieved);
    }

    @DynamoDBTable(tableName = "ProductCatalog")
    public static class Book {
        private int id;
        private String title;
        private String ISBN;
        private Set<String> bookAuthors;
        private DimensionType dimensionType;

        // Partition key
        @DynamoDBHashKey(attributeName = "Id")
        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        @DynamoDBAttribute(attributeName = "Title")
        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        @DynamoDBAttribute(attributeName = "ISBN")
        public String getISBN() {
            return ISBN;
        }

        public void setISBN(String ISBN) {
            this.ISBN = ISBN;
        }

        @DynamoDBAttribute(attributeName = "Authors")
        public Set<String> getBookAuthors() {
            return bookAuthors;
        }

        public void setBookAuthors(Set<String> bookAuthors) {
            this.bookAuthors = bookAuthors;
        }

        @DynamoDBTypeConverted(converter = DimensionTypeConverter.class)
        @DynamoDBAttribute(attributeName = "Dimensions")
        public DimensionType getDimensions() {
            return dimensionType;
        }

        @DynamoDBAttribute(attributeName = "Dimensions")
        public void setDimensions(DimensionType dimensionType) {
            this.dimensionType = dimensionType;
        }

        @Override
        public String toString() {
            return "Book [ISBN=" + ISBN + ", bookAuthors=" + bookAuthors + ", dimensionType= "
                    + dimensionType.getHeight() + " X " + dimensionType.getLength() + " X "
                    + dimensionType.getThickness()
                    + ", Id=" + id + ", Title=" + title + "]";
        }
    }

    static public class DimensionType {

        private String length;
        private String height;
        private String thickness;

        public String getLength() {
            return length;
        }

        public void setLength(String length) {
            this.length = length;
        }

        public String getHeight() {
            return height;
        }

        public void setHeight(String height) {
            this.height = height;
        }

        public String getThickness() {
            return thickness;
        }

        public void setThickness(String thickness) {
            this.thickness = thickness;
        }
    }

    // Converts the complex type DimensionType to a string and vice-versa.
    static public class DimensionTypeConverter implements DynamoDBTypeConverter<String, DimensionType> {

        @Override
        public String convert(DimensionType object) {
            DimensionType itemDimensions = (DimensionType) object;
            String dimension = null;
            try {
                if (itemDimensions != null) {
                    dimension = String.format("%s x %s x %s", itemDimensions.getLength(), itemDimensions.getHeight(),
                            itemDimensions.getThickness());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return dimension;
        }

        @Override
        public DimensionType unconvert(String s) {

            DimensionType itemDimension = new DimensionType();
            try {
                if (s != null && s.length() != 0) {
                    String[] data = s.split("x");
                    itemDimension.setLength(data[0].trim());
                    itemDimension.setHeight(data[1].trim());
                    itemDimension.setThickness(data[2].trim());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return itemDimension;
        }
    }
}
```

# Contoh Dynamo DBMapper
<a name="DynamoDBMapper.Examples"></a>

 AWS SDK for Java menyediakan `DynamoDBMapper` kelas, memungkinkan Anda untuk memetakan kelas sisi klien Anda ke tabel DynamoDB. Untuk menggunakan `DynamoDBMapper`, tentukan hubungan antara item dalam tabel DynamoDB dan instans objek yang sesuai dalam kode Anda. Kelas `DynamoDBMapper` memungkinkan Anda melakukan berbagai operasi buat, baca, perbarui, dan hapus (CRUD) pada item, dan menjalankan kueri serta memindai tabel.

*Untuk mempelajari lebih lanjut tentang cara menggunakan`DynamoDBMapper`, lihat [Contoh DynamoDB Menggunakan SDK AWS for Java di SDK for Java](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-dynamodb.html) 1.x Panduan AWS Pengembang.* 

# Java 2.x: DynamoDB Enhanced Client
<a name="DynamoDBEnhanced"></a>

Klien yang disempurnakan DynamoDB adalah pustaka tingkat tinggi yang merupakan bagian dari versi 2 ( AWS SDK untuk Java v2). Ini menawarkan cara mudah untuk memetakan kelas sisi klien ke tabel DynamoDB. Anda menentukan hubungan antara tabel dan kelas model yang sesuai dalam kode Anda. Setelah menentukan hubungan tersebut, Anda dapat melakukan berbagai operasi buat, baca, perbarui, atau hapus (CRUD) pada tabel atau item di DynamoDB.

Untuk informasi selengkapnya tentang bagaimana Anda dapat menggunakan klien yang disempurnakan dengan DynamoDB, lihat [Menggunakan DynamoDB Enhanced Client di 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/dynamodb-enhanced-client.html). AWS SDK untuk Java 

# Bekerja dengan model dokumen.NET di DynamoDB
<a name="DotNetSDKMidLevel"></a>

 AWS SDK untuk .NET Ini menyediakan kelas model dokumen yang membungkus beberapa operasi Amazon DynamoDB tingkat rendah, yang selanjutnya menyederhanakan pengkodean Anda. Dalam model dokumen, kelas utamanya adalah `Table` dan `Document`. Kelas `Table` menyediakan metode operasi data seperti `PutItem`, `GetItem`, dan `DeleteItem`. Kelas ini juga menyediakan metode `Query` dan `Scan`. Kelas `Document` mewakili satu item dalam tabel.

Kelas model dokumen sebelumnya tersedia di namespace `Amazon.DynamoDBv2.DocumentModel`.

**catatan**  
Anda tidak dapat menggunakan kelas model dokumen untuk membuat, memperbarui, dan menghapus tabel. Namun, model dokumen mendukung operasi data yang paling umum.

**Topics**
+ [Jenis data yang didukung](#MidLevelAPILimitations.SupportedTypes)

## Jenis data yang didukung
<a name="MidLevelAPILimitations.SupportedTypes"></a>

Model dokumen mendukung serangkaian jenis data .NET primitif dan jenis data koleksi. Model ini mendukung jenis data primitif berikut. 
+ `bool`
+ `byte` 
+ `char`
+ `DateTime`
+ `decimal`
+ `double`
+ `float`
+ `Guid`
+ `Int16`
+ `Int32`
+ `Int64`
+ `SByte`
+ `string`
+ `UInt16`
+ `UInt32`
+ `UInt64`

Tabel berikut merangkum pemetaan jenis .NET sebelumnya untuk jenis DynamoDB.


****  

| Jenis .NET primitif | Jenis DynamoDB | 
| --- | --- | 
|  Semua jenis angka  |  `N` (jenis angka)  | 
|  Semua jenis string  |  `S` (jenis string)   | 
|  MemoryStream, byte []  |  `B` (jenis biner)   | 
| bool | N (jenis angka). 0 mewakili false dan 1 mewakili true. | 
| DateTime | S (jenis string). Nilai DateTime disimpan sebagai string berformat ISO-8601. | 
| Guid | S (jenis string). | 
| Jenis koleksi (Daftar, HashSet, dan array) | Jenis BS (set biner), jenis SS (set string), dan jenis NS (set angka) | 

AWS SDK untuk .NET mendefinisikan tipe untuk memetakan tipe Boolean, null, list, dan map DynamoDB ke API model dokumen.NET:
+ Gunakan `DynamoDBBool` untuk jenis Boolean.
+ Gunakan `DynamoDBNull` untuk jenis null.
+ Gunakan `DynamoDBList` untuk jenis daftar.
+ Gunakan `Document` untuk jenis peta.

**catatan**  
Nilai biner kosong didukung.
Pembacaan nilai string kosong didukung. Nilai atribut string kosong didukung dalam nilai atribut string dari jenis Set saat menulis ke DynamoDB. Nilai atribut string kosong dari jenis string dan nilai string kosong dalam jenis Daftar atau Peta dihilangkan dari permintaan tulis

# Bekerja dengan model persistensi objek.NET dan DynamoDB
<a name="DotNetSDKHighLevel"></a>

 AWS SDK untuk .NET Ini menyediakan model persistensi objek yang memungkinkan Anda memetakan kelas sisi klien Anda ke tabel Amazon DynamoDB. Kemudian, setiap instans objek dipetakan ke item dalam tabel yang sesuai. Untuk menyimpan objek sisi klien ke tabel, model persistensi objek menyediakan kelas `DynamoDBContext`, yaitu titik masuk ke DynamoDB. Kelas ini menyediakan koneksi ke DynamoDB dan memungkinkan Anda mengakses tabel, melakukan berbagai operasi CRUD, dan menjalankan kueri.

Model persistensi objek menyediakan satu set atribut untuk memetakan kelas sisi klien ke tabel, dan properties/fields ke atribut tabel.

**catatan**  
Model persistensi objek tidak menyediakan API untuk membuat, memperbarui, atau menghapus tabel. Model ini hanya menyediakan operasi data. Anda hanya dapat menggunakan API AWS SDK untuk .NET tingkat rendah untuk membuat, memperbarui, dan menghapus tabel.

Contoh berikut menunjukkan cara kerja model persistensi objek. Contoh ini dimulai dengan tabel `ProductCatalog`. Contoh ini memiliki `Id` sebagai kunci primernya.

```
ProductCatalog(Id, ...)
```

Katakanlah Anda memiliki kelas `Book` yang berisi properti `Title`, `ISBN`, dan `Authors`. Anda dapat memetakan kelas `Book` ke tabel `ProductCatalog` dengan menambahkan atribut yang didefinisikan oleh model persistensi objek, seperti yang ditunjukkan dalam kode contoh C\$1 berikut.

**Example**  

```
[DynamoDBTable("ProductCatalog")]
  public class Book
  {
    [DynamoDBHashKey]
    public int Id { get; set; }

    public string Title { get; set; }
    public int ISBN { get; set; }

    [DynamoDBProperty("Authors")]
    public List<string> BookAuthors { get; set; }

    [DynamoDBIgnore]
    public string CoverPage { get; set; }
  }
```

Dalam contoh sebelumnya, atribut `DynamoDBTable` memetakan kelas `Book` ke tabel `ProductCatalog`.

Model persistensi objek mendukung pemetaan eksplisit dan default antara properti kelas dan atribut tabel.
+ **Pemetaan eksplisit—**Untuk memetakan properti ke kunci primer, Anda harus menggunakan atribut model persistensi objek `DynamoDBHashKey` dan `DynamoDBRangeKey`. Selain itu, untuk atribut kunci nonprimer, jika nama properti di kelas Anda dan atribut tabel terkait yang ingin Anda petakan tidak sama, Anda harus mendefinisikan pemetaan dengan menambahkan atribut `DynamoDBProperty` secara eksplisit.

  Dalam contoh sebelumnya, properti `Id` dipetakan ke kunci primer dengan nama yang sama, dan properti `BookAuthors` dipetakan ke atribut `Authors` dalam tabel `ProductCatalog`.
+ **Pemetaan default—**Secara default, model persistensi objek memetakan properti kelas ke atribut dengan nama yang sama dalam tabel.

  Dalam contoh sebelumnya, properti `Title` dan `ISBN` dipetakan ke atribut dengan nama yang sama dalam tabel `ProductCatalog`.

Anda tidak perlu memetakan setiap properti kelas tunggal. Anda mengidentifikasi properti ini dengan menambahkan atribut `DynamoDBIgnore`. Ketika Anda menyimpan instans `Book` ke tabel, `DynamoDBContext` tidak menyertakan properti `CoverPage`. Instans tersebut juga tidak mengembalikan properti ini saat Anda mengambil instans buku.

Anda dapat memetakan properti jenis .NET primitif seperti int dan string. Anda juga dapat memetakan setiap jenis data arbitrer selama Anda memberikan konverter yang sesuai untuk memetakan data arbitrer ke salah satu jenis DynamoDB. Untuk mempelajari cara memetakan jenis arbitrer, lihat [Memetakan data arbitrer dengan DynamoDB menggunakan model persistensi objek AWS SDK untuk .NET](DynamoDBContext.ArbitraryDataMapping.md).

Model persistensi objek mendukung penguncian optimis. Selama operasi pembaruan, model ini memastikan bahwa Anda memiliki salinan terbaru dari item yang akan Anda perbarui. Untuk informasi selengkapnya, lihat [Penguncian optimis menggunakan DynamoDB dan model persistensi objek AWS SDK untuk .NET](DynamoDBContext.VersionSupport.md).

Untuk informasi selengkapnya, lihat topik di bawah.

**Topics**
+ [Jenis data yang didukung](#DotNetDynamoDBContext.SupportedTypes)
+ [Atribut DynamoDB dari model persistensi objek.NET](DeclarativeTagsList.md)
+ [DBContext Kelas Dynamo dari model persistensi objek.NET](DotNetDynamoDBContext.md)
+ [Penguncian optimis menggunakan DynamoDB dan model persistensi objek AWS SDK untuk .NET](DynamoDBContext.VersionSupport.md)
+ [Memetakan data arbitrer dengan DynamoDB menggunakan model persistensi objek AWS SDK untuk .NET](DynamoDBContext.ArbitraryDataMapping.md)

## Jenis data yang didukung
<a name="DotNetDynamoDBContext.SupportedTypes"></a>

Model persistensi objek mendukung sekumpulan jenis data .NET primitif, koleksi, dan jenis data arbitrer. Model ini mendukung jenis data primitif berikut. 
+ `bool`
+ `byte` 
+ `char`
+ `DateTime`
+ `decimal`
+ `double`
+ `float`
+ `Int16`
+ `Int32`
+ `Int64`
+ `SByte`
+ `string`
+ `UInt16`
+ `UInt32`
+ `UInt64`

Model persistensi objek juga mendukung jenis koleksi.NET. `DynamoDBContext`mampu mengkonversi jenis koleksi beton dan sederhana Plain Old CLR Objects (POCOs).

Tabel berikut merangkum pemetaan jenis .NET sebelumnya untuk jenis DynamoDB.


****  

| Jenis .NET primitif | Jenis DynamoDB | 
| --- | --- | 
|  Semua jenis angka  |  `N` (jenis angka)  | 
|  Semua jenis string  |  `S` (jenis string)   | 
|  MemoryStream, byte []  |  `B` (jenis biner)   | 
| bool | N (jenis angka). 0 mewakili false dan 1 mewakili true. | 
| Jenis koleksi | Jenis BS (kumpulan biner), jenis SS (kumpulan string), dan jenis NS (kumpulan angka). | 
| DateTime | S (jenis string). Nilai DateTime disimpan sebagai string berformat ISO-8601. | 

Model persistensi objek juga mendukung jenis data arbitrer. Namun, Anda harus menyediakan kode konverter untuk memetakan jenis kompleks ke jenis DynamoDB.

**catatan**  
Nilai biner kosong didukung.
Pembacaan nilai string kosong didukung. Nilai atribut string kosong didukung dalam nilai atribut string dari jenis Set saat menulis ke DynamoDB. Nilai atribut string kosong dari jenis string dan nilai string kosong dalam jenis Daftar atau Peta dihilangkan dari permintaan tulis

# Atribut DynamoDB dari model persistensi objek.NET
<a name="DeclarativeTagsList"></a>

Bagian ini menjelaskan atribut yang ditawarkan model persistensi objek agar Anda dapat memetakan kelas dan properti ke tabel dan atribut DynamoDB.

**catatan**  
Dalam atribut berikut, hanya `DynamoDBTable` dan `DynamoDBHashKey` yang diperlukan.

## Dinamo DBGlobal SecondaryIndexHashKey
<a name="w2aac17b9c21c23c37b7"></a>

Memetakan properti kelas ke kunci partisi untuk indeks sekunder global. Gunakan atribut ini jika Anda perlu `Query` indeks sekunder global.

## Dinamo DBGlobal SecondaryIndexRangeKey
<a name="w2aac17b9c21c23c37b9"></a>

Memetakan properti kelas ke kunci urutan indeks sekunder global. Gunakan atribut ini jika Anda perlu `Query` indeks sekunder global dan ingin menyempurnakan hasil menggunakan kunci urutan indeks.

## Kunci Dynamo DBHash
<a name="w2aac17b9c21c23c37c11"></a>

Memetakan properti kelas ke kunci partisi untuk kunci primer tabel. Atribut kunci primer tidak boleh berupa jenis koleksi.

Contoh kode C\$1 berikut memetakan kelas `Book` ke tabel `ProductCatalog`, dan properti `Id` ke kunci partisi kunci kunci primer tabel.

```
[DynamoDBTable("ProductCatalog")]
public class Book 
{
    [DynamoDBHashKey]
    public int Id { get; set; }

    // Additional properties go here.
}
```

## Dinamo DBIgnore
<a name="w2aac17b9c21c23c37c13"></a>

Menunjukkan bahwa properti terkait harus diabaikan. Jika tidak ingin menyimpan properti kelas, Anda dapat menambahkan atribut ini untuk meminta agar `DynamoDBContext` tidak menyertakan properti ini saat menyimpan objek ke tabel.

## Dinamo DBLocal SecondaryIndexRangeKey
<a name="w2aac17b9c21c23c37c15"></a>

Memetakan properti kelas ke kunci urutan indeks sekunder lokal. Gunakan atribut ini jika Anda perlu `Query` indeks sekunder lokal dan ingin menyempurnakan hasil menggunakan kunci urutan indeks.

## Dinamo DBProperty
<a name="w2aac17b9c21c23c37c17"></a>

Memetakan properti kelas ke atribut tabel. Jika properti kelas dipetakan ke atribut tabel dengan nama yang sama, Anda tidak perlu menentukan atribut ini. Namun, jika nama tidak sama, Anda dapat menggunakan tanda ini untuk memberikan pemetaan. Dalam pernyataan C\$1 berikut, `DynamoDBProperty` memetakan properti `BookAuthors` ke atribut `Authors` dalam tabel. 

```
[DynamoDBProperty("Authors")]
public List<string> BookAuthors { get; set; }
```

`DynamoDBContext` menggunakan informasi pemetaan ini untuk membuat atribut `Authors` saat menyimpan data objek ke tabel yang sesuai.

## Dinamo DBRenamable
<a name="w2aac17b9c21c23c37c19"></a>

Menentukan nama alternatif untuk properti kelas. Langkah ini berguna jika Anda menulis konverter khusus untuk memetakan data arbitrer ke tabel DynamoDB yang nama properti kelasnya berbeda dengan atribut tabel.

## Kunci Dynamo DBRange
<a name="w2aac17b9c21c23c37c21"></a>

Memetakan properti kelas ke kunci urutan untuk kunci primer tabel. Jika tabel memiliki kunci primer komposit (kunci partisi dan kunci urutan), Anda harus menentukan atribut `DynamoDBHashKey` dan `DynamoDBRangeKey` dalam pemetaan kelas Anda.

Misalnya, tabel sampel `Reply` memiliki kunci primer yang dibuat dari kunci partisi `Id` dan kunci urutan `Replenishment`. Contoh kode C\$1 berikut memetakan kelas `Reply` ke tabel `Reply`. Definisi kelas juga menunjukkan bahwa dua propertinya dipetakan ke kunci primer.

```
[DynamoDBTable("Reply")]
public class Reply 
{
   [DynamoDBHashKey]
   public int ThreadId { get; set; }
   [DynamoDBRangeKey]
   public string Replenishment { get; set; }
   
   // Additional properties go here.
}
```

## Dinamo DBTable
<a name="w2aac17b9c21c23c37c23"></a>

Mengidentifikasi tabel target di DynamoDB tempat kelas dipetakan. Misalnya, contoh kode C\$1 berikut memetakan kelas `Developer` ke tabel `People` di DynamoDB.

```
[DynamoDBTable("People")]
public class Developer { ...}
```

Atribut ini dapat diwariskan atau diganti.
+ Atribut `DynamoDBTable` dapat diwariskan. Dalam contoh sebelumnya, jika Anda menambahkan kelas baru, yaitu `Lead`, yang diwariskan dari kelas `Developer`, kelas tersebut juga dipetakan ke tabel `People`. Objek `Developer` dan `Lead` disimpan dalam tabel `People`.
+ Atribut `DynamoDBTable` juga dapat diganti. Dalam contoh kode C\$1 berikut, kelas `Manager` diwariskan dari kelas `Developer`. Namun, penambahan eksplisit atribut `DynamoDBTable` memetakan kelas ke tabel lainnya (`Managers`).

  ```
  [DynamoDBTable("Managers")]
  public class Manager : Developer { ...}
  ```

 Anda dapat menambahkan parameter opsional, yaitu `LowerCamelCaseProperties`, untuk meminta DynamoDB menulis huruf pertama dari nama properti dalam huruf kecil ketika menyimpan objek ke tabel, seperti yang ditunjukkan dalam contoh C\$1 berikut.

```
[DynamoDBTable("People", LowerCamelCaseProperties=true)]
public class Developer 
{
    string DeveloperName;
    ...
}
```

Ketika menyimpan instans kelas `Developer`, `DynamoDBContext` menyimpan properti `DeveloperName` sebagai `developerName`.

## Dinamo DBVersion
<a name="w2aac17b9c21c23c37c25"></a>

Mengidentifikasi properti kelas untuk menyimpan nomor versi item. Untuk informasi selengkapnya tentang penentuan versi, lihat [Penguncian optimis menggunakan DynamoDB dan model persistensi objek AWS SDK untuk .NET](DynamoDBContext.VersionSupport.md).

# DBContext Kelas Dynamo dari model persistensi objek.NET
<a name="DotNetDynamoDBContext"></a>

Kelas `DynamoDBContext` adalah titik masuk ke basis data Amazon DynamoDB. Kelas ini menyediakan koneksi ke DynamoDB dan memungkinkan Anda mengakses data dalam berbagai tabel, melakukan berbagai operasi CRUD, dan menjalankan kueri. Kelas `DynamoDBContext` menyediakan metode berikut.

**Topics**
+ [Buat MultiTable BatchGet](#w2aac17b9c21c23c39b7)
+ [Buat MultiTable BatchWrite](#w2aac17b9c21c23c39b9)
+ [CreateBatchGet](#w2aac17b9c21c23c39c11)
+ [CreateBatchWrite](#w2aac17b9c21c23c39c13)
+ [Delete](#w2aac17b9c21c23c39c15)
+ [Dispose](#w2aac17b9c21c23c39c17)
+ [ExecuteBatchGet](#w2aac17b9c21c23c39c19)
+ [ExecuteBatchWrite](#w2aac17b9c21c23c39c21)
+ [FromDocument](#w2aac17b9c21c23c39c23)
+ [FromQuery](#w2aac17b9c21c23c39c25)
+ [FromScan](#w2aac17b9c21c23c39c27)
+ [GetTargetTable](#w2aac17b9c21c23c39c29)
+ [Muat](#w2aac17b9c21c23c39c31)
+ [Kueri](#w2aac17b9c21c23c39c33)
+ [Save](#w2aac17b9c21c23c39c35)
+ [Pindai](#w2aac17b9c21c23c39c37)
+ [ToDocument](#w2aac17b9c21c23c39c39)
+ [Menentukan parameter opsional untuk Dynamo DBContext](#OptionalConfigParams)

## Buat MultiTable BatchGet
<a name="w2aac17b9c21c23c39b7"></a>

Membuat objek `MultiTableBatchGet`, yang terdiri dari beberapa objek `BatchGet` individual. Setiap objek `BatchGet` dapat digunakan untuk mengambil item dari tabel DynamoDB tunggal.

Untuk mengambil item dari tabel, gunakan metode `ExecuteBatchGet`, dengan meneruskan objek `MultiTableBatchGet` sebagai parameter.

## Buat MultiTable BatchWrite
<a name="w2aac17b9c21c23c39b9"></a>

Membuat objek `MultiTableBatchWrite`, yang terdiri dari beberapa objek `BatchWrite` individual. Setiap objek `BatchWrite` dapat digunakan untuk menulis atau menghapus item dalam tabel DynamoDB tunggal.

Untuk menulis ke tabel, gunakan metode `ExecuteBatchWrite`, dengan meneruskan objek `MultiTableBatchWrite` sebagai parameter.

## CreateBatchGet
<a name="w2aac17b9c21c23c39c11"></a>

Membuat objek `BatchGet` yang dapat Anda gunakan untuk mengambil beberapa item dari tabel. 

## CreateBatchWrite
<a name="w2aac17b9c21c23c39c13"></a>

Membuat objek `BatchWrite` yang dapat Anda gunakan untuk menempatkan beberapa item ke dalam tabel, atau untuk menghapus beberapa item dari tabel. 

## Delete
<a name="w2aac17b9c21c23c39c15"></a>

Menghapus item dari tabel. Metode ini memerlukan kunci primer dari item yang ingin Anda hapus. Anda dapat memberikan nilai kunci primer maupun objek sisi klien yang berisi nilai kunci primer sebagai parameter untuk metode ini.
+ Jika Anda menentukan objek sisi klien sebagai parameter dan Anda telah mengaktifkan penguncian optimis, penghapusan hanya akan berhasil jika versi sisi klien dan sisi server objek cocok.
+ Jika Anda hanya menetapkan nilai kunci primer sebagai parameter, penghapusan akan berhasil terlepas dari apakah Anda telah mengaktifkan penguncian optimis atau tidak.

**catatan**  
Untuk melakukan operasi ini di latar belakang, gunakan metode `DeleteAsync`.

## Dispose
<a name="w2aac17b9c21c23c39c17"></a>

Membuang semua sumber daya yang dikelola dan tidak dikelola.

## ExecuteBatchGet
<a name="w2aac17b9c21c23c39c19"></a>

Membaca data dari satu atau beberapa tabel, yang memproses semua objek `BatchGet` dalam `MultiTableBatchGet`.

**catatan**  
Untuk melakukan operasi ini di latar belakang, gunakan metode `ExecuteBatchGetAsync`.

## ExecuteBatchWrite
<a name="w2aac17b9c21c23c39c21"></a>

Menulis atau menghapus data dalam satu atau beberapa tabel, yang memproses semua objek `BatchWrite` dalam `MultiTableBatchWrite`.

**catatan**  
Untuk melakukan operasi ini di latar belakang, gunakan metode `ExecuteBatchWriteAsync`.

## FromDocument
<a name="w2aac17b9c21c23c39c23"></a>

Mengingat instans `Document`, metode `FromDocument` akan mengembalikan instans dari kelas sisi klien.

Langkah ini membantu jika Anda ingin menggunakan kelas model dokumen bersama dengan model persistensi objek untuk melakukan operasi data. Untuk informasi selengkapnya tentang kelas model dokumen yang disediakan oleh AWS SDK untuk .NET, lihat[Bekerja dengan model dokumen.NET di DynamoDB](DotNetSDKMidLevel.md).

Misalkan Anda memiliki objek `Document` bernama `doc`, yang berisi representasi item `Forum`. (Untuk mengetahui cara membuat objek ini, lihat deskripsi untuk metode `ToDocument` nanti dalam topik ini.) Anda dapat menggunakan `FromDocument` untuk mengambil item `Forum` dari `Document`, seperti yang ditunjukkan dalam contoh kode C\$1 berikut.

**Example**  

```
forum101 = context.FromDocument<Forum>(101);
```

**catatan**  
Jika objek `Document` mengimplementasikan antarmuka `IEnumerable`, Anda dapat menggunakan metode `FromDocuments` sebagai gantinya. Metode ini memungkinkan Anda melakukan iterasi pada semua instans kelas dalam `Document`.

## FromQuery
<a name="w2aac17b9c21c23c39c25"></a>

Menjalankan operasi `Query`, dengan parameter kueri yang didefinisikan dalam objek `QueryOperationConfig`.

**catatan**  
Untuk melakukan operasi ini di latar belakang, gunakan metode `FromQueryAsync`.

## FromScan
<a name="w2aac17b9c21c23c39c27"></a>

Menjalankan operasi `Scan`, dengan parameter pemindaian yang didefinisikan dalam objek `ScanOperationConfig`.

**catatan**  
Untuk melakukan operasi ini di latar belakang, gunakan metode `FromScanAsync`.

## GetTargetTable
<a name="w2aac17b9c21c23c39c29"></a>

Mengambil tabel target untuk jenis yang ditentukan. Langkah ini berguna jika Anda menulis konverter khusus untuk memetakan data arbitrer ke tabel DynamoDB, dan Anda perlu menentukan tabel yang terkait dengan jenis data khusus.

## Muat
<a name="w2aac17b9c21c23c39c31"></a>

Mengambil item dari tabel. Metode ini hanya memerlukan kunci primer dari item yang ingin Anda ambil. 

Secara default, DynamoDB akan mengembalikan item dengan nilai yang akhirnya konsisten. Untuk informasi tentang model konsistensi akhir, lihat [DynamoDB membaca konsistensi](HowItWorks.ReadConsistency.md).

`Load`atau `LoadAsync` metode memanggil [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)operasi, yang mengharuskan Anda untuk menentukan kunci utama untuk tabel. Karena `GetItem` mengabaikan `IndexName` parameter, Anda tidak dapat memuat item menggunakan partisi indeks atau kunci sortir. Oleh karena itu, Anda harus menggunakan kunci utama tabel untuk memuat item.

**catatan**  
Untuk melakukan operasi ini di latar belakang, gunakan metode `LoadAsync`. Untuk melihat contoh penggunaan `LoadAsync` metode untuk melakukan operasi CRUD tingkat tinggi pada tabel DynamoDB, lihat contoh berikut.

```
    /// <summary>
    /// Shows how to perform high-level CRUD operations on an Amazon DynamoDB
    /// table.
    /// </summary>
    public class HighLevelItemCrud
    {
        public static async Task Main()
        {
            var client = new AmazonDynamoDBClient();
            DynamoDBContext context = new DynamoDBContext(client);
            await PerformCRUDOperations(context);
        }

        public static async Task PerformCRUDOperations(IDynamoDBContext context)
        {
            int bookId = 1001; // Some unique value.
            Book myBook = new Book
            {
                Id = bookId,
                Title = "object persistence-AWS SDK for.NET SDK-Book 1001",
                Isbn = "111-1111111001",
                BookAuthors = new List<string> { "Author 1", "Author 2" },
            };

            // Save the book to the ProductCatalog table.
            await context.SaveAsync(myBook);

            // Retrieve the book from the ProductCatalog table.
            Book bookRetrieved = await context.LoadAsync<Book>(bookId);

            // Update some properties.
            bookRetrieved.Isbn = "222-2222221001";

            // Update existing authors list with the following values.
            bookRetrieved.BookAuthors = new List<string> { " Author 1", "Author x" };
            await context.SaveAsync(bookRetrieved);

            // Retrieve the updated book. This time, add the optional
            // ConsistentRead parameter using DynamoDBContextConfig object.
            await context.LoadAsync<Book>(bookId, new DynamoDBContextConfig
            {
                ConsistentRead = true,
            });

            // Delete the book.
            await context.DeleteAsync<Book>(bookId);

            // Try to retrieve deleted book. It should return null.
            Book deletedBook = await context.LoadAsync<Book>(bookId, new DynamoDBContextConfig
            {
                ConsistentRead = true,
            });

            if (deletedBook == null)
            {
                Console.WriteLine("Book is deleted");
            }
        }
    }
```

## Kueri
<a name="w2aac17b9c21c23c39c33"></a>

Mengkueri tabel berdasarkan parameter kueri yang Anda berikan.

Anda dapat mengkueri tabel hanya jika memiliki kunci primer komposit (kunci partisi dan kunci urutan). Saat mengkueri, Anda harus menentukan kunci partisi dan syarat yang berlaku untuk kunci urutan.

Katakanlah Anda memiliki kelas `Reply` sisi klien yang dipetakan ke tabel `Reply` di DynamoDB. Contoh kode C\$1 berikut mengkueri tabel `Reply` untuk menemukan balasan utas dalam forum yang diposting dalam 15 hari terakhir. Tabel `Reply` memiliki kunci primer yang berisi kunci partisi `Id` dan kunci urutan `ReplyDateTime`.

**Example**  

```
DynamoDBContext context = new DynamoDBContext(client);

string replyId = "DynamoDB#DynamoDB Thread 1"; //Partition key
DateTime twoWeeksAgoDate = DateTime.UtcNow.Subtract(new TimeSpan(14, 0, 0, 0)); // Date to compare.
IEnumerable<Reply> latestReplies = context.Query<Reply>(replyId, QueryOperator.GreaterThan, twoWeeksAgoDate);
```

Tabel ini mengembalikan koleksi objek `Reply`. 

Metode `Query` mengembalikan koleksi `IEnumerable` “lazy-loaded”. Metode ini awalnya hanya mengembalikan satu halaman hasil, lalu membuat panggilan layanan untuk halaman berikutnya jika diperlukan. Untuk mendapatkan semua item yang cocok, Anda perlu melakukan iterasi hanya pada `IEnumerable`.

Jika tabel Anda memiliki kunci primer sederhana (kunci partisi), Anda tidak dapat menggunakan metode `Query`. Sebaliknya, Anda dapat menggunakan metode `Load` dan menyediakan kunci partisi untuk mengambil item.

**catatan**  
Untuk melakukan operasi ini di latar belakang, gunakan metode `QueryAsync`.

## Save
<a name="w2aac17b9c21c23c39c35"></a>

Menyimpan objek tertentu ke tabel. Jika kunci primer yang ditentukan dalam objek input tidak ada dalam tabel, metode akan menambahkan item baru ke tabel. Jika kunci primer ada, metode akan memperbarui item yang ada.

Jika Anda mengonfigurasi penguncian optimis, pembaruan hanya akan berhasil jika versi klien dan sisi server item cocok. Untuk informasi selengkapnya, lihat [Penguncian optimis menggunakan DynamoDB dan model persistensi objek AWS SDK untuk .NET](DynamoDBContext.VersionSupport.md).

**catatan**  
Untuk melakukan operasi ini di latar belakang, gunakan metode `SaveAsync`.

## Pindai
<a name="w2aac17b9c21c23c39c37"></a>

Melakukan pemindaian pada seluruh tabel. 

Anda dapat memfilter hasil pemindaian dengan menentukan syarat pemindaian. Syarat ini dapat dievaluasi pada setiap atribut dalam tabel. Katakanlah Anda memiliki kelas sisi klien `Book` yang dipetakan ke tabel `ProductCatalog` di DynamoDB. Contoh C\$1 berikut memindai tabel dan hanya mengembalikan item buku dengan harga kurang dari 0.

**Example**  

```
IEnumerable<Book> itemsWithWrongPrice = context.Scan<Book>(
                    new ScanCondition("Price", ScanOperator.LessThan, price),
                    new ScanCondition("ProductCategory", ScanOperator.Equal, "Book")
      );
```

Metode `Scan` mengembalikan koleksi `IEnumerable` “lazy-loaded”. Metode ini awalnya hanya mengembalikan satu halaman hasil, lalu membuat panggilan layanan untuk halaman berikutnya jika diperlukan. Untuk mendapatkan semua item yang cocok, Anda hanya perlu melakukan iterasi pada `IEnumerable`.

Untuk alasan performa, Anda harus mencari tabel dan menghindari pemindaian tabel.

**catatan**  
Untuk melakukan operasi ini di latar belakang, gunakan metode `ScanAsync`.

## ToDocument
<a name="w2aac17b9c21c23c39c39"></a>

Mengembalikan instans untuk kelas model dokumen `Document` dari instans kelas Anda. 

Langkah ini membantu jika Anda ingin menggunakan kelas model dokumen bersama dengan model persistensi objek untuk melakukan operasi data. Untuk informasi selengkapnya tentang kelas model dokumen yang disediakan oleh AWS SDK untuk .NET, lihat[Bekerja dengan model dokumen.NET di DynamoDB](DotNetSDKMidLevel.md). 

Misalkan Anda memiliki kelas sisi klien yang dipetakan ke tabel `Forum` sampel. Anda kemudian dapat menggunakan `DynamoDBContext` untuk mendapatkan item sebagai objek `Document` dari tabel `Forum`, seperti yang ditunjukkan dalam contoh kode C\$1 berikut.

**Example**  

```
DynamoDBContext context = new DynamoDBContext(client);

Forum forum101 = context.Load<Forum>(101); // Retrieve a forum by primary key.
Document doc = context.ToDocument<Forum>(forum101);
```

## Menentukan parameter opsional untuk Dynamo DBContext
<a name="OptionalConfigParams"></a>

Saat menggunakan model persistensi objek, Anda dapat menentukan parameter opsional berikut untuk `DynamoDBContext`.
+ **`ConsistentRead`—**Saat mengambil data menggunakan operasi `Load`, `Query`, atau `Scan`, Anda dapat menambahkan parameter opsional ini guna meminta nilai data terbaru.
+ **`IgnoreNullValues`—**Parameter ini memberi tahu `DynamoDBContext` untuk mengabaikan nilai null pada atribut selama operasi `Save`. Jika parameter ini adalah false (atau jika tidak diatur), nilai null ditafsirkan sebagai direktif untuk menghapus atribut tertentu. 
+ **`SkipVersionCheck`—** Parameter ini memberi tahu `DynamoDBContext` untuk tidak membandingkan versi saat menyimpan atau menghapus item. Untuk informasi selengkapnya tentang penentuan versi, lihat [Penguncian optimis menggunakan DynamoDB dan model persistensi objek AWS SDK untuk .NET](DynamoDBContext.VersionSupport.md).
+ **`TableNamePrefix`—** Memberikan prefiks pada semua nama tabel dengan string tertentu. Jika parameter ini adalah null (atau jika tidak diatur), tidak ada prefiks yang digunakan.
+ `DynamoDBEntryConversion`- Menentukan skema konversi yang digunakan oleh klien. Anda dapat mengatur parameter ini ke versi V1 atau V2. V1 adalah versi default.

  Berdasarkan versi yang Anda tetapkan, perilaku parameter ini berubah. Contoh:
  + Di V1, tipe `bool` data dikonversi ke tipe `N` angka, di mana 0 mewakili false dan 1 mewakili true. Dalam V2, `bool` dikonversi ke`BOOL`.
  + Di V2, daftar dan array tidak dikelompokkan bersama. HashSets Daftar dan array numerik, tipe berbasis string, dan tipe berbasis biner dikonversi ke tipe `L` (Daftar), yang dapat dikirim kosong untuk memperbarui daftar. Ini tidak seperti V1, di mana daftar kosong tidak dikirim melalui kabel.

    Di V1, jenis koleksi, seperti Daftar, HashSet, dan array diperlakukan sama. Daftar, HashSet, dan array numerik dikonversi ke tipe `NS` (jumlah set). 

  Contoh berikut menetapkan versi skema konversi ke V2, yang mengubah perilaku konversi antara tipe.NET dan tipe data DynamoDB.

  ```
  var config = new DynamoDBContextConfig
  {
      Conversion = DynamoDBEntryConversion.V2
  };
  var contextV2 = new DynamoDBContext(client, config);
  ```

Contoh C \$1 berikut membuat yang baru `DynamoDBContext` dengan menentukan dua parameter opsional sebelumnya, dan. `ConsistentRead` `SkipVersionCheck`

**Example**  

```
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
...
DynamoDBContext context =
       new DynamoDBContext(client, new DynamoDBContextConfig { ConsistentRead = true, SkipVersionCheck = true});
```

`DynamoDBContext` menyertakan parameter opsional ini dengan setiap permintaan yang Anda kirimkan menggunakan konteks ini. 

Alih-alih mengatur parameter ini di tingkat `DynamoDBContext`, Anda dapat menentukannya untuk setiap operasi yang Anda jalankan menggunakan `DynamoDBContext`, seperti yang ditunjukkan dalam contoh kode C\$1 berikut. Contoh ini memuat item buku tertentu. `Load`Metode `DynamoDBContext` menentukan `ConsistentRead` dan parameter `SkipVersionCheck` opsional.

**Example**  

```
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
...
DynamoDBContext context = new DynamoDBContext(client);
Book bookItem = context.Load<Book>(productId,new DynamoDBContextConfig{ ConsistentRead = true, SkipVersionCheck = true });
```

Dalam kasus ini, `DynamoDBContext` menyertakan parameter tersebut hanya ketika mengirimkan permintaan `Get`.

# Penguncian optimis menggunakan DynamoDB dan model persistensi objek AWS SDK untuk .NET
<a name="DynamoDBContext.VersionSupport"></a>

Dukungan penguncian optimis dalam model persistensi objek memastikan bahwa versi item untuk aplikasi Anda sama dengan versi item di sisi server sebelum memperbarui atau menghapus item. Misalkan Anda mengambil item untuk pembaruan. Namun, sebelum Anda mengirimkan pembaruan Anda kembali, beberapa aplikasi lain memperbarui item yang sama. Sekarang aplikasi Anda memiliki salinan item yang sudah usang. Tanpa penguncian optimis, setiap pembaruan yang Anda lakukan akan menimpa pembaruan yang dibuat oleh aplikasi lain. 

Fitur penguncian optimis model persistensi objek menyediakan tanda `DynamoDBVersion` yang dapat Anda gunakan untuk mengaktifkan penguncian optimis. Untuk menggunakan fitur ini, Anda menambahkan properti ke kelas Anda untuk menyimpan nomor versi. Anda menambahkan atribut `DynamoDBVersion` untuk properti. Ketika Anda pertama kali menyimpan objek, `DynamoDBContext` menetapkan nomor versi dan menambah nilai ini setiap kali Anda memperbarui item. 

Permintaan perbarui atau hapus Anda akan berhasil hanya jika versi objek sisi kliennya cocok dengan nomor versi item yang sesuai di sisi server. Jika aplikasi Anda memiliki salinan yang sudah usang, aplikasi tersebut harus mendapatkan versi terbaru dari server sebelum dapat memperbarui atau menghapus item.

Contoh kode C\$1 berikut mendefinisikan kelas `Book` dengan atribut persistensi objek yang memetakannya ke tabel `ProductCatalog`. Properti `VersionNumber` di kelas yang dilengkapi dengan atribut `DynamoDBVersion` menyimpan nilai nomor versi.

**Example**  

```
[DynamoDBTable("ProductCatalog")]
  public class Book
  {
    [DynamoDBHashKey]   //Partition key
    public int Id { get; set; }
    [DynamoDBProperty]
    public string Title { get; set; }
    [DynamoDBProperty]
    public string ISBN { get; set; }
    [DynamoDBProperty("Authors")]
    public List<string> BookAuthors { get; set; }
    [DynamoDBVersion]
    public int? VersionNumber { get; set; }
  }
```

**catatan**  
Anda dapat menerapkan atribut `DynamoDBVersion` hanya untuk jenis primitif numerik yang dapat di-null-kan (seperti `int?`). 

Penguncian optimis memiliki dampak berikut terhadap operasi `DynamoDBContext`:
+ Untuk item baru, `DynamoDBContext` menetapkan nomor versi awal 0. Jika Anda mengambil item yang ada, memperbarui satu atau beberapa properti, dan mencoba untuk menyimpan perubahan, operasi simpan hanya akan berhasil jika nomor versi di sisi klien dan sisi server cocok. `DynamoDBContext` menambahkan nomor versi. Anda tidak perlu mengatur nomor versi.
+ Metode `Delete` menyediakan beban berlebih yang dapat mengambil nilai kunci primer atau objek sebagai parameter, seperti yang ditunjukkan dalam contoh kode C\$1 berikut.  
**Example**  

  ```
  DynamoDBContext context = new DynamoDBContext(client);
  ...
  // Load a book.
  Book book = context.Load<ProductCatalog>(111);
  // Do other operations.
  // Delete 1 - Pass in the book object.
  context.Delete<ProductCatalog>(book);
  
  // Delete 2 - Pass in the Id (primary key)
  context.Delete<ProductCatalog>(222);
  ```

  Jika Anda menyediakan objek sebagai parameter, penghapusan berhasil hanya jika versi objek cocok dengan versi item sisi server yang sesuai. Namun, jika Anda memberikan nilai kunci primer sebagai parameter, `DynamoDBContext` tidak mengenali nomor versi apa pun, dan menghapus item tanpa melakukan pemeriksaan versi. 

  Perhatikan bahwa implementasi internal penguncian optimis dalam kode model persistensi objek menggunakan tindakan API pembaruan bersyarat dan penghapusan bersyarat di DynamoDB.

## Menonaktifkan penguncian optimis
<a name="DotNetDynamoDBContext.DisablingOptimisticLocking"></a>

Untuk menonaktifkan penguncian optimis, gunakan properti konfigurasi `SkipVersionCheck`. Anda dapat mengatur properti ini saat membuat `DynamoDBContext`. Dalam kasus ini, penguncian optimis dinonaktifkan untuk permintaan apa pun yang Anda buat menggunakan konteks. Untuk informasi selengkapnya, lihat [Menentukan parameter opsional untuk Dynamo DBContext](DotNetDynamoDBContext.md#OptionalConfigParams). 

Alih-alih menetapkan properti pada tingkat konteks, Anda dapat menonaktifkan penguncian optimis untuk operasi tertentu, seperti yang ditunjukkan dalam contoh kode C\$1 berikut. Contoh ini menggunakan konteks untuk menghapus item buku. Metode `Delete` menetapkan properti `SkipVersionCheck` opsional ke true, menonaktifkan pemeriksaan penentuan versi.

**Example**  

```
DynamoDBContext context = new DynamoDBContext(client);
// Load a book.
Book book = context.Load<ProductCatalog>(111);
...
// Delete the book.
context.Delete<Book>(book, new DynamoDBContextConfig { SkipVersionCheck = true });
```

# Memetakan data arbitrer dengan DynamoDB menggunakan model persistensi objek AWS SDK untuk .NET
<a name="DynamoDBContext.ArbitraryDataMapping"></a>

Selain jenis .NET yang didukung (lihat [Jenis data yang didukung](DotNetSDKHighLevel.md#DotNetDynamoDBContext.SupportedTypes)), Anda dapat menggunakan jenis di aplikasi Anda yang tidak memiliki pemetaan langsung ke jenis Amazon DynamoDB. Model persistensi objek mendukung jenis penyimpanan data arbitrer selama Anda memberikan konverter untuk mengonversi data dari jenis arbitrer untuk jenis DynamoDB dan sebaliknya. Kode konverter mengubah data saat menyimpan dan memuat objek.

Anda dapat membuat jenis apa pun di sisi klien. Namun, data yang disimpan di tabel adalah salah satu jenis DynamoDB, dan selama kueri dan pemindaian, perbandingan data apa pun yang dibuat didasarkan pada data yang disimpan di DynamoDB.

Contoh kode C\$1 berikut mendefinisikan kelas `Book` dengan properti `Id`, `Title`, `ISBN`, dan `Dimension`. Properti `Dimension` adalah bagian dari `DimensionType` yang mendeskripsikan properti `Height`, `Width`, dan `Thickness`. Contoh kode ini menyediakan metode konverter `ToEntry` dan `FromEntry` untuk mengonversi data antara jenis string `DimensionType` dan DynamoDB. Misalnya, saat menyimpan instans `Book`, konverter membuat sebuah string `Dimension` buku seperti “8.5x11x.05". Saat Anda mengambil buku, konverter akan mengonversi string tersebut menjadi instans `DimensionType`.

Contoh ini memetakan jenis `Book` ke tabel `ProductCatalog`. Ini menyimpan instans `Book` sampel, mengambilnya, memperbarui dimensinya, dan menyimpan `Book` yang terbaru lagi.



Untuk step-by-step instruksi untuk menguji contoh berikut, lihat[Contoh kode .NET](CodeSamples.DotNet.md).

**Example**  

```
using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;
using Amazon.DynamoDBv2.DocumentModel;
using Amazon.Runtime;
using Amazon.SecurityToken;

namespace com.amazonaws.codesamples
{
    class HighLevelMappingArbitraryData
    {
        private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();

        static void Main(string[] args)
        {
            try
            {
                DynamoDBContext context = new DynamoDBContext(client);

                // 1. Create a book.
                DimensionType myBookDimensions = new DimensionType()
                {
                    Length = 8M,
                    Height = 11M,
                    Thickness = 0.5M
                };

                Book myBook = new Book
                {
                    Id = 501,
                    Title = "AWS SDK for .NET Object Persistence Model Handling Arbitrary Data",
                    ISBN = "999-9999999999",
                    BookAuthors = new List<string> { "Author 1", "Author 2" },
                    Dimensions = myBookDimensions
                };

                context.Save(myBook);

                // 2. Retrieve the book.
                Book bookRetrieved = context.Load<Book>(501);

                // 3. Update property (book dimensions).
                bookRetrieved.Dimensions.Height += 1;
                bookRetrieved.Dimensions.Length += 1;
                bookRetrieved.Dimensions.Thickness += 0.2M;
                // Update the book.
                context.Save(bookRetrieved);

                Console.WriteLine("To continue, press Enter");
                Console.ReadLine();
            }
            catch (AmazonDynamoDBException e) { Console.WriteLine(e.Message); }
            catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
            catch (Exception e) { Console.WriteLine(e.Message); }
        }
    }
    [DynamoDBTable("ProductCatalog")]
    public class Book
    {
        [DynamoDBHashKey] //Partition key
        public int Id
        {
            get; set;
        }
        [DynamoDBProperty]
        public string Title
        {
            get; set;
        }
        [DynamoDBProperty]
        public string ISBN
        {
            get; set;
        }
        // Multi-valued (set type) attribute.
        [DynamoDBProperty("Authors")]
        public List<string> BookAuthors
        {
            get; set;
        }
        // Arbitrary type, with a converter to map it to DynamoDB type.
        [DynamoDBProperty(typeof(DimensionTypeConverter))]
        public DimensionType Dimensions
        {
            get; set;
        }
    }

    public class DimensionType
    {
        public decimal Length
        {
            get; set;
        }
        public decimal Height
        {
            get; set;
        }
        public decimal Thickness
        {
            get; set;
        }
    }

    // Converts the complex type DimensionType to string and vice-versa.
    public class DimensionTypeConverter : IPropertyConverter
    {
        public DynamoDBEntry ToEntry(object value)
        {
            DimensionType bookDimensions = value as DimensionType;
            if (bookDimensions == null) throw new ArgumentOutOfRangeException();

            string data = string.Format("{1}{0}{2}{0}{3}", " x ",
                            bookDimensions.Length, bookDimensions.Height, bookDimensions.Thickness);

            DynamoDBEntry entry = new Primitive
            {
                Value = data
            };
            return entry;
        }

        public object FromEntry(DynamoDBEntry entry)
        {
            Primitive primitive = entry as Primitive;
            if (primitive == null || !(primitive.Value is String) || string.IsNullOrEmpty((string)primitive.Value))
                throw new ArgumentOutOfRangeException();

            string[] data = ((string)(primitive.Value)).Split(new string[] { " x " }, StringSplitOptions.None);
            if (data.Length != 3) throw new ArgumentOutOfRangeException();

            DimensionType complexData = new DimensionType
            {
                Length = Convert.ToDecimal(data[0]),
                Height = Convert.ToDecimal(data[1]),
                Thickness = Convert.ToDecimal(data[2])
            };
            return complexData;
        }
    }
}
```

# Menjalankan contoh kode dalam Panduan Developer ini
<a name="CodeSamples"></a>

 AWS SDKs Memberikan dukungan luas untuk Amazon DynamoDB dalam bahasa berikut:
+ [ Java](https://aws.amazon.com/sdk-for-java)
+ [JavaScript di browser](https://aws.amazon.com/sdk-for-browser)
+ [.NET](https://aws.amazon.com/sdk-for-net)
+ [Node.js](https://aws.amazon.com/sdk-for-node-js)
+ [PHP](https://aws.amazon.com/sdk-for-php)
+ [Python](https://aws.amazon.com/sdk-for-python)
+ [Ruby](https://aws.amazon.com/sdk-for-ruby)
+ [C\$1\$1](https://aws.amazon.com/sdk-for-cpp)
+ [Go](https://aws.amazon.com/sdk-for-go)
+ [Android](https://aws.amazon.com/mobile/sdk/)
+ [iOS](https://aws.amazon.com/mobile/sdk/)

Contoh kode dalam panduan developer ini menyediakan cakupan yang lebih mendalam tentang operasi DynamoDB, menggunakan bahasa pemrograman berikut:
+ [Contoh kode Java](CodeSamples.Java.md)
+ [Contoh kode .NET](CodeSamples.DotNet.md)

Sebelum Anda dapat memulai dengan latihan ini, Anda perlu membuat AWS akun, mendapatkan kunci akses dan kunci rahasia, dan mengatur AWS Command Line Interface (AWS CLI) di komputer Anda. Untuk informasi selengkapnya, lihat [Menyiapkan DynamoDB (layanan web)](SettingUp.DynamoWebService.md).

**catatan**  
Jika Anda menggunakan versi DynamoDB yang dapat diunduh, Anda perlu menggunakan untuk membuat tabel AWS CLI dan data sampel. Anda juga perlu menentukan `--endpoint-url` parameter dengan setiap AWS CLI perintah. Untuk informasi selengkapnya, lihat [Mengatur Titik Akhir Lokal](DynamoDBLocal.UsageNotes.md#DynamoDBLocal.Endpoint).

# Membuat tabel dan memuat data untuk contoh kode di DynamoDB
<a name="SampleData"></a>

Lihat di bawah untuk dasar-dasar membuat tabel di DynamoDB, memuat sampel set data, membuat kueri data, dan memperbarui data.
+ [Langkah 1: Buat tabel di DynamoDB](getting-started-step-1.md)
+ [Langkah 2: Menulis data ke tabel DynamoDB](getting-started-step-2.md)
+ [Langkah 3: Baca data dari tabel DynamoDB](getting-started-step-3.md)
+ [Langkah 4: Perbarui data dalam tabel DynamoDB](getting-started-step-4.md)

# Contoh kode Java
<a name="CodeSamples.Java"></a>

**Topics**
+ [Java: Mengatur AWS kredensil Anda](#CodeSamples.Java.Credentials)
+ [Java: Mengatur AWS Wilayah dan titik akhir](#CodeSamples.Java.RegionAndEndpoint)

Panduan Pengembang ini berisi cuplikan kode Java dan ready-to-run program. Anda dapat menemukan contoh kode ini di bagian berikut:
+ [Bekerja dengan item dan atribut di DynamoDB](WorkingWithItems.md)
+ [Bekerja dengan tabel dan data di DynamoDB](WorkingWithTables.md)
+ [Menanyakan tabel di DynamoDB](Query.md)
+ [Memindai tabel di DynamoDB](Scan.md)
+ [Meningkatkan akses data dengan indeks sekunder di DynamoDB](SecondaryIndexes.md)
+ [Java 1.x: Dinamo DBMapper](DynamoDBMapper.md)
+ [Tangkapan data perubahan DynamoDB Streams](Streams.md)

Anda dapat memulai dengan cepat menggunakan Eclipse dengan [AWS Toolkit for Eclipse](https://aws.amazon.com/eclipse/). Selain IDE berfitur lengkap, Anda juga mendapatkan pembaruan otomatis, dan templat AWS SDK untuk Java yang telah dikonfigurasi sebelumnya untuk membangun AWS aplikasi.

**Untuk menjalankan contoh kode Java (menggunakan Eclipse)**

1. Unduh dan instal IDE [Eclipse](http://www.eclipse.org).

1. Unduh dan instal [AWS Toolkit for Eclipse](https://aws.amazon.com/eclipse/).

1. Mulai Eclipse, dan pada menu **Eclipse**, pilih **File**, **Baru**, lalu **Lainnya**.

1. Di **Pilih wizard**, pilih **AWS**, pilih **Proyek Java AWS **, lalu pilih **Selanjutnya**.

1. Di **Create an AWS Java**, lakukan hal berikut:

   1. Dalam **Nama proyek**, masukkan nama untuk proyek Anda.

   1. Di **Pilih Akun**, pilih profil kredensial Anda dari daftar.

      Jika ini adalah pertama kalinya Anda menggunakan [AWS Toolkit for Eclipse](https://aws.amazon.com/eclipse/), pilih **Konfigurasi AWS Akun** untuk menyiapkan AWS kredensil Anda.

1. Pilih **Selesai** untuk membuat proyek.

1. Dari menu **Eclipse**, pilih **File**, **Baru**, kemudian **Kelas**.

1. Dalam **Kelas Java**, masukkan nama untuk kelas Anda di **Nama** (menggunakan nama yang sama sebagai contoh kode yang ingin Anda jalankan), lalu pilih **Selesai** untuk membuat kelas.

1. Salin contoh kode dari halaman dokumentasi ke editor Eclipse.

1. Untuk menjalankan kode, pilih **Jalankan** pada menu Eclipse.

SDK untuk Java menyediakan klien thread-safe untuk bekerja dengan DynamoDB. Sebagai praktik terbaik, aplikasi Anda harus membuat satu klien dan menggunakan kembali klien di antara thread.

Untuk informasi selengkapnya, lihat [AWS SDK untuk Java](https://aws.amazon.com/sdk-for-java).

**catatan**  
Contoh kode dalam panduan ini dimaksudkan untuk digunakan dengan versi terbaru dari AWS SDK untuk Java.  
Jika Anda menggunakan AWS Toolkit for Eclipse, Anda dapat mengonfigurasi pembaruan otomatis untuk SDK for Java. Untuk melakukan ini di Eclipse, buka **Preferensi** dan pilih **AWS Toolkit**, **AWS SDK untuk Java**, **Unduh baru SDKs ** secara otomatis.

## Java: Mengatur AWS kredensil Anda
<a name="CodeSamples.Java.Credentials"></a>

SDK for Java mengharuskan Anda AWS memberikan kredensi ke aplikasi Anda saat runtime. *Contoh kode dalam panduan ini mengasumsikan bahwa Anda menggunakan file AWS kredensial, seperti yang dijelaskan dalam [Mengatur AWS kredensil Anda](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/set-up-creds.html) di Panduan Pengembang.AWS SDK untuk Java *

Berikut ini adalah contoh file AWS kredensial bernama`~/.aws/credentials`, di mana karakter tilde (`~`) mewakili direktori home Anda.

```
[default]
aws_access_key_id = AWS access key ID goes here
aws_secret_access_key = Secret key goes here
```

## Java: Mengatur AWS Wilayah dan titik akhir
<a name="CodeSamples.Java.RegionAndEndpoint"></a>

Secara default, contoh kode mengakses DynamoDB di Wilayah AS Barat (Oregon). Anda dapat mengubah Wilayah dengan memodifikasi properti `AmazonDynamoDB`.

Contoh kode berikut menginstansiasi `AmazonDynamoDB` baru.

```
import software.amazon.dynamodb.AmazonDynamoDBClientBuilder;
import com.amazonaws.regions.Regions;
...
// This client will default to US West (Oregon)
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withRegion(Regions.US_WEST_2)
.build();
```

Anda dapat menggunakan metode `withRegion` untuk menjalankan kode Anda terhadap DynamoDB di Wilayah ketersediaan mana pun. Untuk daftar lengkap, lihat [wilayah dan titik akhir AWS](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region) di *Referensi Umum Amazon Web Services*.

Jika Anda ingin menjalankan contoh kode menggunakan DynamoDB secara lokal pada komputer Anda, atur titik akhir sebagai berikut.

### AWS SDK V1
<a name="CodeSamples.Java.RegionAndEndpoint.V1"></a>

```
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();
```

### AWS SDK V2
<a name="CodeSamples.Java.RegionAndEndpoint.V2"></a>

```
DynamoDbClient client = DynamoDbClient.builder()
    .endpointOverride(URI.create("http://localhost:8000"))
    // The region is meaningless for local DynamoDb but required for client builder validation
    .region(Region.US_EAST_1)
    .credentialsProvider(StaticCredentialsProvider.create(
    AwsBasicCredentials.create("dummy-key", "dummy-secret")))
    .build();
```

# Contoh kode .NET
<a name="CodeSamples.DotNet"></a>

**Topics**
+ [.NET: Mengatur AWS kredensil Anda](#CodeSamples.DotNet.Credentials)
+ [.NET: Mengatur AWS Wilayah dan titik akhir](#CodeSamples.DotNet.RegionAndEndpoint)

Panduan ini berisi potongan kode .NET dan ready-to-run program. Anda dapat menemukan contoh kode ini di bagian berikut:
+ [Bekerja dengan item dan atribut di DynamoDB](WorkingWithItems.md)
+ [Bekerja dengan tabel dan data di DynamoDB](WorkingWithTables.md)
+ [Menanyakan tabel di DynamoDB](Query.md)
+ [Memindai tabel di DynamoDB](Scan.md)
+ [Meningkatkan akses data dengan indeks sekunder di DynamoDB](SecondaryIndexes.md)
+ [Bekerja dengan model dokumen.NET di DynamoDB](DotNetSDKMidLevel.md)
+ [Bekerja dengan model persistensi objek.NET dan DynamoDB](DotNetSDKHighLevel.md)
+ [Tangkapan data perubahan DynamoDB Streams](Streams.md)

Anda dapat memulai dengan cepat dengan menggunakan Toolkit for Visual Studio. AWS SDK untuk .NET 

**Untuk menjalankan contoh kode .NET (menggunakan Visual Studio)**

1. Unduh dan instal [Microsoft Visual Studio](https://www.visualstudio.com).

1. (Opsional) Unduh dan instal [Toolkit for Visual Studio](https://aws.amazon.com/visualstudio/).

1. Siapkan AWS kredensil Anda. Konfigurasikan profil kredensial di file AWS kredensial bersama Anda (). `~/.aws/credentials` Untuk informasi selengkapnya, lihat [Mengonfigurasi kredensial AWS](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html) di *Panduan Developer AWS SDK untuk .NET *.

1. Mulai Visual Studio. Pilih **File**, **Baru**, **Proyek**.

1. Cari **Aplikasi Konsol**, pilih templat C\$1 yang menargetkan .NET, lalu pilih **Berikutnya**. Konfigurasikan nama dan lokasi proyek Anda, lalu pilih **Buat**.

1. Tambahkan paket AWS SDK for NuGet DynamoDB ke project Anda:

   1. Di Solution Explorer, buka menu konteks (klik kanan) untuk proyek Anda, lalu pilih **Kelola NuGet Paket**.

   1. Di NuGet Package Manager, pilih **Browse**.

   1. Di kotak pencarian, masukkan **AWSSDK.DynamoDBv2**, lalu tunggu hingga pencarian selesai.

   1. **Pilih **AWSSDK.Dynamo DBv2**, dan kemudian pilih Install.**

1. Dalam proyek Visual Studio Anda, buka`Program.cs`. Ganti konten dengan contoh kode dari halaman dokumentasi yang ingin Anda jalankan.

1. Untuk menjalankan kode, pilih **Mulai** di toolbar Visual Studio.

 SDK untuk .NET Ini menyediakan klien thread-safe untuk bekerja dengan DynamoDB. Sebagai praktik terbaik, aplikasi Anda harus membuat satu klien dan menggunakan kembali klien di antara thread.

Untuk informasi selengkapnya, lihat [AWS SDK untuk .NET](https://aws.amazon.com/sdk-for-net).

**catatan**  
Contoh kode dalam panduan ini dimaksudkan untuk digunakan dengan versi terbaru dari AWS SDK untuk .NET.

## .NET: Mengatur AWS kredensil Anda
<a name="CodeSamples.DotNet.Credentials"></a>

Ini SDK untuk .NET mengharuskan Anda memberikan AWS kredensil ke aplikasi Anda saat runtime. *Contoh kode dalam panduan ini mengasumsikan bahwa Anda menggunakan SDK Store untuk mengelola file AWS kredensional Anda, seperti yang dijelaskan dalam [Menggunakan penyimpanan SDK di Panduan Pengembang](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html#sdk-store).AWS SDK untuk .NET *

Toolkit for Visual Studio mendukung beberapa set kredensial dari sejumlah akun. Setiap set disebut sebagai *profil*. Visual Studio menambahkan entri ke `App.config` file proyek sehingga aplikasi Anda dapat menemukan AWS kredensialnya saat runtime.

Contoh berikut menunjukkan file `App.config` default yang dihasilkan ketika Anda membuat proyek baru menggunakan Toolkit for Visual Studio.

```
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
    <add key="AWSProfileName" value="default"/>
    <add key="AWSRegion" value="us-west-2" />
 </appSettings>
</configuration>
```

Saat runtime, program menggunakan `default` set AWS kredensil, seperti yang ditentukan oleh entri. `AWSProfileName` AWS Kredensialnya sendiri disimpan di SDK Store dalam bentuk terenkripsi. Toolkit for Visual Studio menyediakan antarmuka pengguna grafis untuk mengelola kredensial Anda, semua dari dalam Visual Studio. Untuk informasi selengkapnya, lihat [Menentukan kredensial](https://docs.aws.amazon.com/AWSToolkitVS/latest/UserGuide/tkv_setup.html#creds) dalam *Panduan Pengguna AWS Toolkit for Visual Studio *.

**catatan**  
Secara default, contoh kode mengakses DynamoDB di Wilayah AS Barat (Oregon). Anda dapat mengubah Wilayah dengan memodifikasi entri `AWSRegion` dalam file App.config. Anda dapat mengatur `AWSRegion` ke Wilayah mana pun tempat DynamoDB tersedia. Untuk daftar lengkap, lihat [wilayah dan titik akhir AWS](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region) di *Referensi Umum Amazon Web Services*.

## .NET: Mengatur AWS Wilayah dan titik akhir
<a name="CodeSamples.DotNet.RegionAndEndpoint"></a>

Secara default, contoh kode mengakses DynamoDB di Wilayah AS Barat (Oregon). Anda dapat mengubah Wilayah dengan memodifikasi entri `AWSRegion` dalam file `App.config`. Atau, Anda dapat mengubah Wilayah dengan memodifikasi properti `AmazonDynamoDBClient`.

Contoh kode berikut menginstansiasi `AmazonDynamoDBClient` baru. Klien dimodifikasi sehingga kode berjalan terhadap DynamoDB di Wilayah yang berbeda.

```
AmazonDynamoDBConfig clientConfig = new AmazonDynamoDBConfig();
// This client will access the US East 1 region.
clientConfig.RegionEndpoint = RegionEndpoint.USEast1;
AmazonDynamoDBClient client = new AmazonDynamoDBClient(clientConfig);
```

Untuk daftar lengkap Wilayah, lihat [wilayah dan titik akhir AWS](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region) di *Referensi Umum Amazon Web Services*.

Jika Anda ingin menjalankan contoh kode menggunakan DynamoDB secara lokal pada komputer Anda, atur titik akhir sebagai berikut.

```
AmazonDynamoDBConfig clientConfig = new AmazonDynamoDBConfig();
// Set the endpoint URL
clientConfig.ServiceURL = "http://localhost:8000";
AmazonDynamoDBClient client = new AmazonDynamoDBClient(clientConfig);
```

# API tingkat rendah DynamoDB
<a name="Programming.LowLevelAPI"></a>

*API tingkat rendah* Amazon DynamoDB adalah antarmuka tingkat protokol untuk DynamoDB. Pada tingkat ini, setiap permintaan HTTP(S) harus diformat dengan benar dan membawa tanda tangan digital yang valid.

 AWS SDKs Membangun permintaan API DynamoDB tingkat rendah atas nama Anda dan memproses tanggapan dari DynamoDB. Ini memungkinkan Anda berfokus pada logika aplikasi Anda, bukan detail tingkat rendah. Namun, Anda masih bisa mendapatkan keuntungan dari pengetahuan dasar tentang bagaimana DynamoDB API tingkat rendah bekerja.

Untuk informasi selengkapnya tentang DynamoDB API, lihat [Referensi Amazon DynamoDB API](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/).

**catatan**  
DynamoDB Streams memiliki API tingkat rendah sendiri, yang terpisah dari DynamoDB dan sepenuhnya didukung oleh. AWS SDKs  
Untuk informasi selengkapnya, lihat [Tangkapan data perubahan DynamoDB Streams](Streams.md). Untuk DynamoDB Streams API tingkat rendah, lihat [Referensi Amazon DynamoDB Streams API](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations_Amazon_DynamoDB_Streams.html).

DynamoDB API tingkat rendah JavaScript menggunakan Object Notation (JSON) sebagai format protokol kawat. JSON menyajikan data dalam hierarki sehingga nilai data dan struktur data disampaikan secara bersamaan. Pasangan nama-nilai ditentukan dalam format `name:value`. Hierarki data ditentukan oleh tanda kurung berisi pasangan nama-nilai.

DynamoDB menggunakan JSON hanya sebagai protokol transportasi, bukan sebagai format penyimpanan. AWS SDKs Penggunaan JSON untuk mengirim data ke DynamoDB, dan DynamoDB merespons dengan JSON. DynamoDB tidak menyimpan data terus-menerus dalam format JSON.

**catatan**  
Untuk informasi selengkapnya tentang JSON, lihat [Memperkenalkan JSON](http://json.org) pada situs web `JSON.org`.

**Topics**
+ [Format permintaan](#Programming.LowLevelAPI.RequestFormat)
+ [Format respons](#Programming.LowLevelAPI.ResponseFormat)
+ [Deskriptor jenis data](#Programming.LowLevelAPI.DataTypeDescriptors)
+ [Data numerik](#Programming.LowLevelAPI.Numbers)
+ [Data biner](#Programming.LowLevelAPI.Binary)

![\[DynamoDB API tingkat rendah dan AWS SDKs cara menangani permintaan dan respons tingkat protokol.\]](http://docs.aws.amazon.com/id_id/amazondynamodb/latest/developerguide/images/SDKSupport.DDBLowLevelAPI.png)


## Format permintaan
<a name="Programming.LowLevelAPI.RequestFormat"></a>

API tingkat rendah DynamoDB menerima permintaan `POST` HTTP(S) sebagai masukan. AWS SDKs Bangun permintaan ini untuk Anda.

Misalkan Anda memiliki tabel bernama `Pets`, dengan skema kunci yang terdiri dari `AnimalType` (kunci partisi) dan `Name` (kunci urutan). Kedua atribut ini berjenis `string`. Untuk mengambil item dari`Pets`, AWS SDK membuat permintaan berikut.

```
POST / HTTP/1.1
Host: dynamodb.<region>.<domain>;
Accept-Encoding: identity
Content-Length: <PayloadSizeBytes>
User-Agent: <UserAgentString>
Content-Type: application/x-amz-json-1.0
Authorization: AWS4-HMAC-SHA256 Credential=<Credential>, SignedHeaders=<Headers>, Signature=<Signature>
X-Amz-Date: <Date> 
X-Amz-Target: DynamoDB_20120810.GetItem

{
    "TableName": "Pets",
    "Key": {
        "AnimalType": {"S": "Dog"},
        "Name": {"S": "Fido"}
    }
}
```

Perhatikan hal berikut tentang permintaan ini:
+ Header `Authorization` berisi informasi yang diperlukan untuk DynamoDB guna mengautentikasi permintaan. Untuk informasi selengkapnya, lihat [Menandatangani permintaan AWS API](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) dan [proses penandatanganan Versi Tanda Tangan 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) di bagian *Referensi Umum Amazon Web Services*.
+ Header `X-Amz-Target` berisi nama operasi DynamoDB: `GetItem`. (Ini juga disertai dengan versi API tingkat rendah, dalam hal ini `20120810`.)
+ Muatan (isi) permintaan mengandungi parameter untuk operasi, dalam format JSON. Untuk operasi `GetItem`, parameternya adalah `TableName` dan `Key`.

## Format respons
<a name="Programming.LowLevelAPI.ResponseFormat"></a>

Setelah menerima permintaan, DynamoDB memprosesnya dan mengembalikan respons. Untuk permintaan yang ditunjukkan sebelumnya, muatan respons HTTP(S) berisi hasil dari operasi, seperti yang ditunjukkan pada contoh berikut.

```
HTTP/1.1 200 OK
x-amzn-RequestId: <RequestId>
x-amz-crc32: <Checksum>
Content-Type: application/x-amz-json-1.0
Content-Length: <PayloadSizeBytes>
Date: <Date>
{
    "Item": {
        "Age": {"N": "8"},
        "Colors": {
            "L": [
                {"S": "White"},
                {"S": "Brown"},
                {"S": "Black"}
            ]
        },
        "Name": {"S": "Fido"},
        "Vaccinations": {
            "M": {
                "Rabies": {
                    "L": [
                        {"S": "2009-03-17"},
                        {"S": "2011-09-21"},
                        {"S": "2014-07-08"}
                    ]
                },
                "Distemper": {"S": "2015-10-13"}
            }
        },
        "Breed": {"S": "Beagle"},
        "AnimalType": {"S": "Dog"}
    }
}
```

Pada titik ini, AWS SDK mengembalikan data respons ke aplikasi Anda untuk diproses lebih lanjut.

**catatan**  
Jika DynamoDB tidak dapat memproses permintaan, DynamoDB akan mengembalikan kode kesalahan HTTP dan pesan. AWS SDK menyebarkannya untuk aplikasi Anda dalam bentuk pengecualian. Untuk informasi selengkapnya, lihat [Penanganan kesalahan dengan DynamoDB](Programming.Errors.md).

## Deskriptor jenis data
<a name="Programming.LowLevelAPI.DataTypeDescriptors"></a>

Protokol DynamoDB API tingkat rendah membutuhkan setiap atribut untuk disertai dengan deskriptor jenis data. *Deskriptor jenis data* adalah token yang memberi tahu DynamoDB cara menafsirkan setiap atribut.

Contoh di [Format permintaan](#Programming.LowLevelAPI.RequestFormat) dan [Format respons](#Programming.LowLevelAPI.ResponseFormat) menunjukkan contoh bagaimana deskriptor jenis data digunakan. Permintaan `GetItem` menentukan `S` untuk atribut skema kunci `Pets` (`AnimalType` dan `Name`), yang berjenis `string`. Respons `GetItem` berisi item *Pets* dengan atribut jenis `string` (`S`), `number` (`N`), `map` (`M`), dan `list` (`L`).

Berikut ini adalah daftar lengkap deskriptor jenis data DynamoDB:
+ **`S`** – String
+ **`N`** – Nomor
+ **`B`** – Biner
+ **`BOOL`** – Boolean
+ **`NULL`** – Null
+ **`M`** – Peta
+ **`L`** – Daftar
+ **`SS`** – Set String
+ **`NS`** – Set Nomor
+ **`BS`** – Set Biner

Tabel berikut menunjukkan format JSON yang benar untuk setiap deskriptor tipe data. Perhatikan bahwa angka direpresentasikan sebagai string untuk mempertahankan presisi, sedangkan boolean dan null menggunakan tipe JSON asli mereka.


| Deskriptor | Format JSON | Catatan | 
| --- | --- | --- | 
| S | \$1"S": "Hello"\$1 | Nilai adalah string JSON. | 
| N | \$1"N": "123.45"\$1 | Nilai adalah string, bukan nomor JSON. Ini mempertahankan presisi di seluruh bahasa. | 
| B | \$1"B": "dGhpcyBpcyBhIHRlc3Q="\$1 | Nilai adalah string yang dikodekan base64. | 
| BOOL | \$1"BOOL": true\$1 | Nilai adalah boolean JSON (trueataufalse), bukan string. | 
| NULL | \$1"NULL": true\$1 | Nilai adalah boolean JSON true untuk menunjukkan nol. | 
| M | \$1"M": \$1"Name": \$1"S": "Joe"\$1\$1\$1 | Nilai adalah objek JSON dari pasangan nama-nilai atribut. | 
| L | \$1"L": [\$1"S": "Red"\$1, \$1"N": "5"\$1]\$1 | Nilai adalah array JSON dari nilai atribut. | 
| SS | \$1"SS": ["Red", "Blue"]\$1 | Nilai adalah array JSON string. | 
| NS | \$1"NS": ["1", "2.5"]\$1 | Nilai adalah array JSON dari string nomor. | 
| BS | \$1"BS": ["U3Vubnk=", "UmFpbnk="]\$1 | Nilai adalah array JSON dari string yang dikodekan base64. | 

**catatan**  
 Untuk deskripsi mendetail tentang jenis data DynamoDB, lihat [Jenis Data](HowItWorks.NamingRulesDataTypes.md#HowItWorks.DataTypes).

## Data numerik
<a name="Programming.LowLevelAPI.Numbers"></a>

Bahasa pemrograman yang berbeda menawarkan tingkat dukungan yang berbeda untuk JSON. Dalam beberapa kasus, Anda mungkin memutuskan untuk menggunakan pustaka pihak ketiga untuk memvalidasi dan menguraikan dokumen JSON.

Beberapa pustaka pihak ketiga membangun jenis angka JSON, menyediakan jenisnya sendiri seperti `int`, `long`, atau `double`. Namun, jenis data angka asli di DynamoDB tidak memetakan persis untuk jenis data lainnya, sehingga perbedaan jenis ini dapat menyebabkan konflik. Selain itu, banyak pustaka JSON tidak menangani nilai numerik presisi tetap, dan secara otomatis menyimpulkan jenis data ganda untuk urutan digit yang berisi titik desimal.

Untuk mengatasi masalah ini, DynamoDB menyediakan jenis numerik tunggal tanpa kehilangan data. Untuk menghindari konversi implisit yang tidak diinginkan ke nilai ganda, DynamoDB menggunakan string untuk transfer data nilai numerik. Pendekatan ini memberikan fleksibilitas untuk memperbarui nilai atribut sekaligus mempertahankan semantik pengurutan yang tepat, seperti menempatkan nilai "01", "2", dan "03" dalam urutan yang tepat.

Jika presisi angka penting untuk aplikasi, Anda harus mengonversi nilai numerik untuk string tersebut sebelum meneruskannya ke DynamoDB.

## Data biner
<a name="Programming.LowLevelAPI.Binary"></a>

DynamoDB mendukung atribut binari. Namun, JSON tidak secara native mendukung data biner pengodean. Untuk mengirim data biner dalam permintaan, Anda perlu untuk mengodekannya dalam format base64. Setelah menerima permintaan, DynamoDB mengodekan data base64 kembali ke biner. 

Skema pengodean base64 yang digunakan oleh DynamoDB dijelaskan di [RFC 4648](http://tools.ietf.org/html/rfc4648) di situs web Internet Engineering Task Force (IETF).