

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Présentation de la prise en charge du AWS SDK pour DynamoDB
<a name="Programming.SDKOverview"></a>

Le schéma suivant fournit une présentation générale de la programmation d'applications Amazon DynamoDB à l'aide du. AWS SDKs

![\[Modèle de programmation pour utiliser DynamoDB avec. AWS SDKs\]](http://docs.aws.amazon.com/fr_fr/amazondynamodb/latest/developerguide/images/SDKSupport.png)


1. Vous écrivez une application à l'aide d'un AWS SDK pour votre langage de programmation.

1. Chaque AWS SDK fournit une ou plusieurs interfaces de programmation permettant d'utiliser DynamoDB. Les interfaces spécifiques disponibles dépendent du langage de programmation et du AWS SDK que vous utilisez. Voici les options :
   + [Interfaces de bas niveau compatibles avec DynamoDB](Programming.SDKs.Interfaces.md#Programming.SDKs.Interfaces.LowLevel)
   + [Interfaces de document compatibles avec DynamoDB](Programming.SDKs.Interfaces.md#Programming.SDKs.Interfaces.Document)
   + [Interfaces de persistance d’objets compatibles avec DynamoDB](Programming.SDKs.Interfaces.md#Programming.SDKs.Interfaces.Mapper)
   + [Interfaces de haut niveau](HigherLevelInterfaces.md)

1. Le AWS SDK crée des requêtes HTTP (S) à utiliser avec l'API DynamoDB de bas niveau.

1. Le AWS SDK envoie la demande au point de terminaison DynamoDB.

1. DynamoDB exécute la demande. Si la demande aboutit, DynamoDB renvoie un code de réponse HTTP 200 (OK). Si la demande échoue, DynamoDB renvoie un code d’erreur HTTP et un message d’erreur.

1. Le AWS SDK traite la réponse et la retransmet à votre application.

Chacun d'entre eux AWS SDKs fournit des services importants à votre application, notamment les suivants :
+ Mise en forme des demandes HTTP(S) et sérialisation des paramètres de demande.
+ Génération d’une signature de chiffrement pour chaque demande.
+ Transfert des demandes vers un point de terminaison DynamoDB et réception des réponses de DynamoDB.
+ Extraction des résultats de ces réponses.
+ Implémentation d’une logique de nouvelle tentative de base en cas d’erreurs.

Vous n’avez besoin d’écrire de code pour aucune de ces tâches.

**Note**  
Pour plus d'informations AWS SDKs, y compris les instructions d'installation et la documentation, consultez la section [Outils pour Amazon Web Services](https://aws.amazon.com/tools).

## Support du SDK pour les terminaux basés sur des AWS comptes
<a name="Programming.SDKs.endpoints"></a>

AWS déploie la prise en charge du SDK pour les AWS points de terminaison basés sur un compte pour DynamoDB, en commençant par le SDK pour AWS Java V1 le 4 septembre 2024. Ces nouveaux terminaux contribuent AWS à garantir des performances et une évolutivité élevées. La mise à jour SDKs utilisera automatiquement les nouveaux points de terminaison, qui ont le format`https://(account-id).ddb.(region).amazonaws.com`.

Si vous utilisez une seule instance d’un client SDK pour envoyer des demandes à plusieurs comptes, votre application aura moins de possibilités de réutiliser les connexions. AWS recommande de modifier vos applications afin de vous connecter à un moins grand nombre de comptes par instance client SDK. Une autre solution consiste à configurer votre client SDK pour qu'il continue à utiliser les points de terminaison régionaux à l'aide du `ACCOUNT_ID_ENDPOINT_MODE` paramètre, comme indiqué dans le guide de [https://docs.aws.amazon.com/sdkref/latest/guide/feature-account-endpoints.html](https://docs.aws.amazon.com/sdkref/latest/guide/feature-account-endpoints.html).

# Interfaces de programmation compatibles avec DynamoDB
<a name="Programming.SDKs.Interfaces"></a>

Chaque [kit SDK AWS](https://aws.amazon.com/tools) fournit une ou plusieurs interfaces de programmation utilisables avec Amazon DynamoDB. Ces interfaces vont de simples encapsuleurs DynamoDB de bas niveau à des couches de persistance orientées objet. Les interfaces disponibles varient en fonction du AWS SDK et du langage de programmation que vous utilisez.

![\[Différentes interfaces de programmation sont disponibles AWS SDKs pour travailler avec DynamoDB.\]](http://docs.aws.amazon.com/fr_fr/amazondynamodb/latest/developerguide/images/SDKSupport.SDKInterfaces.png)


La section suivante met en évidence certaines des interfaces disponibles, en utilisant l’ AWS SDK pour Java en guise d’exemple (Toutes les interfaces ne sont pas toutes disponibles AWS SDKs.)

**Topics**
+ [Interfaces de bas niveau compatibles avec DynamoDB](#Programming.SDKs.Interfaces.LowLevel)
+ [Interfaces de document compatibles avec DynamoDB](#Programming.SDKs.Interfaces.Document)
+ [Interfaces de persistance d’objets compatibles avec DynamoDB](#Programming.SDKs.Interfaces.Mapper)

## Interfaces de bas niveau compatibles avec DynamoDB
<a name="Programming.SDKs.Interfaces.LowLevel"></a>

Chaque AWS SDK spécifique à un langage fournit une interface de bas niveau pour Amazon DynamoDB, avec des méthodes qui ressemblent étroitement aux requêtes d'API DynamoDB de bas niveau.

Dans certains cas, vous devrez identifier les types de données des attributs en utilisant des [Descripteurs de type de données](Programming.LowLevelAPI.md#Programming.LowLevelAPI.DataTypeDescriptors), tels que `S` pour String (chaîne) ou `N` pour Number (nombre).

**Note**  
Une interface de bas niveau est disponible dans chaque kit SDK  AWS spécifique d’un langage.

Le programme Java suivant utilise l’interface de bas niveau de l’ AWS SDK pour Java. 

### Exemple d’interface de bas niveau
<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);
        }
    }
}
```

## Interfaces de document compatibles avec DynamoDB
<a name="Programming.SDKs.Interfaces.Document"></a>

Beaucoup AWS SDKs proposent une interface documentaire qui vous permet d'effectuer des opérations de plan de données (création, lecture, mise à jour, suppression) sur les tables et les index. Avec une interface de document, vous n’avez pas besoin de spécifier [Descripteurs de type de données](Programming.LowLevelAPI.md#Programming.LowLevelAPI.DataTypeDescriptors). Les types de données découlent de la sémantique des données proprement dites. Ils fournissent AWS SDKs également des méthodes permettant de convertir facilement des documents JSON vers et depuis des types de données Amazon DynamoDB natifs.

**Note**  
Les interfaces de document sont disponibles dans [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) et [JavaScriptSDK](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/). AWS SDKs 

Le programme Java suivant utilise l’interface de document de l’ AWS SDK pour Java. Le programme crée un objet `Table` qui représente la table `Music`, puis demande à cet objet d’utiliser `GetItem` pour extraire une chanson. Le programme affiche ensuite l’année de sortie de la chanson.

La classe `software.amazon.dynamodb.document.DynamoDB` implémente l’interface de document de DynamoDB. Observez la manière dont `DynamoDB` agit en tant qu’encapsuleur autour du client de bas niveau (`AmazonDynamoDB`).

### Exemple d’interface de document
<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);

    }
}
```

## Interfaces de persistance d’objets compatibles avec DynamoDB
<a name="Programming.SDKs.Interfaces.Mapper"></a>

Certains AWS SDKs proposent une interface de persistance des objets dans laquelle vous n'effectuez pas directement d'opérations sur le plan de données. Au lieu de cela, vous créez des objets représentant des éléments dans des tables et index Amazon DynamoDB, et interagissez uniquement avec ces objets. Cela vous permet d’écrire du code orienté objet plutôt que du code orienté base de données.

**Note**  
Les interfaces de persistance des objets sont disponibles AWS SDKs pour Java et .NET. Pour plus d’informations, consultez [Interfaces de programmation de niveau supérieur pour DynamoDB](HigherLevelInterfaces.md) pour DynamoDB.

### Exemple d’interface de persistance des objets
<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();
    }
}
```

# Interfaces de programmation de niveau supérieur pour DynamoDB
<a name="HigherLevelInterfaces"></a>

Ils AWS SDKs fournissent aux applications des interfaces de bas niveau pour travailler avec Amazon DynamoDB. Ces classes et méthodes côté client correspondent directement à l'API DynamoDB de bas niveau. Cependant, de nombreux développeurs sont confrontés à un sentiment de déconnexion ou à une *discordance d'impédance* quand ils doivent mapper des types de données complexes à des éléments dans une table de base de données. Avec une interface de base de données de bas niveau, les développeurs doivent écrire des méthodes pour lire ou écrire des données d'objet dans des tables de base de données, et inversement. La quantité de code supplémentaire requise pour chaque combinaison de type d'objet et de table de base de données peut sembler écrasante.

Pour simplifier le développement, les interfaces AWS SDKs pour Java et .NET fournissent des interfaces supplémentaires avec des niveaux d'abstraction plus élevés. Les interfaces de niveau supérieur pour DynamoDB vous permettent de définir les relations entre les objets dans votre programme et les tables de base de données qui stockent les données de ces objets. Après avoir défini ce mappage, vous appelez des méthodes d'objet simples telles que `save`, `load` ou `delete`, et les opérations DynamoDB de bas niveau sous-jacentes sont appelées automatiquement pour vous. Cela vous permet d'écrire du code orienté objet plutôt que du code orienté base de données.

Les interfaces de programmation de niveau supérieur pour DynamoDB sont disponibles pour Java et .NET. AWS SDKs 

**Java**
+ [Java 1.x : Dynamo DBMapper](DynamoDBMapper.md)
+ [Java 2.x : client amélioré DynamoDB](DynamoDBEnhanced.md)

**.NET**
+ [Utilisation du modèle de document .NET dans DynamoDB](DotNetSDKMidLevel.md)
+ [Utilisation du modèle de persistance des objets .NET et de DynamoDB](DotNetSDKHighLevel.md)

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

**Note**  
Le kit SDK pour Java est disponible en deux versions : 1.x et 2.x. Le end-of-support for 1.x a été [annoncé](https://aws.amazon.com/blogs/developer/announcing-end-of-support-for-aws-sdk-for-java-v1-x-on-december-31-2025/) le 12 janvier 2024. Il le sera et end-of-support doit être remis le 31 décembre 2025. Pour les nouveaux développements, nous vous recommandons vivement d’utiliser la version 2.x.

 AWS SDK pour Java fournit une `DynamoDBMapper` classe qui vous permet de mapper vos classes côté client aux tables Amazon DynamoDB. Pour utiliser `DynamoDBMapper`, vous définissez la relation entre éléments d’une table DynamoDB et leurs instances d’objet correspondantes dans votre code. La classe `DynamoDBMapper` vous permet d’effectuer diverses opérations de création, de lecture, de mise à jour et de suppression (opérations CRUD) sur des éléments, ainsi que d’exécuter des requêtes et analyses sur des tables.

**Topics**
+ [Classe Dynamo DBMapper](DynamoDBMapper.Methods.md)
+ [Types de données pris en charge pour Dynamo DBMapper pour Java](DynamoDBMapper.DataTypes.md)
+ [Annotations Java pour DynamoDB](DynamoDBMapper.Annotations.md)
+ [Paramètres de configuration facultatifs pour Dynamo DBMapper](DynamoDBMapper.OptionalConfig.md)
+ [DynamoDB et verrouillage optimiste avec numéro de version](DynamoDBMapper.OptimisticLocking.md)
+ [Mappage des données arbitraires dans DynamoDB](DynamoDBMapper.ArbitraryDataMapping.md)
+ [Exemples DynamoDBMapper](DynamoDBMapper.Examples.md)

**Note**  
La classe `DynamoDBMapper` ne vous permet pas de créer, de mettre à jour ou de supprimer des tables. Pour effectuer ces tâches, utilisez plutôt l’interface du kit SDK de bas niveau pour Java.

Le kit SDK pour Java fournit un ensemble de types d’annotations qui vous permettent de mapper vos classes à des tables. Par exemple, imaginons une table `ProductCatalog` ayant `Id` en tant que clé de partition. 

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

Vous pouvez mapper une classe de votre application client à la table `ProductCatalog`, comme illustré dans le code Java suivant. Cet exemple de code définit un objet Java ancien brut (Plain Old Java Object, POJO) nommé `CatalogItem` qui utilise des annotations pour mapper des champs d’objet à des noms d’attribut 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; }
}
```

Dans le code précédent, l’annotation `@DynamoDBTable` mappe la classe `CatalogItem` à la table `ProductCatalog`. Vous pouvez stocker des instances de classe individuelles en tant qu’éléments dans la table. Dans la définition de classe, l’annotation `@DynamoDBHashKey` mappe l’`Id` de propriété à la clé primaire. 

Par défaut, les propriétés de classe mappent avec les mêmes attributs de nom dans la table. Les propriétés `Title` et `ISBN` mappent avec les mêmes attributs de nom dans la table. 

L’annotation `@DynamoDBAttribute` est facultative si le nom de l’attribut DynamoDB correspond au nom de la propriété déclarée dans la classe. Si les noms diffèrent, utilisez cette annotation avec le paramètre `attributeName` pour spécifier l’attribut DynamoDB auquel cette propriété correspond. 

Dans l’exemple précédent, l’annotation `@DynamoDBAttribute` est ajoutée à chaque propriété afin de garantir que les noms de propriété correspondent exactement aux tables créées au cours d’une étape précédente et d’assurer la cohérence avec les noms d’attributs utilisés dans d’autres exemples de code dans ce guide. 

Votre définition de classe peut avoir des propriétés qui ne mappent avec aucun attribut de la table. Vous identifiez ces propriétés en ajoutant l’annotation `@DynamoDBIgnore`. Dans l’exemple précédent, la propriété `SomeProp` est marquée avec l’annotation `@DynamoDBIgnore`. Lorsque vous téléchargez une instance `CatalogItem` vers la table, votre instance `DynamoDBMapper` n’inclut pas de propriété `SomeProp`. En outre, l’outil de mappage ne retourne pas cet attribut lorsque vous récupérez un élément de la table. 

Une fois que vous avez défini votre classe de mappage, vous pouvez utiliser des méthodes `DynamoDBMapper` pour écrire une instance de cette classe d’un élément correspondant dans la table `Catalog`. L’exemple de code suivant illustre cette technique.

```
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);
```

L’exemple de code suivant montre comment récupérer l’élément et accéder à certains de ses attributs :

```
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` offre un moyen intuitif, naturel d’utiliser des données DynamoDB dans Java. Il offre aussi différentes fonctionnalités intégrées telles que le verrouillage optimiste, les transactions ACID, les valeurs de clé de tri et de clé de partition générées automatiquement et la gestion des versions d’objet.

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



La classe `DynamoDBMapper` est le point d’entrée d’Amazon DynamoDB. Elle donne accès à un point de terminaison DynamoDB et vous permet d’accéder à vos données dans différentes tables. Elle vous permet également d’effectuer diverses opérations de création, de lecture, de mise à jour et de suppression (opérations CRUD) sur des éléments, ainsi que d’exécuter des requêtes et analyses sur des tables. Cette classe fournit les méthodes suivantes utiliser DynamoDB.

*Pour consulter la documentation Javadoc correspondante, consultez [Dynamo DBMapper](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html) dans le manuel de référence des AWS SDK pour Java API.*

**Topics**
+ [enregistrer](#DynamoDBMapper.Methods.save)
+ [charge](#DynamoDBMapper.Methods.load)
+ [supprimer](#DynamoDBMapper.Methods.delete)
+ [query](#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)
+ [generateCreateTableDemande](#DynamoDBMapper.Methods.generateCreateTableRequest)
+ [createS3Link](#DynamoDBMapper.Methods.createS3Link)
+ [Obtient S3 ClientCache](#DynamoDBMapper.Methods.getS3ClientCache)

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

Enregistre l’objet spécifié dans la table. L’objet que vous voulez enregistrer est le seul paramètre requis pour cette méthode. Vous pouvez fournir des paramètres de configuration facultatifs en utilisant l’objet `DynamoDBMapperConfig`. 

Si un élément qui a la même clé primaire n’existe pas, cette méthode crée un nouvel élément dans la table. Si un élément qui a la même clé primaire existe, elle met à jour l’élément existant. Si la clé de partition et la clé de tri sont de type String, et annotées avec `@DynamoDBAutoGeneratedKey`, alors elles reçoivent un identificateur unique universel (UUID) aléatoire en cas de défaut d’initialisation. Les champs de version qui sont annotés avec `@DynamoDBVersionAttribute` seront incrémentés d’un niveau. En outre, si un champ de version est mis à jour ou généré par une clé, l’objet adopté est mis à jour à la suite de l’opération. 

Par défaut, seuls les attributs correspondants aux propriétés de classes mappées sont mis à jour. Tous les attributs supplémentaires existant sur un élément ne sont pas affectés. Toutefois, si vous spécifiez `SaveBehavior.CLOBBER`, vous pouvez forcer le remplacement complet de l’élément.

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

Si vous avez activé le contrôle de version, alors les versions d’élément côté client et côté serveur doivent correspondre. Toutefois, la version n’a pas besoin de correspondre si l’option `SaveBehavior.CLOBBER` est utilisée. Pour plus d’informations sur la gestion des versions, consultez [DynamoDB et verrouillage optimiste avec numéro de version](DynamoDBMapper.OptimisticLocking.md).

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

Récupère un élément dans une table. Vous devez fournir la clé primaire de l’élément que vous voulez récupérer. Vous pouvez fournir des paramètres de configuration facultatifs en utilisant l’objet `DynamoDBMapperConfig`. Par exemple, vous pouvez demander le cas échéant des lectures fortement cohérentes afin de garantir que cette méthode récupère uniquement les dernières valeurs d’élément comme indiqué dans l’instruction Java suivante. 

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

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

Par défaut, DynamoDB renvoie l’élément ayant des valeurs éventuellement cohérentes. Pour plus d’informations sur le modèle de cohérence éventuelle de DynamoDB, consultez [Cohérence en lecture DynamoDB](HowItWorks.ReadConsistency.md).

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

Supprime un élément de la table. Vous devez communiquer une instance d’objet de la classe mappée. 

Si vous avez activé le contrôle de version, alors les versions d’élément côté client et côté serveur doivent correspondre. Toutefois, la version n’a pas besoin de correspondre si l’option `SaveBehavior.CLOBBER` est utilisée. Pour plus d’informations sur la gestion des versions, consultez [DynamoDB et verrouillage optimiste avec numéro de version](DynamoDBMapper.OptimisticLocking.md). 

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

Interroge une table ou un index secondaire.

Supposons que vous ayez une table, `Reply`, qui stocke des réponses de threads de forum. Chaque objet thread peut avoir zéro ou plusieurs réponses. La clé primaire de la table `Reply` se compose des champs `Id` et `ReplyDateTime`, où `Id` est la clé de partition et `ReplyDateTime` est la clé de tri de la clé primaire.

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

Supposons que vous ayez créé un mappage entre une classe `Reply` et la table `Reply` correspondante dans DynamoDB. L’exemple de code Java suivant utilise `DynamoDBMapper` pour trouver toutes les réponses au cours des deux dernières semaines pour un objet thread spécifique.

**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);
```

La requête renvoie un ensemble d’objets `Reply`. 

Par défaut, la méthode `query` renvoie une collection « avec chargement différé ». Elle ne renvoie initialement qu’une seule page de résultats puis effectue un appel de service pour la page suivante si nécessaire. Pour obtenir tous les éléments correspondants, itérez sur la collection `latestReplies`. 

Notez que l’appel de la méthode `size()` sur la collection chargera chaque résultat afin de fournir un décompte précis. Cela peut entraîner la consommation d’un débit alloué élevé et, sur une très grande table, pourrait même épuiser toute la mémoire de votre JVM.

Pour interroger un index, vous devez tout d’abord affecter un modèle à l’index en tant que classe d’outil de mappage. Supposons que la `Reply` table possède un index secondaire global nommé *PostedBy-Message-Index*. La clé de partition de cet index est `PostedBy`, et la clé de tri est `Message`. La définition de classe d’un élément dans l’index se présenterait comme suit :

```
@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.
}
```

L’annotation `@DynamoDBTable` indique que cet index est associé à la table `Reply`. L'`@DynamoDBIndexHashKey`annotation indique la clé de partition (*PostedBy*) de l'index et `@DynamoDBIndexRangeKey` la clé de tri (*Message*) de l'index.

Vous pouvez maintenant utiliser `DynamoDBMapper` pour interroger l’index, en récupérant un sous-ensemble de messages qui ont été publiés par un utilisateur particulier. Il n’est pas nécessaire de spécifier le nom de l’index si vous n’avez pas de mappages contradictoires entre les tables et les index et si les mappages sont déjà établis dans l’outil de mappage. L’outil de mappage déduit en fonction de la clé primaire et de la clé de tri. L’exemple de code suivant interroge un index secondaire global. Étant donné que les index globaux secondaires (gsi) prennent en charge des lectures cohérentes à terme, mais pas des lectures fortement cohérentes, vous devez spécifier `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);
```

La requête renvoie un ensemble d’objets `PostedByMessage`.

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

Interroge une table ou un index secondaire, et renvoie une seule page de résultats correspondants. Comme avec la méthode `query`, vous devez spécifier une valeur de clé de partition et un filtre de requête qui est appliqué à l’attribut de clé de tri. Toutefois, `queryPage` renvoie uniquement la première « page » de données, c’est-à-dire la quantité de données pouvant tenir dans 1 Mo 

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

Analyse une table ou un index secondaire entiers. Vous pouvez spécifier le cas échéant un `FilterExpression` pour filtrer l’ensemble de résultats.

Supposons que vous ayez une table, `Reply`, qui stocke des réponses de threads de forum. Chaque objet thread peut avoir zéro ou plusieurs réponses. La clé primaire de la table `Reply` se compose des champs `Id` et `ReplyDateTime`, où `Id` est la clé de partition et `ReplyDateTime` est la clé de tri de la clé primaire.

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

Si vous avez mappé une classe Java à la table `Reply`, vous pouvez utiliser le `DynamoDBMapper` pour analyser la table. Par exemple, le code Java suivant analyse l’ensemble de la table `Reply`, en renvoyant uniquement les réponses pour une année donnée.

**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);
```

Par défaut, la méthode `scan` renvoie une collection « avec chargement différé ». Elle ne renvoie initialement qu’une seule page de résultats puis effectue un appel de service pour la page suivante si nécessaire. Pour obtenir tous les éléments correspondants, itérez sur la collection `replies`.

Notez que l’appel de la méthode `size()` sur la collection chargera chaque résultat afin de fournir un décompte précis. Cela peut entraîner la consommation d’un débit alloué élevé et, sur une très grande table, pourrait même épuiser toute la mémoire de votre JVM.

Pour analyser un index, vous devez tout d’abord affecter un modèle à l’index en tant que classe d’outil de mappage. Supposons que la table `Reply` a un index secondaire global nommé `PostedBy-Message-Index`. La clé de partition de cet index est `PostedBy`, et la clé de tri est `Message`. Une classe d’outil de mappage pour cet index est disponible dans la section [query](#DynamoDBMapper.Methods.query). Elle utilise les annotations `@DynamoDBIndexHashKey` et `@DynamoDBIndexRangeKey` pour spécifier la clé de partition et la clé de tri de l’index.

L’exemple de code suivant présente analyse `PostedBy-Message-Index`. Il n’utilise pas un filtre d’analyse. Ainsi, tous les éléments dans l’index vous sont renvoyés.

```
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>

Analyse une table ou un index secondaire, et renvoie une seule page de résultats correspondants. Comme avec la méthode `scan`, vous pouvez spécifier le cas échéant un `FilterExpression` pour filtrer le jeu de résultats. Toutefois, `scanPage` renvoie uniquement la première « page » de données, c’est-à-dire la quantité de données pouvant tenir dans 1 Mo.

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

Effectue une analyse parallèle d’une table ou d’un index secondaire entiers. Vous spécifiez un certain nombre de segments logiques pour la table, avec une expression d’analyse pour filtrer les résultats. Le `parallelScan` répartit la tâche d’analyse entre plusieurs instances de travail, une pour chaque segment logique ; les instances de travail traitent les données en parallèle et renvoient les résultats.

L’exemple de code Java suivant effectue une analyse parallèle sur la table `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>

Enregistre des objets dans une ou plusieurs tables à l’aide d’un ou de plusieurs appels à la méthode `AmazonDynamoDB.batchWriteItem`. Cette méthode n’offre pas de garanties de transaction.

Le code Java enregistre deux éléments (livres) dans la table `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>

Récupère plusieurs éléments d’une ou de plusieurs tables en utilisant leurs clés primaires.

Le code Java suivant récupère deux éléments dans deux tables différentes.

```
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>

Supprime des objets d’une ou de plusieurs tables à l’aide d’un ou de plusieurs appels à la méthode `AmazonDynamoDB.batchWriteItem`. Cette méthode n’offre pas de garanties de transaction. 

Le code Java supprime deux éléments (livres) dans la table `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>

Enregistre et supprime des objets dans une ou plusieurs des tables à l’aide d’un ou de plusieurs appels à la méthode `AmazonDynamoDB.batchWriteItem`. Cette méthode ne fournit pas des garanties de transactions et ne prend pas en charge le contrôle de version (suppressions ou insertions conditionnelles).

Le code Java suivant écrit un nouvel élément dans la table `Forum`, écrit un nouvel élément dans la table `Thread` et supprime un élément de la table `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>

Enregistre et supprime des objets dans une ou plusieurs des tables à l’aide d’un appel à la méthode `AmazonDynamoDB.transactWriteItems`. 

[Pour obtenir la liste des exceptions spécifiques aux transactions, consultez TransactWriteItems la section Erreurs.](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html#API_TransactWriteItems_Errors) 

Pour plus d’informations sur les transactions DynamoDB et les garanties d’atomicité, de cohérence, d’isolation et de durabilité (ACID) offertes, consultez [Transactions d’Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transactions.html). 

**Note**  
 Cette méthode ne prend pas en charge :  
[DBMapperConfig Dynamo. SaveBehavior](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptionalConfig.html).

Le code Java suivant écrit un nouvel élément dans chacune des tables `Forum` et `Thread`, par voie de transaction.

```
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>

Charge des objets d’une ou de plusieurs tables à l’aide d’un appel à la méthode `AmazonDynamoDB.transactGetItems`. 

[Pour obtenir la liste des exceptions spécifiques aux transactions, consultez TransactGetItems la section Erreurs.](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html#API_TransactGetItems_Errors) 

Pour plus d’informations sur les transactions DynamoDB et les garanties d’atomicité, de cohérence, d’isolation et de durabilité (ACID) offertes, consultez [Transactions d’Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transactions.html). 

L’extrait de code Java suivent charge un élément à partir de chacune des tables `Forum` et `Thread`, par voie de transaction.

```
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>

Évalue l’expression d’analyse spécifiée et renvoie le nombre d’éléments correspondants. Aucun élément de données n’est renvoyé.

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

Analyse une classe POJO représentant une table DynamoDB, et renvoie une `CreateTableRequest` pour cette table.

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

Crée un lien vers un objet dans Amazon S3. Vous devez spécifier un nom de compartiment et un nom de clé identifiant l’objet de manière unique dans le compartiment.

Pour utiliser `createS3Link`, votre classe d’outil de mappage doit définir des méthodes getter et setter. L'exemple de code suivant illustre cela en ajoutant un nouvel attribut et de nouvelles getter/setter méthodes à la `CatalogItem` classe.

```
@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;
    }

...
}
```

Le code Java suivant définit un nouvel élément à écrire dans la table `Product`. L’élément inclut un lien vers une image de produit ; les données d’image sont chargées dans 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);
```

La classe `S3Link` fournit de nombreuses autres méthodes pour la manipulation d’objets dans Amazon S3. Pour plus d’informations, consultez [Javadocs pour `S3Link`](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/S3Link.html).

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

Renvoie le `S3ClientCache` sous-jacent pour l’accès à Amazon S3. Un `S3ClientCache` est une carte intelligente pour des objets `AmazonS3Client`. Si vous avez plusieurs clients, cela `S3ClientCache` peut vous aider à organiser les clients par AWS région et à créer de nouveaux clients Amazon S3 à la demande.

# Types de données pris en charge pour Dynamo DBMapper pour Java
<a name="DynamoDBMapper.DataTypes"></a>

Cette section décrit les types de données Java primitifs, les collections et les types de données arbitraires pris en charge dans Amazon DynamoDB. 

Amazon DynamoDB prend en charge les types de données Java primitifs et les classes wrapper primitives suivants. 
+ `String`
+ `Boolean`, `boolean`
+ `Byte`, `byte`
+ `Date` (en tant que chaîne de précision à la milliseconde [ISO\$18601](http://en.wikipedia.org/wiki/ISO_8601), passée sur UTC)
+ `Calendar` (en tant que chaîne de précision à la milliseconde [ISO\$18601](http://en.wikipedia.org/wiki/ISO_8601), passée sur UTC)
+ `Long`, `long`
+ `Integer`, `int`
+ `Double`, `double`
+ `Float`, `float`
+ `BigDecimal`
+ `BigInteger`

**Note**  
Pour plus d’informations sur les règles de dénomination de DynamoDB et les différents types de données pris en charge, consultez [Types de données et règles de dénomination pris en charge dans Amazon DynamoDB](HowItWorks.NamingRulesDataTypes.md). 
Les valeurs binaires vides sont prises en charge par le Dynamo. DBMapper
 AWS SDK for Java 2.x prend en charge les valeurs String vides.  
Dans le AWS SDK for Java 1.x, DBMapper Dynamo prend en charge la lecture de valeurs d'attributs de chaîne vides, mais il n'écrit pas de valeurs d'attribut de chaîne vides car ces attributs sont supprimés de la demande.

DynamoDB prend en charge les types de collections Java [Set](http://docs.oracle.com/javase/6/docs/api/java/util/Set.html) (ensemble), [List](http://docs.oracle.com/javase/6/docs/api/java/util/List.html) (liste) et [Map](http://docs.oracle.com/javase/6/docs/api/java/util/Map.html) (mappage). Le tableau suivant résume la manière dont ces types Java mappent aux types DynamoDB.


****  

| Type Java | Type DynamoDB | 
| --- | --- | 
|  Tous les types de numéro  |  `N` (type Number)  | 
|  Chaînes  |  `S` (type String)   | 
|  Booléen  |  `BOOL` (type booléen), 0 ou 1.  | 
|  ByteBuffer  |  `B` (type Binary)  | 
|  Date  |  `S` (type String). Les valeurs Date sont stockées comme chaînes formatées ISO-8601.  | 
| Types de collections [Set](http://docs.oracle.com/javase/6/docs/api/java/util/Set.html) |  Type `SS` (string set), type `NS` (number set) ou type `BS` (binary set).  | 

 L’interface `DynamoDBTypeConverter` vous permet de mapper vos propres types de données arbitraires à un type de données que DynamoDB prend en charge en mode natif. Pour de plus amples informations, veuillez consulter [Mappage des données arbitraires dans DynamoDB](DynamoDBMapper.ArbitraryDataMapping.md). 

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

Cette section décrit les annotations disponibles pour le mappage de vos classes et propriétés à des tables et attributs dans Amazon DynamoDB.

Pour la documentation Javadoc correspondante, consultez [Annotation Types Summary](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/package-summary.html) dans la [Référence d’API AWS SDK pour Java](https://docs.aws.amazon.com/sdk-for-java/latest/reference/).

**Note**  
Dans les annotations suivantes, seules `DynamoDBTable` et `DynamoDBHashKey` sont obligatoires. 

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

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

Mappe une propriété avec un attribut de table. Par défaut, chaque propriété de classe mappe un attribut d’élément avec le même nom. Toutefois, si les noms ne sont pas les mêmes, vous pouvez utiliser cette annotation pour mapper une propriété avec l’attribut. Dans l’extrait Java suivant, l’`DynamoDBAttribute` mappe la propriété `BookAuthors` avec le nom d’attribut `Authors` de la table.

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

Le `DynamoDBMapper` utilise `Authors` en tant que nom d’attribut lors de l’enregistrement de l’objet vers la table. 

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

Marque une propriété de clé de tri ou de clé de partition comme étant générée automatiquement. `DynamoDBMapper` génère un [UUID](http://docs.oracle.com/javase/6/docs/api/java/util/UUID.html) aléatoire lors de l’enregistrement de ces attributs. Seules les propriétés String peuvent être marquées en tant que clés générées automatiquement. 

L’exemple suivant illustre l’utilisation clés générées automatiquement.

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

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

Génère automatiquement un horodatage.

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

(Facultatif) La stratégie de génération automatique peut être définie en fournissant un attribut de stratégie. La valeur par défaut est `ALWAYS`.

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

Indique qu’une classe peut être sérialisée sous forme de document Amazon DynamoDB.

Par exemple, supposons que vous voulez mapper un document JSON à un attribut DynamoDB de type Map (`M`). L’exemple de code suivant définit un élément contenant un attribut imbriqué de type de Map.

```
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; }

     }
}
```

Vous pouvez alors enregistrer un nouvel élément `ProductCatalog` avec `Pictures`, comme illustré dans l’exemple suivant.

```
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);
```

L’élément `ProductCatalog` qui en résulte se présente comme suit (au 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"
  }
}
```

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

Mappe une propriété de classe avec la clé de partition de la table. La propriété doit être un des types binaire, numéro ou chaîne scalaire. La propriété ne peut pas être de type collection. 

Supposons que vous ayez une table, `ProductCatalog`, qui a un `Id` en tant que clé primaire. Le code Java suivant définit une classe `CatalogItem` et mappe sa propriété `Id` à la clé primaire de la table `ProductCatalog` à l’aide de la balise `@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.
}
```

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

Indique à l’instance `DynamoDBMapper` que la propriété associée doit être ignorée. Lors de l’enregistrement de données dans la table, `DynamoDBMapper` ne sauvegarde pas cette propriété dans la table.

 S’applique à la méthode getter ou au champ de classe pour une propriété non modélisée. Si l’annotation est appliquée directement au champ de classe, les méthodes getter et setter correspondantes doivent être déclarées dans la même classe. 

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

Mappe une propriété de classe à la clé de partition d’un index secondaire global. La propriété doit être un des types binaire, numéro ou chaîne scalaire. La propriété ne peut pas être de type collection. 

Utilisez cette annotation si vous devez interroger (`Query`) un index secondaire global. Vous devez spécifier le nom d’index (`globalSecondaryIndexName`). Si le nom de la propriété de classe est différent de la clé de partition d’index, vous devez également spécifier le nom de cet attribut d’index (`attributeName`).

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

Mappe une propriété de classe à la clé de tri d’un index secondaire global ou local. La propriété doit être un des types binaire, numéro ou chaîne scalaire. La propriété ne peut pas être de type collection. 

Utilisez cette annotation si vous devez interroger (`Query`) un index secondaire local ou global, et souhaitez affiner vos résultats à l’aide de la clé de tri d’index. Vous devez spécifier le nom d’index (soit `globalSecondaryIndexName`, soit `localSecondaryIndexName`). Si le nom de la propriété de classe est différent de la clé de tri d’index, vous devez également spécifier le nom de cet attribut d’index (`attributeName`).

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

Mappe une propriété de classe avec la clé de tri de la table. La propriété doit être un des types binaire, numéro ou chaîne scalaire. Elle ne peut pas être de type collection. 

Si la clé primaire est composite (clé de partition et clé de tri), vous pouvez utiliser cette balise pour mapper votre champ de classe avec la clé de tri. Par exemple, supposons que vous ayez une table `Reply` qui stocke les réponses pour les threads de forum. Chaque thread peut avoir plusieurs réponses. Ainsi, la clé primaire de cette table est à la fois `ThreadId` et `ReplyDateTime`. La clé de partition est `ThreadId` et la clé de tri est `ReplyDateTime`. 

L’extrait de code Java suivant définit une classe `Reply` et la mappe à la table `Reply`. Il utilise les deux balises, `@DynamoDBHashKey` et `@DynamoDBRangeKey`, pour identifier les propriétés de classe qui sont mappées avec la clé primaire.

```
@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.
}
```

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

Identifie la table cible dans DynamoDB. Par exemple, l’extrait de code Java suivant définit une classe `Developer` et la mappe à la table `People` dans DynamoDB. 

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

L’annotation `@DynamoDBTable` peut être héritée. Toute nouvelle classe qui hérite de la classe `Developer` se mappe également à la table `People`. Par exemple, supposons que vous génériez une classe `Lead` qui hérite de la classe `Developer`. Étant donné que vous avez mappé la classe `Developer` à la table `People`, les objets de la classe `Lead` sont également stockés dans la même table.

La `@DynamoDBTable` peut également être remplacée. Toute nouvelle classe qui hérite de la classe `Developer` par défaut se mappe à la même table `People`. Toutefois, vous pouvez substituer ce mappage par défaut. Par exemple, si vous créez une classe qui hérite de la classe `Developer`, vous pouvez explicitement la mapper à une autre table en ajoutant l’annotation `@DynamoDBTable` comme illustré dans l’extrait de code Java suivant.

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

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

Une annotation permettant d’indiquer qu’une propriété utilise un convertisseur personnalisé. Peut être indiquée sur une annotation définie par l’utilisateur afin de transmettre des propriétés à `DynamoDBTypeConverter`. 

 L’interface `DynamoDBTypeConverter` vous permet de mapper vos propres types de données arbitraires à un type de données que DynamoDB prend en charge en mode natif. Pour de plus amples informations, veuillez consulter [Mappage des données arbitraires dans DynamoDB](DynamoDBMapper.ArbitraryDataMapping.md).

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

Une annotation permettant de remplacer la liaison du type d’attribut standard. Les types standard ne nécessitent pas l’annotation si la liaison d’attribut par défaut est appliquée pour ce type. 

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

Identifie une propriété de classe pour stocker un numéro de version de verrouillage optimiste. `DynamoDBMapper` affecte un numéro de version à cette propriété lorsqu’il enregistre un nouvel élément et l’augmente chaque fois que vous mettez à jour l’élément. Seuls les types scalaires de numéros sont pris en charge. Pour plus d’informations sur les types de données, consultez [Types de données](HowItWorks.NamingRulesDataTypes.md#HowItWorks.DataTypes), Pour plus d’informations sur la gestion des versions, consultez [DynamoDB et verrouillage optimiste avec numéro de version](DynamoDBMapper.OptimisticLocking.md).

# Paramètres de configuration facultatifs pour Dynamo DBMapper
<a name="DynamoDBMapper.OptionalConfig"></a>

Lorsque vous créez une instance de `DynamoDBMapper`, elle a certains comportements par défaut ; vous pouvez remplacer ces valeurs par défaut en utilisant la classe `DynamoDBMapperConfig`. 

L’extrait de code suivant crée un `DynamoDBMapper` avec des paramètres personnalisés :

```
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);
```

Pour plus d'informations, consultez [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) dans le manuel de [référence de l'AWS SDK pour Java API](https://docs.aws.amazon.com/sdk-for-java/latest/reference/).

Vous pouvez utiliser les arguments suivants pour une instance de `DynamoDBMapperConfig` :
+ Une valeur d’énumération `DynamoDBMapperConfig.ConsistentReads` :
  + `EVENTUAL` – L’instance du mappeur utilise une demande de lecture éventuellement cohérente.
  + `CONSISTENT` – L’instance du mappeur utilise une demande de lecture fortement cohérente. Vous pouvez utiliser ce paramètre facultatif avec des opérations `load`, `query` ou `scan`. Les lectures fortement cohérentes ont des implications pour les performances et la facturation. Pour plus d’informations, consultez la [page détaillée du produit](https://aws.amazon.com/dynamodb).

  Si vous ne spécifiez pas un paramètre de cohérence de lecture pour votre instance d’outil de mappage, la valeur par défaut est `EVENTUAL`.
**Note**  
Cette valeur est appliquée dans les `batch load` opérations `query``querypage`,`load`, et de la Dynamo. DBMapper
+ Valeur d’énumération `DynamoDBMapperConfig.PaginationLoadingStrategy` – Contrôle la façon dont l’instance de mappeur traite une liste paginée de données, telle que les résultats d’une opération `query` ou `scan` :
  + `LAZY_LOADING` – L’instance de mappeur charge les données quand cela est possible, et conserve tous les résultats chargés en mémoire.
  + `EAGER_LOADING` – L’instance de mappeur charge les données dès que la liste est initialisée.
  + `ITERATION_ONLY` – Vous ne pouvez utiliser qu’un itérateur pour lire la liste. Pendant l’itération, la liste efface tous les résultats précédents avant de charger la page suivante, pour que la liste conserve en mémoire au maximum une page des résultats chargés. Cela signifie également que la liste ne peut être itérée qu’à une seule reprise. Cette stratégie est recommandée lors de la gestion d’éléments importants, afin de réduire les frais généraux de mémoire.

  Si vous ne spécifiez pas une stratégie de chargement de pagination pour votre instance d’outil de mappage, la valeur par défaut est `LAZY_LOADING`.
+ Une valeur d’énumération `DynamoDBMapperConfig.SaveBehavior` - Spécifie comment l’instance d’outil de mappage devrait traiter les attributs lors des opérations d’enregistrement :
  + `UPDATE` – Lors d’une opération d’enregistrement, tous les attributs modélisés sont mis à jour, et les attributs non modélisés ne sont pas affectés. Les types de numéros primitifs (octets, int, long) sont définis sur 0. Les types d’objets sont définis sur null. 
  + `CLOBBER` – Efface et remplace tous les attributs, y compris non modélisés, lors d’une opération d’enregistrement. Pour cela, il faut supprimer l’élément et le recréer. Les contraintes de champ avec version sont également ignorées.

   Si vous ne spécifiez pas le comportement de sauvegarde pour votre instance d’outil de mappage, la valeur par défaut est `UPDATE`.
**Note**  
Les opérations DBMapper transactionnelles Dynamo ne prennent pas en charge `DynamoDBMapperConfig.SaveBehavior` l'énumération. 
+ Objet `DynamoDBMapperConfig.TableNameOverride` – Indique à l’instance de mappeur d’ignorer le nom de table spécifié par l’annotation `DynamoDBTable` d’une classe, et d’utiliser plutôt un autre nom de table que vous fournissez. Cela est utile lors du partitionnement de vos données dans plusieurs tables au moment de l’exécution. 

Vous pouvez remplacer l’objet de configuration par défaut pour `DynamoDBMapper` par opération, en fonction des besoins.

# DynamoDB et verrouillage optimiste avec numéro de version
<a name="DynamoDBMapper.OptimisticLocking"></a>

Le *verrouillage optimiste* est une politique visant à garantir que l’élément côté client que vous mettez à jour (ou supprimez) est identique à l’élément dans Amazon DynamoDB. Si vous utilisez cette stratégie, les écritures de votre base de données ne peuvent pas être remplacées par les écritures d’autres, et vice versa.

Avec le verrouillage optimiste, chaque élément possède un attribut qui agit comme un numéro de version. Si vous récupérez un élément à partir d’une table, l’application enregistre le numéro de version de cet élément. Vous pouvez mettre à jour l’élément, mais uniquement si le numéro de version sur le côté serveur n’a pas changé. Si les versions ne correspondent pas, cela signifie que quelqu’un d’autre a modifié cet élément avant vous. La tentative de mise à jour échoue car vous possédez une version obsolète de l’élément. Si cela se produit, essayez à nouveau en récupérant l’élément, puis en tentant de le mettre à jour. Le verrouillage optimiste vous empêche de remplacer accidentellement les modifications effectuées par les autres. Il empêche également que vos modifications soient remplacées.

Bien que vous puissiez mettre en œuvre votre propre stratégie de verrouillage optimiste, AWS SDK pour Java elle fournit l'`@DynamoDBVersionAttribute`annotation. Dans la classe de mappage pour votre table, vous indiquez une propriété pour stocker le numéro de version et vous la marquez à l’aide de cette annotation. Lorsque vous enregistrez un objet, l’élément correspondant dans la table DynamoDB aura un attribut qui stocke le numéro de version. Le `DynamoDBMapper` attribue un numéro de version lors de l’enregistrement initial de l’objet, et il augmente automatiquement le numéro de version chaque fois que vous mettez à jour l’élément. Vos demandes de mise à jour ou de suppression aboutissent uniquement si la version d’objet côté client correspond au numéro de version de l’élément correspondant dans la table DynamoDB.

 `ConditionalCheckFailedException` est émis si : 
+  Vous utilisez le verrouillage optimiste avec `@DynamoDBVersionAttribute` et la valeur de version sur le serveur est différente de la valeur côté client. 
+  Vous spécifiez vos propres contraintes conditionnelles tout en enregistrant des données à l’aide de `DynamoDBMapper` avec `DynamoDBSaveExpression` et ces contraintes ont échoué. 

**Note**  
Les tables globales DynamoDB utilisent un rapprochement « last writer wins » (dernière version valide) entre des mises à jour concomitantes. Si vous utilisez des tables globales, la stratégie « last writer wins » (dernière version valide) s’applique. Dans ce cas, la stratégie de verrouillage ne fonctionne pas comme prévu.
Les opérations d’écriture transactionnelle `DynamoDBMapper` ne prennent pas en charge les expressions d’annotation et de condition `@DynamoDBVersionAttribute` sur le même objet. Si un objet dans une écriture transactionnelle est annoté avec une expression `@DynamoDBVersionAttribute` conditionnelle et possède également une expression conditionnelle, une SdkClientException sera émise.

Par exemple, le code Java suivant définit une classe `CatalogItem` qui possède plusieurs propriétés. La propriété `Version` est balisée avec l’annotation `@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;}
}
```

Vous pouvez appliquer l’annotation `@DynamoDBVersionAttribute` aux types Nullable proposés par les classes de wrappers primitifs qui fournissent un type Nullable, par exemple `Long` et `Integer`. 

Le verrouillage optimiste a l’impact suivant sur ces méthodes `DynamoDBMapper` :
+ `save` – Pour un nouvel élément, le `DynamoDBMapper` attribue un numéro de version initial 1. Si vous récupérez un élément, que vous mettez à jour une ou plusieurs de ses propriétés et que vous tentez d’enregistrer les modifications, l’opération de sauvegarde n’aboutit que si les numéros de version côté client et côté serveur correspondent. Le `DynamoDBMapper` augmente le numéro de version automatiquement.
+ `delete` – La méthode `delete` prend un objet en tant que paramètre, et le `DynamoDBMapper` effectue une vérification de version avant de supprimer l’élément. Le contrôle de version peut être désactivé si `DynamoDBMapperConfig.SaveBehavior.CLOBBER` est spécifié dans la demande.

  L’implémentation interne de verrouillage optimiste au sein de `DynamoDBMapper` utilise la prise en charge de suppression et de mise à jour conditionnelles fournies par DynamoDB. 
+ `transactionWrite` —
  + `Put` – Pour un nouvel élément, le `DynamoDBMapper` attribue un numéro de version initial 1. Si vous récupérez un élément, que vous mettez à jour une ou plusieurs de ses propriétés et que vous tentez d’enregistrer les modifications, l’opération « Put » n’aboutit que si les numéros de version côté client et côté serveur correspondent. Le `DynamoDBMapper` augmente le numéro de version automatiquement.
  + `Update` – Pour un nouvel élément, le `DynamoDBMapper` attribue un numéro de version initial 1. Si vous récupérez un élément, que vous mettez à jour une ou plusieurs de ses propriétés et que vous tentez d’enregistrer les modifications, l’opération de mise à jour n’aboutit que si les numéros de version côté client et côté serveur correspondent. Le `DynamoDBMapper` augmente le numéro de version automatiquement.
  + `Delete` – Le `DynamoDBMapper` effectue une vérification de version avant de supprimer l’élément. L’opération de suppression n’aboutit que si les numéros de version côté client et côté serveur correspondent.
  + `ConditionCheck` – L’annotation `@DynamoDBVersionAttribute` n’est pas prise en charge pour les opérations `ConditionCheck`. Un SdkClientException sera lancé lorsqu'un `ConditionCheck` élément est annoté avec`@DynamoDBVersionAttribute`. 

## Désactivation du verrouillage optimiste
<a name="DynamoDBMapper.OptimisticLocking.Disabling"></a>

Pour désactiver le verrouillage optimiste, vous pouvez changer la valeur d’énumération `DynamoDBMapperConfig.SaveBehavior` de `UPDATE` à `CLOBBER`. Vous pouvez le faire en créant une instance `DynamoDBMapperConfig` qui ignore la vérification de version et utilise cette instance pour toutes vos demandes. Pour plus d’informations sur les paramètres `DynamoDBMapperConfig.SaveBehavior` et autres paramètres facultatifs `DynamoDBMapper`, consultez [Paramètres de configuration facultatifs pour Dynamo DBMapper](DynamoDBMapper.OptionalConfig.md). 

Vous pouvez également définir le comportement de verrouillage pour une opération spécifique uniquement. Par exemple, l’extrait de Java suivant utilise le `DynamoDBMapper` pour enregistrer un élément de catalogue. Il spécifie `DynamoDBMapperConfig.SaveBehavior` en ajoutant le paramètre `DynamoDBMapperConfig` facultatif à la méthode `save`. 

**Note**  
La méthode TransactionWrite ne prend pas en charge Dynamo Config. DBMapper SaveBehaviorconfiguration. La désactivation du verrouillage optimiste pour transactionWrite n’est pas prise en charge.

**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));
```

# Mappage des données arbitraires dans DynamoDB
<a name="DynamoDBMapper.ArbitraryDataMapping"></a>

En plus des types Java pris en charge (voir [Types de données pris en charge pour Dynamo DBMapper pour Java](DynamoDBMapper.DataTypes.md)), vous pouvez utiliser des types dans votre application pour lesquels il n’y a pas de mappage direct aux types Amazon DynamoDB. Pour mapper ces types, vous devez fournir une implémentation qui convertit votre type complexe en un type pris en charge par DynamoDB et inversement, et annoter la méthode accesseur de type complexe en utilisant l’annotation `@DynamoDBTypeConverted`. Le code de convertisseur transforme les données lorsque des objets sont enregistrés ou chargés. Il est également utilisé pour toutes les opérations qui utilisent des types complexes. Notez que, lors de la comparaison de données pendant des opérations d’interrogation et d’analyse, les comparaisons sont faites par rapport aux données stockées dans DynamoDB.

Par exemple, envisagez la classe `CatalogItem` suivante qui définit une propriété, `Dimension`, qui est de `DimensionType`. Cette propriété stocke les dimensions de l’élément, telles que la hauteur, la largeur et l’épaisseur. Supposons que vous décidez de stocker ces dimensions d’élément sous la forme d’une chaîne (par exemple, 8.5x11x.05) dans DynamoDB. L’exemple suivant fournit un code de convertisseur qui convertit l’objet `DimensionType` en une chaîne et une chaîne en `DimensionType`.



**Note**  
Cet exemple de code part du principe que vous avez déjà chargé des données dans DynamoDB pour votre compte en suivant les instructions de la section [Création de tables et chargement de données pour des exemples de code dans DynamoDB](SampleData.md).  
Pour step-by-step obtenir des instructions relatives à l'exécution de l'exemple suivant, reportez-vous à[Exemples de code 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;
        }
    }
}
```

# Exemples DynamoDBMapper
<a name="DynamoDBMapper.Examples"></a>

Le kit AWS SDK fournit une classe `DynamoDBMapper` qui vous permet de mapper vos classes côté client à des tables DynamoDB. Pour utiliser `DynamoDBMapper`, vous définissez la relation entre éléments d’une table DynamoDB et leurs instances d’objet correspondantes dans votre code. La classe `DynamoDBMapper` vous permet d’effectuer diverses opérations de création, de lecture, de mise à jour et de suppression (opérations CRUD) sur des éléments, ainsi que d’exécuter des requêtes et analyses sur des tables.

Pour en savoir plus sur l’utilisation de `DynamoDBMapper`, consultez [DynamoDB Examples Using the AWS SDK for Java ](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-dynamodb.html) dans le *Guide du développeur AWS SDK for Java 1.x*. 

# Java 2.x : client amélioré DynamoDB
<a name="DynamoDBEnhanced"></a>

Le client amélioré DynamoDB est une bibliothèque de haut niveau qui fait partie du kit AWS SDK pour Java version 2 (v2). Il offre un moyen simple de mapper des classes côté client à des tables DynamoDB. Vous définissez les relations entre des tables et leurs classes de modèle correspondantes dans votre code. Après avoir défini ces relations, vous pouvez effectuer de manière intuitive diverses opérations de création, de lecture, de mise à jour ou de suppression (CRUD) sur des tables ou des éléments dans DynamoDB.

Pour plus d'informations sur l'utilisation du client amélioré avec DynamoDB, consultez [Utilisation du client amélioré DynamoDB dans le kit AWS SDK pour Java version 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/dynamodb-enhanced-client.html). 

# Utilisation du modèle de document .NET dans DynamoDB
<a name="DotNetSDKMidLevel"></a>

AWS SDK pour .NET fournit des classes de modèle de document qui encapsulent certaines opérations Amazon DynamoDB de bas niveau pour simplifier davantage votre codage. Dans le modèle de document, les classes principales sont `Table` et `Document`. La classe `Table` fournit des méthodes d’opération de données telles que `PutItem`, `GetItem` et `DeleteItem`. Elle fournit aussi les méthodes `Query` et `Scan`. La classe `Document` représente un seul élément d’une table.

Les classes de modèle de document précédentes sont disponibles dans l’espace de noms `Amazon.DynamoDBv2.DocumentModel`.

**Note**  
Vous ne pouvez pas utiliser les classes de modèle de document pour créer, mettre à jour et supprimer des tables. Cependant, le modèle de document ne prend pas en charge les opérations de données les plus courantes.

**Topics**
+ [Types de données pris en charge](#MidLevelAPILimitations.SupportedTypes)

## Types de données pris en charge
<a name="MidLevelAPILimitations.SupportedTypes"></a>

Le modèle de document prend en charge un ensemble de types de données .NET primitifs et de types de données de collections. Le modèle prend en charge les types de données primitifs suivants. 
+ `bool`
+ `byte` 
+ `char`
+ `DateTime`
+ `decimal`
+ `double`
+ `float`
+ `Guid`
+ `Int16`
+ `Int32`
+ `Int64`
+ `SByte`
+ `string`
+ `UInt16`
+ `UInt32`
+ `UInt64`

Le tableau suivant résume le mappage des types .NET précédents aux types DynamoDB.


****  

| Type primitif .NET | Type DynamoDB | 
| --- | --- | 
|  Tous les types de numéro  |  `N` (type Number)  | 
|  Tous types de chaînes  |  `S` (type String)   | 
|  MemoryStream, byte[]  |  `B` (type Binary)   | 
| bool | N (type de nombre). 0 représente false et 1 représente true. | 
| DateTime | S (type String). Les valeurs DateTime sont stockées comme chaînes de format ISO-8601. | 
| Guid | S (type String). | 
| Types de collection (liste, HashSet et tableau) | Type BS (ensemble de binaires), type SS (ensemble de chaînes) ou type NS (ensemble de nombres). | 

AWS SDK pour .NET définit les types de mappages (boolean (booléen), null (nul), list (liste) et map (mappage) de DynamoDB à l’API de modèle de document .NET :
+ Utilisez `DynamoDBBool` pour le type booléen.
+ Utilisez `DynamoDBNull` pour le type null.
+ Utilisez `DynamoDBList` pour le type list.
+ Utilisez `Document` pour le type map.

**Note**  
Les valeurs binaires vides sont prises en charge.
La lecture des valeurs de chaîne vides est prise en charge. Les valeurs d’attribut de chaîne vides sont prises en charge dans les valeurs d’attribut de type de chaîne Set lors de l’écriture dans DynamoDB. Les valeurs d’attribut de chaîne vides de type String et les valeurs de chaîne vides contenues dans le type List ou Map sont supprimées des demandes d’écriture.

# Utilisation du modèle de persistance des objets .NET et de DynamoDB
<a name="DotNetSDKHighLevel"></a>

 AWS SDK pour .NET fournit un modèle de persistance des objets qui vous permet de mapper vos classes côté client aux tables Amazon DynamoDB. Ensuite, chaque instance d’objet est mappée à un élément des tables correspondantes. Pour enregistrer vos objets côté client dans les tables, le modèle de persistance des objets fournit la classe `DynamoDBContext`, un point d’entrée dans DynamoDB. Cette classe fournit une connexion à DynamoDB, et vous permet d’accéder aux tables, d’effectuer diverses opérations CRUD ainsi que d’exécuter des requêtes.

Le modèle de persistance des objets fournit un ensemble d'attributs permettant de mapper les classes côté client aux tables et properties/fields aux attributs des tables.

**Note**  
Le modèle de persistance des objets n’autorise pas une API à créer, mettre à jour ou supprimer des tables. Il fournit uniquement des opérations sur les données. Vous ne pouvez utiliser que l'API de AWS SDK pour .NET bas niveau pour créer, mettre à jour et supprimer des tables.

L’exemple suivant montre le fonctionnement du modèle de persistance des objets. Il commence par la table `ProductCatalog`. Sa clé primaire est `Id`.

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

Supposons que vous avec une classe `Book` avec les propriétés `Title`, `ISBN` et `Authors`. Vous pouvez mapper la classe `Book` à la table `ProductCatalog` en ajoutant les attributs définis par le modèle de persistance des objets, comme illustré dans l’exemple de code C\$1 suivant.

**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; }
  }
```

Dans l’exemple précédent, l’attribut `DynamoDBTable` mappe la classe `Book` à la table `ProductCatalog`.

Le modèle de persistance des objets prend en charge les mappages explicite et par défaut entre les propriétés de classe et les attributs de table.
+ **Mappage explicite – **Pour mapper une propriété à une clé primaire, vous devez utiliser les attributs de modèle de persistance des objets `DynamoDBHashKey` et `DynamoDBRangeKey`. En outre, pour les attributs de clé non primaire, si un nom de propriété de votre classe et l’attribut de table correspondant auquel vous voulez le mapper ne sont pas identiques, vous devez définir le mappage en ajoutant explicitement l’attribut `DynamoDBProperty`.

  Dans l’exemple précédent, la propriété `Id` mappe à la clé primaire du même nom, et la propriété `BookAuthors` mappe à l’attribut `Authors` dans la table `ProductCatalog`.
+ **Mappage par défaut – **Par défaut, le modèle de persistance des objets mappe les propriétés de classe aux attributs du même nom dans la table.

  Dans l’exemple précédent, les propriétés `Title` et `ISBN` mappent aux attributs du même nom dans la table `ProductCatalog`.

Vous n’avez pas à mapper chaque propriété de classe. Vous identifiez ces propriétés en ajoutant l’attribut `DynamoDBIgnore`. Lorsque vous enregistrez une instance `Book` dans la table, le `DynamoDBContext` n’inclut pas la propriété `CoverPage`. Il ne renvoie pas non plus cette propriété lorsque vous récupérez l’instance livre.

Vous pouvez mapper des propriétés de types primitifs .NET tels que int et string. Vous pouvez également mapper n’importe quels types de données arbitraires tant que vous fournissez un convertisseur approprié pour mapper les données arbitraires à l’un des types DynamoDB. Pour en savoir plus sur le mappage de types arbitraires, consultez [Mappage de données arbitraires avec DynamoDB à l'aide AWS SDK pour .NET du modèle de persistance des objets](DynamoDBContext.ArbitraryDataMapping.md).

Le modèle de persistance des objets prend en charge le verrouillage optimiste. Au cours d’une opération de mise à jour, cela garantit que vous disposez de la dernière copie de l’élément que vous êtes sur le point de mettre à jour. Pour de plus amples informations, veuillez consulter [Verrouillage optimiste à l'aide de DynamoDB et du modèle de persistance des objets AWS SDK pour .NET](DynamoDBContext.VersionSupport.md).

Pour plus d’informations, consultez les rubriques ci-dessous.

**Topics**
+ [Types de données pris en charge](#DotNetDynamoDBContext.SupportedTypes)
+ [Attributs DynamoDB du modèle de persistance des objets .NET](DeclarativeTagsList.md)
+ [DBContext Classe Dynamo issue du modèle de persistance des objets .NET](DotNetDynamoDBContext.md)
+ [Verrouillage optimiste à l'aide de DynamoDB et du modèle de persistance des objets AWS SDK pour .NET](DynamoDBContext.VersionSupport.md)
+ [Mappage de données arbitraires avec DynamoDB à l'aide AWS SDK pour .NET du modèle de persistance des objets](DynamoDBContext.ArbitraryDataMapping.md)

## Types de données pris en charge
<a name="DotNetDynamoDBContext.SupportedTypes"></a>

Le modèle de persistance des objets prend en charge un ensemble de types de données .NET primitifs, de collections et de types de données arbitraires. Le modèle prend en charge les types de données primitifs suivants. 
+ `bool`
+ `byte` 
+ `char`
+ `DateTime`
+ `decimal`
+ `double`
+ `float`
+ `Int16`
+ `Int32`
+ `Int64`
+ `SByte`
+ `string`
+ `UInt16`
+ `UInt32`
+ `UInt64`

Le modèle de persistance des objets prend également en charge les types de collection .NET. `DynamoDBContext`est capable de convertir des types de collection concrets et de simples objets CLR ordinaires (POCOs).

Le tableau suivant résume le mappage des types .NET précédents aux types DynamoDB.


****  

| Type primitif .NET | Type DynamoDB | 
| --- | --- | 
|  Tous les types de numéro  |  `N` (type Number)  | 
|  Tous types de chaînes  |  `S` (type String)   | 
|  MemoryStream, octet []  |  `B` (type Binary)   | 
| bool | N (type de nombre). 0 représente false et 1 représente true. | 
| Types de collections | Type BS (ensemble de binaires), type SS (ensemble de chaînes) ou type NS (ensemble de nombres). | 
| DateTime | S (type String). Les valeurs DateTime sont stockées comme chaînes de format ISO-8601. | 

Le modèle de persistance des objets prend également en charge les types de données arbitraires. Toutefois, vous devez fournir un code de convertisseur pour mapper les types complexes aux types DynamoDB.

**Note**  
Les valeurs binaires vides sont prises en charge.
La lecture des valeurs de chaîne vides est prise en charge. Les valeurs d’attribut de chaîne vides sont prises en charge dans les valeurs d’attribut de type de chaîne Set lors de l’écriture dans DynamoDB. Les valeurs d’attribut de chaîne vides de type String et les valeurs de chaîne vides contenues dans le type List ou Map sont supprimées des demandes d’écriture.

# Attributs DynamoDB du modèle de persistance des objets .NET
<a name="DeclarativeTagsList"></a>

Cette section décrit les attributs qu’offre le modèle de persistance des objets afin que vous puissiez mapper vos classes et propriétés aux tables et attributs DynamoDB.

**Note**  
Dans les attributs suivants, seuls les attributs `DynamoDBTable` et `DynamoDBHashKey` sont obligatoires.

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

Mappe une propriété de classe à la clé de partition d’un index secondaire global. Utilisez cet attribut si vous devez interroger (`Query`) un index secondaire global.

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

Mappe une propriété de classe à la clé de tri d’un index secondaire global. Utilisez cet attribut si vous devez interroger (`Query`) un index secondaire global, et souhaitez affiner vos résultats à l’aide de la clé de tri d’index.

## Clé Dynamo DBHash
<a name="w2aac17b9c21c23c37c11"></a>

Mappe une propriété de classe à la clé de partition de la clé primaire de la table. Les attributs de clé primaire ne peuvent pas être de type collection.

L’exemple de code C\$1 suivant mappe la classe `Book` à la table `ProductCatalog`, et la propriété `Id` à la clé de partition de clé primaire de la table.

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

    // Additional properties go here.
}
```

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

Indique que la propriété associée devrait être ignorée. Si vous ne souhaitez enregistrer aucune de vos propriétés de classe, vous pouvez ajouter cet attribut afin de demander à `DynamoDBContext` de ne pas inclure cette propriété lors de l’enregistrement d’objets dans la table.

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

Mappe une propriété de classe à la clé de tri d’un index secondaire local. Utilisez cet attribut si vous devez interroger (`Query`) un index secondaire local, et souhaitez affiner vos résultats à l’aide de la clé de tri d’index.

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

Mappe une propriété de classe à un attribut de table. Si la propriété de classe mappe à un attribut de table du même nom, vous n’avez pas besoin de spécifier cet attribut. Toutefois, si les noms ne sont pas les mêmes, vous pouvez utiliser cette étiquette pour indiquer le mappage. Dans l’instruction C\$1 suivante, la `DynamoDBProperty` mappe la propriété `BookAuthors` à l’attribut `Authors` dans la table. 

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

`DynamoDBContext` utilise ces informations de mappage pour créer l’attribut `Authors` lors de l’enregistrement de données d’objet dans la table correspondante.

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

Spécifie un autre nom pour une propriété de classe. Ceci est utile si vous écrivez un convertisseur personnalisé pour mapper des données arbitraires à une table DynamoDB où le nom d’une propriété de classe diffère du nom d’un attribut de table.

## Clé Dynamo DBRange
<a name="w2aac17b9c21c23c37c21"></a>

Mappe une propriété de classe à la clé de tri de la clé primaire de la table. Si la table possède une clé primaire composite (clé de partition et clé de tri), vous devez spécifier les attributs `DynamoDBHashKey` et `DynamoDBRangeKey` dans votre mappage de classe.

Par exemple, l’exemple de table `Reply` a une clé primaire composée de la clé de partition `Id` et de la clé de tri `Replenishment`. L’exemple de code C\$1 suivant mappe la classe `Reply` à la table `Reply`. La définition de classe indique également que deux de ses propriétés mappent à la clé primaire.

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

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

Identifie la table cible dans DynamoDB à laquelle la classe mappe. Par exemple, l’exemple de code C\$1 suivant mappe la classe `Developer` à la table `People` dans DynamoDB.

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

Cet attribut peut être hérité ou remplacé.
+ L’attribut `DynamoDBTable` peut être hérité. Dans l’exemple précédent, si vous ajoutez une nouvelle classe, `Lead`, qui hérite de la classe `Developer`, elle mappe également à la table `People`. Les objets `Developer` et `Lead` sont stockés dans la table `People`.
+ L’attribut `DynamoDBTable` peut également être remplacé. Dans l’exemple de code C\$1 suivant, la classe `Manager` hérite de la classe `Developer`. Cependant, l’ajout explicite de l’attribut `DynamoDBTable` a pour effet de mapper la classe à une autre table (`Managers`).

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

 Vous pouvez ajouter le paramètre facultatif, `LowerCamelCaseProperties`, pour demander à DynamoDB de mettre la première lettre du nom de propriété en minuscule lors du stockage des objets dans une table, comme dans l’exemple C\$1 suivant.

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

Lors de l’enregistrement d’instances de la classe `Developer`, `DynamoDBContext` enregistre la propriété `DeveloperName` en tant que `developerName`.

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

Identifie une propriété de classe pour stocker le numéro de version de l’élément. Pour plus d’informations sur la gestion des versions, consultez [Verrouillage optimiste à l'aide de DynamoDB et du modèle de persistance des objets AWS SDK pour .NET](DynamoDBContext.VersionSupport.md).

# DBContext Classe Dynamo issue du modèle de persistance des objets .NET
<a name="DotNetDynamoDBContext"></a>

La classe `DynamoDBContext` est le point d’entrée de la base de données Amazon DynamoDB. Elle fournit une connexion à DynamoDB, et vous permet d’accéder à vos données dans diverses tables, d’effectuer diverses opérations CRUD, ainsi que d’exécuter des requêtes. La classe `DynamoDBContext` fournit les méthodes suivantes.

**Topics**
+ [Créez MultiTable BatchGet](#w2aac17b9c21c23c39b7)
+ [Créez MultiTable BatchWrite](#w2aac17b9c21c23c39b9)
+ [CreateBatchGet](#w2aac17b9c21c23c39c11)
+ [CreateBatchWrite](#w2aac17b9c21c23c39c13)
+ [Suppression](#w2aac17b9c21c23c39c15)
+ [Dispose](#w2aac17b9c21c23c39c17)
+ [ExecuteBatchGet](#w2aac17b9c21c23c39c19)
+ [ExecuteBatchWrite](#w2aac17b9c21c23c39c21)
+ [FromDocument](#w2aac17b9c21c23c39c23)
+ [FromQuery](#w2aac17b9c21c23c39c25)
+ [FromScan](#w2aac17b9c21c23c39c27)
+ [GetTargetTable](#w2aac17b9c21c23c39c29)
+ [Equilibreur de](#w2aac17b9c21c23c39c31)
+ [Query](#w2aac17b9c21c23c39c33)
+ [Enregistrer](#w2aac17b9c21c23c39c35)
+ [Analyser](#w2aac17b9c21c23c39c37)
+ [ToDocument](#w2aac17b9c21c23c39c39)
+ [Spécification de paramètres facultatifs pour Dynamo DBContext](#OptionalConfigParams)

## Créez MultiTable BatchGet
<a name="w2aac17b9c21c23c39b7"></a>

Crée un objet `MultiTableBatchGet` composé de plusieurs objets `BatchGet`. Chacun de ces objets `BatchGet` peut être utilisé pour récupérer des éléments d’une table DynamoDB.

Pour récupérer les éléments des tables, utilisez la méthode `ExecuteBatchGet` en passant l’objet `MultiTableBatchGet` en tant que paramètre.

## Créez MultiTable BatchWrite
<a name="w2aac17b9c21c23c39b9"></a>

Crée un objet `MultiTableBatchWrite` composé de plusieurs objets `BatchWrite`. Chacun de ces objets `BatchWrite` peut être utilisé pour écrire ou supprimer des éléments dans une table DynamoDB.

Pour écrire dans des tables, utilisez la méthode `ExecuteBatchWrite` en passant l’objet `MultiTableBatchWrite` en tant que paramètre.

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

Crée un objet `BatchGet` que vous pouvez utiliser pour extraire plusieurs éléments d’une table. 

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

Crée un objet `BatchWrite` que vous pouvez utiliser pour insérer plusieurs éléments dans une table ou supprimer plusieurs éléments d’une table. 

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

Supprime un élément de la table. La méthode requiert la clé primaire de l’élément que vous souhaitez supprimer. Vous pouvez fournir en tant que paramètre à cette méthode la valeur de clé primaire ou un objet côté client contenant une valeur de clé primaire.
+ Si vous spécifiez un objet côté client en tant que paramètre et avez activé le verrouillage optimiste, la suppression ne réussit que si les versions côté client et côté serveur de l’objet correspondent.
+ Si vous spécifiez uniquement la valeur de clé primaire en tant que paramètre, la suppression réussit, que vous ayez activé ou non le verrouillage optimiste.

**Note**  
Pour effectuer cette opération en arrière-plan, utilisez la méthode `DeleteAsync` à la place.

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

Élimine toutes les ressources gérées et non gérées.

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

Lit les données d’une ou plusieurs tables, en traitant tous les objets `BatchGet` en un objet `MultiTableBatchGet`.

**Note**  
Pour effectuer cette opération en arrière-plan, utilisez la méthode `ExecuteBatchGetAsync` à la place.

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

Ecrit ou supprime des données dans une ou plusieurs tables, en traitant tous les objets `BatchWrite` en un objet `MultiTableBatchWrite`.

**Note**  
Pour effectuer cette opération en arrière-plan, utilisez la méthode `ExecuteBatchWriteAsync` à la place.

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

Pour une instance de `Document`, la méthode `FromDocument` renvoie une instance d'une classe côté client.

Ceci est utile si vous souhaitez utiliser les classes de modèle de document avec le modèle de persistance des objets pour effectuer des opérations de données. Pour plus d'informations sur les classes de modèles de documents fournies par le AWS SDK pour .NET, consultez[Utilisation du modèle de document .NET dans DynamoDB](DotNetSDKMidLevel.md).

Supposons que vous ayez un objet `Document` nommé `doc` qui contient une représentation d’un l’élément `Forum`. (Pour voir comment construire cet objet, consultez la description de la méthode `ToDocument`, plus loin dans cette rubrique. Vous pouvez utiliser le paramètre `FromDocument` pour récupérer l’élément `Forum` à partir de `Document`, comme illustré dans l’exemple de code C\$1 suivant.

**Example**  

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

**Note**  
Si votre objet `Document` implémente l’interface `IEnumerable`, vous pouvez utiliser la méthode `FromDocuments` à la place. Cela vous permet d'itérer sur toutes les instances de classe dans le `Document`.

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

Exécute une opération `Query` avec les paramètres de requête définis dans un objet `QueryOperationConfig`.

**Note**  
Pour effectuer cette opération en arrière-plan, utilisez la méthode `FromQueryAsync` à la place.

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

Exécute une opération `Scan` avec les paramètres d'analyse définis dans un objet `ScanOperationConfig`.

**Note**  
Pour effectuer cette opération en arrière-plan, utilisez la méthode `FromScanAsync` à la place.

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

Récupère la table cible pour le type spécifié. Ceci est utile si vous écrivez un convertisseur personnalisé pour mapper des données arbitraires à une table DynamoDB, et devez déterminer la table associée à un type de données personnalisé.

## Equilibreur de
<a name="w2aac17b9c21c23c39c31"></a>

Récupère un élément dans une table. La méthode requiert uniquement la clé primaire de l’élément que vous souhaitez extraire. 

Par défaut, DynamoDB renvoie l’élément ayant des valeurs éventuellement cohérentes. Pour plus d’informations sur le modèle de cohérence éventuelle, consultez [Cohérence en lecture DynamoDB](HowItWorks.ReadConsistency.md).

`Load`ou la `LoadAsync` méthode appelle l'[GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)opération, qui vous oblige à spécifier la clé primaire de la table. Comme `GetItem` ignore le paramètre `IndexName`, vous ne pouvez pas charger un élément à l’aide de la partition ou de la clé de tri d’un index. Vous devez donc utiliser la clé primaire de la table pour charger un élément.

**Note**  
Pour effectuer cette opération en arrière-plan, utilisez la méthode `LoadAsync` à la place. Pour voir un exemple d’utilisation de la méthode `LoadAsync` pour effectuer des opérations CRUD de haut niveau sur une table DynamoDB, consultez l’exemple suivant.

```
    /// <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");
            }
        }
    }
```

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

Interroge une table sur la base des paramètres de requête que vous fournissez.

Vous pouvez interroger une table uniquement si elle comporte une clé primaire composite (clé de partition et clé de tri). Lors de l’interrogation, vous devez spécifier une clé de partition et une condition qui s’applique à la clé de tri.

Supposons que vous disposez d’une classe `Reply` côté client mappée à la table `Reply` dans DynamoDB. L’exemple de code C\$1 suivant interroge la table `Reply` pour trouver les réponses des unités d’exécution de forum publiées au cours des 15 derniers jours. La table `Reply` possède une clé primaire qui a la clé de partition `Id` et la clé de tri `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);
```

Ceci renvoie une collection d’objets `Reply`. 

La méthode `Query` renvoie une collection `IEnumerable` « avec chargement différé ». Elle ne renvoie initialement qu’une seule page de résultats puis effectue un appel de service pour la page suivante si nécessaire. Pour obtenir tous les éléments correspondants, vous devez itérer uniquement sur la collection `IEnumerable`.

Si votre table possède une clé primaire simple (clé de partition), vous ne pouvez pas utiliser la méthode `Query`. Au lieu de cela, vous pouvez utiliser la méthode `Load` et fournir la clé de partition pour récupérer l’élément.

**Note**  
Pour effectuer cette opération en arrière-plan, utilisez la méthode `QueryAsync` à la place.

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

Enregistre l’objet spécifié dans la table. Si la clé primaire spécifiée dans l’objet d’entrée n’existe pas dans la table, la méthode ajoute un nouvel élément à celle-ci. Si la clé primaire existe, la méthode met à jour l’élément existant.

Si le verrouillage optimiste est configuré, la mise à jour ne réussit que si les versions client et serveur de l’élément correspondent. Pour de plus amples informations, veuillez consulter [Verrouillage optimiste à l'aide de DynamoDB et du modèle de persistance des objets AWS SDK pour .NET](DynamoDBContext.VersionSupport.md).

**Note**  
Pour effectuer cette opération en arrière-plan, utilisez la méthode `SaveAsync` à la place.

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

Effectue une analyse de la table toute entière. 

Vous pouvez filtrer les résultats d’analyse en spécifiant une condition d’analyse. La condition peut être évaluée sur n’importe quel attribut dans la table. Supposons que vous disposez d’une classe `Book` côté client mappée à la table `ProductCatalog` dans DynamoDB. L’exemple C \$1 suivant analyse la table et renvoie uniquement les éléments livre dont le prix est inférieur à 0.

**Example**  

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

La méthode `Scan` renvoie une collection `IEnumerable` « avec chargement différé ». Elle ne renvoie initialement qu’une seule page de résultats puis effectue un appel de service pour la page suivante si nécessaire. Pour obtenir tous les éléments correspondants, vous devez seulement itérer sur la collection `IEnumerable`.

Pour des raisons de performance, vous devez interroger vos tables et éviter une analyse de table.

**Note**  
Pour effectuer cette opération en arrière-plan, utilisez la méthode `ScanAsync` à la place.

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

Renvoie une instance de la classe de modèle de document `Document` de votre instance de classe. 

Ceci est utile si vous souhaitez utiliser les classes de modèle de document avec le modèle de persistance des objets pour effectuer des opérations de données. Pour plus d'informations sur les classes de modèles de documents fournies par le AWS SDK pour .NET, consultez[Utilisation du modèle de document .NET dans DynamoDB](DotNetSDKMidLevel.md). 

Supposons que vous disposez d’une classe côté client mappée à l’exemple de table `Forum`. Vous pouvez ensuite utiliser un `DynamoDBContext` pour obtenir un élément en tant qu’objet `Document` à partir de la table `Forum`, comme illustré dans l’exemple de code C\$1 suivant.

**Example**  

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

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

## Spécification de paramètres facultatifs pour Dynamo DBContext
<a name="OptionalConfigParams"></a>

Lors de l’utilisation du modèle de persistance des objets, vous pouvez spécifier les paramètres facultatifs suivants pour le `DynamoDBContext`.
+ **`ConsistentRead` – **Lors de la récupération de données à l’aide des opérations `Load`, `Query` ou `Scan`, vous pouvez ajouter ce paramètre facultatif pour demander les dernières valeurs pour les données.
+ **`IgnoreNullValues` – **Ce paramètre informe `DynamoDBContext` d’ignorer les valeurs null sur les attributs lors d’une opération `Save`. Si ce paramètre a la valeur false (ou s’il n’est pas défini), une valeur null est interprétée comme une directive pour supprimer l’attribut spécifique. 
+ **`SkipVersionCheck` – **Ce paramètre informe `DynamoDBContext` ne pas comparer les versions lors de l’enregistrement ou de la suppression d’un élément. Pour plus d’informations sur la gestion des versions, consultez [Verrouillage optimiste à l'aide de DynamoDB et du modèle de persistance des objets AWS SDK pour .NET](DynamoDBContext.VersionSupport.md).
+ **`TableNamePrefix` – **Préfixe tous les noms de table avec une chaîne spécifique. Si ce paramètre a la valeur null (ou s’il n’est pas défini), aucun préfixe n’est utilisé.
+ `DynamoDBEntryConversion` – Spécifie le schéma de conversion utilisé par le client. Vous pouvez définir ce paramètre sur la version V1 ou V2. V1 est la version par défaut.

  En fonction de la version que vous définissez, le comportement de ce paramètre change. Par exemple :
  + Dans la version 1, le type de données `bool` est converti en type numérique `N`, où 0 représente false et 1 représente true. Dans la version 2, `bool` est converti en `BOOL`.
  + Dans la version 2, les listes et les tableaux ne sont pas regroupés avec HashSets. Les listes et tableaux de nombres, de types basés sur des chaînes et de types binaires sont convertis en type `L` (Liste), qui peut être envoyé vide pour mettre à jour une liste. Ce n’est pas le cas de la version 1, dans laquelle une liste vide n’est pas envoyée sur le réseau.

    Dans la version 1, les types de collection, tels que List HashSet, et les tableaux sont traités de la même manière. La liste et le tableau de chiffres sont convertis au type `NS` (ensemble de nombres). HashSet 

  L’exemple suivant définit la version du schéma de conversion sur V2, ce qui modifie le comportement de conversion entre les types .NET et les types de données DynamoDB.

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

L’exemple de code C\$1 suivant crée un nouveau `DynamoDBContext` en spécifiant deux des paramètres facultatifs précédents, `ConsistentRead` et `SkipVersionCheck`.

**Example**  

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

`DynamoDBContext` inclut ces paramètres facultatifs avec chaque demande que vous envoyez à l’aide de ce contexte. 

Au lieu de définir ces paramètres au niveau de `DynamoDBContext`, vous pouvez les spécifier pour des opérations individuelles que vous exécutez à l’aide de `DynamoDBContext`, comme illustré dans l’exemple de code C\$1 suivant. L’exemple charge un élément livre spécifique. La méthode `Load` de `DynamoDBContext` spécifie les paramètres facultatifs précédents, `ConsistentRead` et `SkipVersionCheck`.

**Example**  

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

Dans ce cas, `DynamoDBContext` inclut ces paramètres uniquement lors de l’envoi de la demande `Get`.

# Verrouillage optimiste à l'aide de DynamoDB et du modèle de persistance des objets AWS SDK pour .NET
<a name="DynamoDBContext.VersionSupport"></a>

La prise en charge du verrouillage optimiste dans le modèle de persistance des objets garantit que la version de l’élément pour votre application est identique à la version de l’élément côté serveur avant de mettre à jour ou de supprimer l’élément. Supposons que vous récupérez un élément à mettre à jour. Toutefois, avant de renvoyer vos mises à jour, une autre application met à jour le même élément. Maintenant, votre demande a une copie obsolète de l’élément. A défaut de verrouillage optimiste, toute mise à jour que vous effectuez remplace la mise à jour effectuée par l’autre application. 

La fonction de verrouillage optimiste du modèle de persistance des objets fournit l’étiquette `DynamoDBVersion` que vous pouvez utiliser pour activer le verrouillage optimiste. Pour utiliser cette fonctionnalité, vous ajoutez une propriété à votre classe pour stocker le numéro de version. Vous ajoutez l’attribut `DynamoDBVersion` à la propriété. Lorsque vous enregistrez l’objet pour la première fois, le `DynamoDBContext` attribue un numéro de version et incrémente cette valeur chaque fois que vous mettez à jour l’élément. 

Votre demande de mise à jour ou de suppression aboutit uniquement si la version de l’objet côté client correspond au numéro de version de l’élément côté serveur. Si votre application a une copie obsolète de l’élément, elle doit obtenir du serveur la dernière version de l’élément avant de pouvoir le mettre à jour ou le supprimer.

L’exemple de code C\$1 suivant définit une classe `Book` avec des attributs de persistance des objets qui la mappent à la table `ProductCatalog`. La propriété `VersionNumber` dans la classe décorée avec l’attribut `DynamoDBVersion` stocke la valeur du numéro de version.

**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; }
  }
```

**Note**  
Vous pouvez appliquer l’attribut `DynamoDBVersion` uniquement à un type primitif numérique nullable (tel que `int?`). 

Le verrouillage optimiste a l’impact suivant sur les opérations `DynamoDBContext` :
+ Pour un nouvel élément, `DynamoDBContext` attribue le numéro de version initial 0. Si vous récupérez un élément existant, mettez à jour une ou plusieurs de ses propriétés, puis tentez d’enregistrer les modifications, l’opération d’enregistrement n’aboutit que si les numéros de version côté client et côté serveur correspondent. `DynamoDBContext` incrémente le numéro de version. Vous n’avez pas besoin de définir le numéro de version.
+ La méthode `Delete` fournit des surcharges pouvant prendre une valeur de clé primaire ou un objet en tant que paramètre, comme illustré dans l’exemple de code C\$1 suivant.  
**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);
  ```

  Si vous fournissez un objet en tant que paramètre, la suppression ne réussit que si la version de l’objet correspond à la version de l’élément côté serveur. Toutefois, si vous fournissez une valeur de clé primaire en tant que paramètre, `DynamoDBContext` ne connaît aucun numéro de version, et supprime l’élément sans effectuer la vérification de version. 

  Notez que l’implémentation interne du verrouillage optimiste dans le code du modèle de persistance des objets utilise les actions d’API de mise à jour conditionnelle et de suppression conditionnelle dans DynamoDB.

## Désactivation du verrouillage optimiste
<a name="DotNetDynamoDBContext.DisablingOptimisticLocking"></a>

Pour désactiver le verrouillage optimiste, utilisez la propriété de configuration `SkipVersionCheck`. Vous pouvez définir cette propriété lors de la création de `DynamoDBContext`. Dans ce cas, le verrouillage optimiste est désactivé pour toutes les demandes que vous effectuez à l’aide du contexte. Pour de plus amples informations, veuillez consulter [Spécification de paramètres facultatifs pour Dynamo DBContext](DotNetDynamoDBContext.md#OptionalConfigParams). 

Au lieu de définir la propriété au niveau du contexte, vous pouvez désactiver le verrouillage optimiste pour une opération spécifique, comme dans l’exemple de code C\$1 suivant. L’exemple utilise le contexte pour supprimer un élément livre. La méthode `Delete` définit la propriété `SkipVersionCheck` sur true, ce qui a pour effet de désactiver la vérification de version.

**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 });
```

# Mappage de données arbitraires avec DynamoDB à l'aide AWS SDK pour .NET du modèle de persistance des objets
<a name="DynamoDBContext.ArbitraryDataMapping"></a>

En plus des types .NET pris en charge (voir [Types de données pris en charge](DotNetSDKHighLevel.md#DotNetDynamoDBContext.SupportedTypes)), vous pouvez utiliser des types dans votre application pour lesquels il n’y a pas de mappage direct aux types Amazon DynamoDB. Le modèle de persistance des objets prend en charge le stockage de données de types arbitraires tant que vous fournissez le convertisseur pour convertir les données du type arbitraire au type DynamoDB, et inversement. Le code de convertisseur transforme les données lors de l’enregistrement et du chargement des objets.

Vous pouvez créer n’importe quel type côté client. Cependant, les données stockées dans les tables sont l’un des types DynamoDB et, lors de la requête et de l’analyse, toutes les comparaisons de données effectuées sont faites par rapport aux données stockées dans DynamoDB.

L’exemple de code C\$1 suivant définit une classe `Book` avec les propriétés `Id`, `Title`, `ISBN` et `Dimension`. La propriété `Dimension` est du `DimensionType` qui décrit les propriétés `Height`, `Width` et `Thickness`. L’exemple de code fournit les méthodes de convertisseur `ToEntry` et `FromEntry` pour convertir les données entre le `DimensionType` et les types de chaîne DynamoDB. Par exemple, lors de l’enregistrement d’une instance `Book`, le convertisseur crée une chaîne de `Dimension` de livre telle que « 8.5x11x.05 ». Lorsque vous récupérez un livre, il convertit la chaîne en instance `DimensionType`.

L’exemple mappe le type `Book` à la table `ProductCatalog`. Il enregistre un exemple d’instance `Book`, le récupère, met à jour ses dimensions et enregistre de nouveau le `Book` mis à jour.



Pour step-by-step obtenir des instructions sur le test de l'exemple suivant, reportez-vous à[Exemples de code .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;
        }
    }
}
```

# Exécution des exemples de code du Guide du développeur
<a name="CodeSamples"></a>

Ils AWS SDKs fournissent un support étendu pour Amazon DynamoDB dans les langues suivantes :
+ [Java](https://aws.amazon.com/sdk-for-java)
+ [JavaScript dans le navigateur](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/)

Les exemples de code de ce guide du développeur couvrent de façon plus approfondie les opérations DynamoDB à l’aide des langages de programmation suivants :
+ [Exemples de code Java](CodeSamples.Java.md)
+ [Exemples de code .NET](CodeSamples.DotNet.md)

Avant de commencer cet exercice, vous devez créer un AWS compte, obtenir votre clé d'accès et votre clé secrète, puis configurer le AWS Command Line Interface (AWS CLI) sur votre ordinateur. Pour de plus amples informations, veuillez consulter [Configuration de DynamoDB (service web)](SettingUp.DynamoWebService.md).

**Note**  
Si vous utilisez la version téléchargeable de DynamoDB, vous devez utiliser AWS CLI le pour créer les tables et les exemples de données. Vous devez également spécifier le `--endpoint-url` paramètre pour chaque AWS CLI commande. Pour de plus amples informations, veuillez consulter [Définition du point de terminaison local](DynamoDBLocal.UsageNotes.md#DynamoDBLocal.Endpoint).

# Création de tables et chargement de données pour des exemples de code dans DynamoDB
<a name="SampleData"></a>

Vous trouverez ci-dessous des informations de base sur la création de tables dans DynamoDB, le chargement d'un exemple de jeu de données, l'interrogation des données et la mise à jour des données.
+ [Étape 1 : création d’une table dans DynamoDB](getting-started-step-1.md)
+ [Étape 2 : écrire des données dans une table DynamoDB](getting-started-step-2.md)
+ [Étape 3 : lire des données à partir d’une table DynamoDB](getting-started-step-3.md)
+ [Étape 4 : mettre à jour des données dans une table DynamoDB](getting-started-step-4.md)

# Exemples de code Java
<a name="CodeSamples.Java"></a>

**Topics**
+ [Java : Configuration de vos AWS informations d'identification](#CodeSamples.Java.Credentials)
+ [Java : définition de la AWS région et du point de terminaison](#CodeSamples.Java.RegionAndEndpoint)

Ce guide du développeur contient des extraits de code Java et ready-to-run des programmes. Vous pouvez trouver ces exemples de code dans les sections suivantes :
+ [Utilisation d’éléments et d’attributs dans DynamoDB](WorkingWithItems.md)
+ [Utilisation de tables et de données dans DynamoDB](WorkingWithTables.md)
+ [Interrogation de tables dans DynamoDB](Query.md)
+ [Analyse de tables dans DynamoDB](Scan.md)
+ [Amélioration de l’accès aux données avec les index secondaires dans DynamoDB](SecondaryIndexes.md)
+ [Java 1.x : Dynamo DBMapper](DynamoDBMapper.md)
+ [Modifier la récupération de données pour DynamoDB Streams](Streams.md)

Vous pouvez démarrer rapidement en utilisant Eclipse avec [AWS Toolkit for Eclipse](https://aws.amazon.com/eclipse/). En plus d'un IDE complet, vous bénéficiez également de mises à jour automatiques et de modèles préconfigurés pour créer AWS des applications. AWS SDK pour Java 

**Pour exécuter les exemples de code Java (à l’aide d’Eclipse)**

1. Téléchargez et installez l’IDE [Eclipse](http://www.eclipse.org).

1. Téléchargez et installez le kit [AWS Toolkit for Eclipse](https://aws.amazon.com/eclipse/).

1. Démarrez Eclipse et, dans le menu **Eclipse**, choisissez **File (Fichier)**, **New (Nouveau)**, puis **Other (Autre)**.

1. Dans **Sélectionner un assistant**, choisissez successivement **AWS**, **AWS Projet Java** et **Suivant**.

1. Dans **Create an AWS Java**, procédez comme suit :

   1. Dans **Project name (Nom de projet)**, saisissez un nom pour votre projet.

   1. Dans **Select Account**, choisissez votre profil d’informations d’identification dans la liste.

      Si c'est la première fois que vous utilisez le [AWS Toolkit for Eclipse](https://aws.amazon.com/eclipse/), choisissez **Configurer les AWS comptes** pour configurer vos AWS informations d'identification.

1. Choisissez **Finish** pour créer le projet.

1. Dans le menu **Eclipse**, choisissez **File**, **New**, puis **Class**.

1. Dans **Java Class (Classe Java)**, saisissez un nom pour votre classe dans **Name (Nom)** (utilisez le même nom que celui de l’exemple de code que vous souhaitez exécuter), puis choisissez **Finish (Terminer)** pour créer la classe.

1. Copiez l’exemple de code de la page de documentation dans l’éditeur Eclipse.

1. Pour exécuter le code, choisissez **Run (Exécuter)** dans le menu Eclipse.

Le kit SDK pour Java fournit des clients thread-safe à utiliser avec DynamoDB. En tant que bonne pratique, vos applications doivent créer un seul client et le réutiliser entre les threads.

Pour de plus amples informations, veuillez consulter [AWS SDK pour Java](https://aws.amazon.com/sdk-for-java).

**Note**  
Les exemples de code dans ce guide sont destinés à être utilisés avec la dernière version de AWS SDK pour Java.  
Si vous utilisez le AWS Toolkit for Eclipse, vous pouvez configurer des mises à jour automatiques pour le SDK for Java. Pour ce faire, dans Eclipse, allez dans **Préférences** et choisissez **AWS Toolkit**« **Télécharger le nouveau SDKs automatiquement** ». **AWS SDK pour Java**

## Java : Configuration de vos AWS informations d'identification
<a name="CodeSamples.Java.Credentials"></a>

Le SDK for Java nécessite que vous AWS fournissiez des informations d'identification à votre application lors de l'exécution. Les exemples de code présentés dans ce guide supposent que vous utilisez un fichier d' AWS informations d'identification, comme décrit dans la section [Configurer vos AWS informations d'identification](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/set-up-creds.html) dans le *guide du AWS SDK pour Java développeur*.

Voici un exemple de fichier d' AWS informations d'identification nommé`~/.aws/credentials`, où le caractère tilde (`~`) représente votre répertoire personnel.

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

## Java : définition de la AWS région et du point de terminaison
<a name="CodeSamples.Java.RegionAndEndpoint"></a>

Par défaut, les exemples de code accèdent à DynamoDB dans la région USA Ouest (Oregon). Vous pouvez modifier la région en modifiant les propriétés `AmazonDynamoDB`.

L’exemple de code suivant instancie un nouvel `AmazonDynamoDB`.

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

Vous pouvez utiliser la méthode `withRegion` pour exécuter votre code sur DynamoDB dans n’importe quelle région où il est disponible. Pour obtenir la liste complète, consultez [Régions et points de terminaison AWS](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region) dans le *Référence générale d'Amazon Web Services*.

Si vous souhaitez exécuter les exemples de code à l’aide de DynamoDB localement sur votre ordinateur, définissez le point de terminaison comme suit.

### 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();
```

# Exemples de code .NET
<a name="CodeSamples.DotNet"></a>

**Topics**
+ [.NET : Configuration de vos AWS informations d'identification](#CodeSamples.DotNet.Credentials)
+ [.NET : définition de la AWS région et du point de terminaison](#CodeSamples.DotNet.RegionAndEndpoint)

Ce guide contient des extraits de code .NET et ready-to-run des programmes. Vous pouvez trouver ces exemples de code dans les sections suivantes :
+ [Utilisation d’éléments et d’attributs dans DynamoDB](WorkingWithItems.md)
+ [Utilisation de tables et de données dans DynamoDB](WorkingWithTables.md)
+ [Interrogation de tables dans DynamoDB](Query.md)
+ [Analyse de tables dans DynamoDB](Scan.md)
+ [Amélioration de l’accès aux données avec les index secondaires dans DynamoDB](SecondaryIndexes.md)
+ [Utilisation du modèle de document .NET dans DynamoDB](DotNetSDKMidLevel.md)
+ [Utilisation du modèle de persistance des objets .NET et de DynamoDB](DotNetSDKHighLevel.md)
+ [Modifier la récupération de données pour DynamoDB Streams](Streams.md)

Vous pouvez démarrer rapidement en utilisant le AWS SDK pour .NET Toolkit for Visual Studio.

**Pour exécuter les exemples de code .NET (à l’aide de Visual Studio)**

1. Téléchargez et installez [Microsoft Visual Studio](https://www.visualstudio.com).

1. (Facultatif) Téléchargez et installez le [Toolkit for Visual Studio](https://aws.amazon.com/visualstudio/).

1. Configurez vos AWS informations d'identification. Configurez un profil d'informations d'identification dans votre fichier AWS d'informations d'identification partagé (`~/.aws/credentials`). Pour de plus amples informations, veuillez consulter la section [Configurer les informations d'identification AWS](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html) du *Guide du développeur pour le kit AWS SDK pour .NET *.

1. Démarrez Visual Studio 2015. Choisissez **File (Fichier)**, **New (Nouveau)**, puis **Project (Projet)**.

1. Recherchez **Console App**, sélectionnez le modèle C\$1 qui cible .NET, puis choisissez **Next**. Configurez le nom et l'emplacement de votre projet, puis choisissez **Créer**.

1. Ajoutez le package AWS SDK pour NuGet DynamoDB à votre projet :

   1. Dans l'Explorateur de solutions, ouvrez le menu contextuel (clic droit) de votre projet, puis choisissez **Gérer les NuGet packages**.

   1. Dans le Gestionnaire de NuGet packages, choisissez **Parcourir**.

   1. Dans la zone de recherche, saisissez **AWSSDK.DynamoDBv2** et attendez la fin de la recherche.

   1. **Choisissez **AWSSDK.Dynamo DBv2**, puis choisissez Installer.**

1. Dans votre projet Visual Studio, ouvrez`Program.cs`. Remplacez le contenu par l'exemple de code de la page de documentation que vous souhaitez exécuter.

1. Pour exécuter le code, choisissez **Start (Début)** dans la barre d’outils Visual Studio.

 SDK pour .NET fournit des clients sécurisés pour travailler avec DynamoDB. En tant que bonne pratique, vos applications doivent créer un seul client et le réutiliser entre les threads.

Pour plus d’informations, consultez [Kit SDK AWS pour .NET](https://aws.amazon.com/sdk-for-net).

**Note**  
Les exemples de code dans ce guide sont destinés à être utilisés avec la dernière version de AWS SDK pour .NET.

## .NET : Configuration de vos AWS informations d'identification
<a name="CodeSamples.DotNet.Credentials"></a>

Vous devez fournir des AWS informations d'identification à votre application lors de l'exécution. SDK pour .NET Les exemples de code présentés dans ce guide supposent que vous utilisez le magasin du SDK pour gérer votre fichier AWS d'informations d'identification, comme décrit dans la section [Utilisation du magasin du SDK](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html#sdk-store) dans le manuel du *AWS SDK pour .NET développeur*.

Le Toolkit for Visual Studio prend en charge plusieurs jeux d’informations d’identification d’un nombre quelconque de comptes. Chaque ensemble est référencé comme *profil*. Visual Studio ajoute des entrées au `App.config` fichier du projet afin que votre application puisse trouver les AWS informations d'identification lors de l'exécution.

L’exemple suivant affiche le fichier `App.config` par défaut qui est généré lorsque vous créez un projet à l’aide du 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>
```

Au moment de l'exécution, le programme utilise l'`default`ensemble d' AWS informations d'identification, tel que spécifié par l'`AWSProfileName`entrée. Les AWS informations d'identification elles-mêmes sont conservées dans le SDK Store sous forme cryptée. Le Toolkit for Visual Studio fournit une interface utilisateur graphique pour gérer vos informations d’identification, le tout dans Visual Studio. Pour plus d’informations, consultez [Spécification d’informations d’identification](https://docs.aws.amazon.com/AWSToolkitVS/latest/UserGuide/tkv_setup.html#creds) dans le *Guide de l’utilisateur AWS Toolkit for Visual Studio *.

**Note**  
Par défaut, les exemples de code accèdent à DynamoDB dans la région USA Ouest (Oregon). Vous pouvez modifier la région en modifiant l’entrée `AWSRegion` dans le fichier App.config. Vous pouvez définir `AWSRegion` sur n’importe quelle région dans laquelle DynamoDB est disponible. Pour obtenir la liste complète, consultez [Régions et points de terminaison AWS](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region) dans le *Référence générale d'Amazon Web Services*.

## .NET : définition de la AWS région et du point de terminaison
<a name="CodeSamples.DotNet.RegionAndEndpoint"></a>

Par défaut, les exemples de code accèdent à DynamoDB dans la région USA Ouest (Oregon). Vous pouvez modifier la région en modifiant l’entrée `AWSRegion` dans le fichier `App.config`. Ou alors, vous pouvez modifier la région en modifiant les propriétés `AmazonDynamoDBClient`.

L’exemple de code suivant instancie un nouvel `AmazonDynamoDBClient`. Le client est modifié de telle sorte que le code s’exécute sur DynamoDB dans une autre région.

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

Pour obtenir la liste complète des régions prises en charge, consultez [Régions et points de terminaison AWS](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region) dans le *Référence générale d'Amazon Web Services*.

Si vous souhaitez exécuter les exemples de code à l’aide de DynamoDB localement sur votre ordinateur, définissez le point de terminaison comme suit.

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

# API de bas niveau de DynamoDB
<a name="Programming.LowLevelAPI"></a>

L’*API de bas niveau* d’Amazon DynamoDB est l’interface au niveau du protocole pour DynamoDB. À ce niveau, chaque requête HTTPs doit être correctement mise en forme et présenter une signature numérique valide.

Ils créent AWS SDKs des requêtes d'API DynamoDB de bas niveau en votre nom et traitent les réponses de DynamoDB. Vous pouvez ainsi vous concentrer sur la logique de votre application, et non sur les détails de bas niveau. Cependant, vous pouvez continuer à bénéficier d’une connaissance de base du fonctionnement de l’API DynamoDB de bas niveau.

Pour plus d’informations sur l’API DynamoDB de bas niveau, consultez la [Référence d’API Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/).

**Note**  
DynamoDB Streams possède sa propre API de bas niveau, distincte de celle de DynamoDB et entièrement prise en charge par le. AWS SDKs  
Pour de plus amples informations, veuillez consulter [Modifier la récupération de données pour DynamoDB Streams](Streams.md). Pour l’API DynamoDB Streams de bas niveau, consultez la [Référence d’API Amazon DynamoDB Streams Reference](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations_Amazon_DynamoDB_Streams.html).

L'API DynamoDB de bas niveau JavaScript utilise la notation d'objet (JSON) comme format de protocole filaire. JSON présentant les données selon une hiérarchie, les valeurs des données et la structure des données sont transmises en même temps. Les paires nom-valeur sont définies au format `name:value`. La hiérarchie des données est définie par les crochets imbriqués des paires nom-valeur.

DynamoDB n’utilise JSON que comme protocole de transport, pas comme format de stockage. Ils AWS SDKs utilisent JSON pour envoyer des données à DynamoDB, et DynamoDB répond par JSON. DynamoDB ne stocke pas de données de manière persistante au format JSON.

**Note**  
Pour plus d’informations sur JSON, consultez [Introducing JSON](http://json.org) sur le site web `JSON.org`.

**Topics**
+ [Format des demandes](#Programming.LowLevelAPI.RequestFormat)
+ [Format de la réponse](#Programming.LowLevelAPI.ResponseFormat)
+ [Descripteurs de type de données](#Programming.LowLevelAPI.DataTypeDescriptors)
+ [Données numériques](#Programming.LowLevelAPI.Numbers)
+ [Données binaires](#Programming.LowLevelAPI.Binary)

![\[API de bas niveau DynamoDB et AWS SDKs comment gérer les demandes et réponses au niveau du protocole.\]](http://docs.aws.amazon.com/fr_fr/amazondynamodb/latest/developerguide/images/SDKSupport.DDBLowLevelAPI.png)


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

L’API de bas niveau DynamoDB accepte des requêtes HTTP(S) `POST` en entrée. Ils AWS SDKs élaborent ces demandes pour vous.

Supposons que vous ayez une table nommée `Pets`, avec un schéma de clé composé de `AnimalType` (clé de partition) et `Name` (clé de tri). Ces deux attributs sont de type `string`. Pour récupérer un élément`Pets`, le AWS SDK crée la demande suivante.

```
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"}
    }
}
```

Notez ce qui suit à propos de cette demande :
+ L’en-tête `Authorization` contient les informations requises pour DynamoDB pour authentifier la demande. Pour plus d'informations, voir les [demandes d' AWS API](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) de [signature et le processus de signature de la version 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) de Signature dans le *Référence générale d'Amazon Web Services*.
+ L’en-tête `X-Amz-Target` contient le nom d’une opération DynamoDB : `GetItem`. (On y trouve aussi la version de l’API de bas niveau, dans ce cas `20120810`.)
+ La charge utile (corps) de la demande contient les paramètres de l’opération, au format JSON. Pour l’opération `GetItem`, les paramètres sont `TableName` et `Key`.

## Format de la réponse
<a name="Programming.LowLevelAPI.ResponseFormat"></a>

À la réception de la demande, DynamoDB la traite et renvoie une réponse. Pour la demande illustrée précédemment, la charge utile de la réponse HTTP(S) contient les résultats de l’opération, comme dans l’exemple suivant.

```
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"}
    }
}
```

À ce stade, le AWS SDK renvoie les données de réponse à votre application pour un traitement ultérieur.

**Note**  
Si DynamoDB ne peut pas traiter une demande, il renvoie un code et un message d’erreur HTTP. Le kit SDK  AWS transmet ceux-ci à votre application sous la forme d’exceptions. Pour de plus amples informations, veuillez consulter [Gestion des erreurs avec DynamoDB](Programming.Errors.md).

## Descripteurs de type de données
<a name="Programming.LowLevelAPI.DataTypeDescriptors"></a>

Le protocole de l’API DynamoDB de bas niveau nécessite que chaque attribut soit accompagné d’un descripteur de type de données. Les *descripteurs de type de données* sont des jetons qui indiquent à DynamoDB comment interpréter chaque attribut.

Les exemples de [Format des demandes](#Programming.LowLevelAPI.RequestFormat)et [Format de la réponse](#Programming.LowLevelAPI.ResponseFormat) expliquent comment les descripteurs de type de données sont utilisés. La demande `GetItem` spécifie `S` pour les attributs du schéma de clé de `Pets` (`AnimalType` et `Name`), qui sont de type `string`. La réponse `GetItem` contient un élément *Pets* avec des attributs de type `string` (`S`), `number` (`N`), `map` (`M`) et `list` (`L`).

La liste suivante est la liste complète des descripteurs de type de données DynamoDB :
+ **`S`** – String (chaîne)
+ **`N`** – Number (nombre)
+ **`B`** – Binary (binaire)
+ **`BOOL`** – Boolean (booléen)
+ **`NULL`** – Null
+ **`M`** – Map (mappage)
+ **`L`** – List (liste)
+ **`SS`** – String Set (ensemble de chaînes)
+ **`NS`** – Number Set (ensemble de nombres)
+ **`BS`** – Binary Set (ensemble de binaires)

Le tableau suivant indique le format JSON correct pour chaque descripteur de type de données. Notez que les nombres sont représentés sous forme de chaînes pour préserver la précision, tandis que les booléens et les valeurs nulles utilisent leurs types JSON natifs.


| Descripteur | Format JSON | Remarques | 
| --- | --- | --- | 
| S | \$1"S": "Hello"\$1 | La valeur est une chaîne JSON. | 
| N | \$1"N": "123.45"\$1 | La valeur est une chaîne, pas un nombre JSON. Cela permet de préserver la précision dans toutes les langues. | 
| B | \$1"B": "dGhpcyBpcyBhIHRlc3Q="\$1 | La valeur est une chaîne codée en base64. | 
| BOOL | \$1"BOOL": true\$1 | La valeur est un booléen JSON (trueoufalse), pas une chaîne. | 
| NULL | \$1"NULL": true\$1 | La valeur est le booléen JSON indiquant true la valeur nulle. | 
| M | \$1"M": \$1"Name": \$1"S": "Joe"\$1\$1\$1 | La valeur est un objet JSON composé de paires nom-valeur d'attribut. | 
| L | \$1"L": [\$1"S": "Red"\$1, \$1"N": "5"\$1]\$1 | La valeur est un tableau JSON de valeurs d'attributs. | 
| SS | \$1"SS": ["Red", "Blue"]\$1 | La valeur est un tableau JSON de chaînes. | 
| NS | \$1"NS": ["1", "2.5"]\$1 | La valeur est un tableau JSON de chaînes numériques. | 
| BS | \$1"BS": ["U3Vubnk=", "UmFpbnk="]\$1 | La valeur est un tableau JSON de chaînes codées en base64. | 

**Note**  
 Pour une description détaillée des types de données DynamoDB, consultez [Types de données](HowItWorks.NamingRulesDataTypes.md#HowItWorks.DataTypes).

## Données numériques
<a name="Programming.LowLevelAPI.Numbers"></a>

Les différents langages de programmation offrent différents niveaux de prise en charge de JSON. Dans certains cas, vous pouvez décider d’utiliser une bibliothèque tierce pour la validation et l’analyse des documents JSON.

Certaines bibliothèques tierces reposent sur le type de numéro JSON et fournissent leurs propres types, tels que `int`, `long` ou `double`. Toutefois, le type de données Number (nombre) natif dans DynamoDB ne correspondant pas exactement à ces autres types de données, ces distinctions de type peuvent entraîner des conflits. En outre, de nombreuses bibliothèques JSON ne gèrent pas les valeurs numériques de précision fixe et en déduisent automatiquement un type de données double pour les séquences numériques contenant une virgule.

Pour résoudre ces problèmes, DynamoDB propose un seul type numérique sans perte de données. Pour éviter des conversions implicites indésirables en valeur double, DynamoDB utilise des chaînes pour le transfert de données de valeurs numériques. Cette approche offre une flexibilité pour la mise à jour des valeurs d’attribut tout en assurant la sémantique de tri appropriée, comme le placement des valeurs « 01 », « 2 » et « 03 » dans le bon ordre.

Si la précision numérique est importante pour votre application, vous devez convertir les valeurs numériques en chaînes avant de les passer à DynamoDB.

## Données binaires
<a name="Programming.LowLevelAPI.Binary"></a>

DynamoDB prend en charge les attributs binaires. Cependant, JSON ne prend pas en charge en mode natif le codage binaire. Pour envoyer les données binaires dans une demande, vous devez les encoder au format base64. À la réception de la demande, DynamoDB décode les données en base 64 pour les convertir en binaires. 

Le schéma de codage en base 64 que DynamoDB utilise est décrit dans la rubrique [RFC 4648](http://tools.ietf.org/html/rfc4648) sur le site web de l’Internet Engineering Task Force (IETF).