

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.

# Modifications apportées à l'utilisation de DynamoDB entre la version 1 et la version 2 du AWS SDK pour Java
<a name="migration-ddb-mapper"></a>



**Topics**
+ [Différences entre les versions 1 et 2 de l'API de mappage DynamoDB AWS SDK pour Java](ddb-mapping.md)
+ [Différences entre l'API des documents entre la version 1 et la version 2 du AWS SDK pour Java](dynamodb-mapping-document-api.md)
+ [Migration de bibliothèques de chiffrement](ddb-encryption-lib-migrate.md)

# Différences entre les versions 1 et 2 de l'API de mappage DynamoDB AWS SDK pour Java
<a name="ddb-mapping"></a>

Le APIs mappage DynamoDB a changé de manière significative entre la version 1 et la version 2 du. AWS SDK pour Java Dans la version 1, vous utilisez le `DynamoDBMapper` pour travailler avec Java POJOs. Dans la version 2, vous utilisez le `DynamoDbEnhancedClient` avec des noms de méthodes mis à jour, des options de définition de schéma améliorées et une sécurité de type améliorée.

Les principales différences sont les suivantes :
+ Nouveaux noms de méthodes (par exemple `getItem` au lieu de`load`)
+ Création d'un schéma de table explicite
+ Support intégré pour les opérations synchrones et asynchrones
+ Changements dans la façon dont les chaînes vides et la configuration sont gérées

Cette section couvre les modifications de l'API de mappage, les différences d'annotations, les mises à jour de configuration et les conseils de migration pour vous aider à passer de la version v1 `DynamoDBMapper` à la version v2`DynamoDbEnhancedClient`.

**Contents**
+ [Modifications importantes apportées aux bibliothèques de mappage de la version 1 à la version 2 du SDK for Java](dynamodb-mapping-high-level.md)
  + [Différences de dépendance à l'importation](dynamodb-mapping-high-level.md#dynamodb-mapping-deps)
+ [Modifications apportées au APIs mappage DynamoDB entre les versions 1 et 2 du SDK for Java](dynamodb-mapping-api-changes.md)
  + [Création d'un client](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-client)
  + [Établir le mappage vers la table/l'index DynamoDB](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-mapping)
  + [Opérations de table](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-tobleops)
  + [Classes et propriétés de cartes](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas)
    + [Annotations sur les haricots](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos)
    + [Annotations supplémentaires V2](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos-v2-addnl)
  + [Configuration](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration)
    + [Configuration par opération](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration-per-op)
  + [Conditionnels](dynamodb-mapping-api-changes.md#dynamodb-mapping-conditionals)
  + [Conversion de type](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv)
    + [Convertisseurs par défaut](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-defaults)
    + [Définir un convertisseur personnalisé pour un attribut](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-anno)
    + [Ajouter un convertisseur de type, une usine ou un fournisseur](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-factory)
+ [Différences de gestion des chaînes entre la version 1 et la version 2 du SDK for Java](dynamodb-migration-string-handling.md)
+ [Différences de verrouillage optimistes entre la version 1 et la version 2 du SDK for Java](dynamodb-migrate-optimstic-locking.md)
+ [Différences entre les versions 1 et 2 du SDK for Java avec Fluent Setters](dynamodb-migrate-fluent-setters.md)

# Modifications importantes apportées aux bibliothèques de mappage de la version 1 à la version 2 du SDK for Java
<a name="dynamodb-mapping-high-level"></a>

Les noms du client de mappage dans chaque bibliothèque diffèrent dans les versions V1 et V2 :
+ V1 - Dynamo DBMapper
+ V2 - Client DynamoDB amélioré

Vous interagissez avec les deux bibliothèques de la même manière : vous instanciez une, mapper/client puis vous fournissez un POJO Java pour lire et écrire ces APIs éléments dans des tables DynamoDB. Les deux bibliothèques proposent également des annotations pour la classe du POJO afin d'indiquer comment le client gère le POJO. 

Les différences notables lorsque vous passez à la V2 incluent :
+ Les versions V2 et V1 utilisent des noms de méthode différents pour les opérations DynamoDB de bas niveau. Par exemple :    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/sdk-for-java/latest/developer-guide/dynamodb-mapping-high-level.html)
+ La V2 propose plusieurs méthodes pour définir des schémas de tables et les POJOs mapper à des tables. Vous pouvez choisir d'utiliser des annotations ou un schéma généré à partir du code à l'aide d'un générateur. La V2 propose également des versions mutables et immuables des schémas.
+ Avec la V2, vous créez spécifiquement le schéma de table comme l'une des premières étapes, tandis que dans la V1, le schéma de table est déduit de la classe annotée selon les besoins.
+ La V2 inclut le [client Document API](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html) dans l'API client améliorée, tandis que la V1 utilise une [API distincte](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/DynamoDB.html).
+ Tous APIs sont disponibles en versions synchrone et asynchrone dans la V2.

Consultez la section sur le [mappage DynamoDB](dynamodb-enhanced-client.md) de ce guide pour obtenir des informations plus détaillées sur le client amélioré V2.

## Différences de dépendance à l'importation
<a name="dynamodb-mapping-deps"></a>


| V1 | V2 | 
| --- | --- | 
|  <pre><dependencyManagement><br />  <dependencies><br />    <dependency><br />      <groupId>com.amazonaws</groupId><br />      <artifactId>aws-java-sdk-bom</artifactId><br />      <version>1.X.X</version><br />      <type>pom</type><br />      <scope>import</scope><br />    </dependency><br />  </dependencies><br /></dependencyManagement> <br /><br /><dependencies><br />  <dependency><br />    <groupId>com.amazonaws</groupId><br />    <artifactId>aws-java-sdk-dynamodb</artifactId><br />  </dependency><br /></dependencies></pre>  |  <pre><dependencyManagement><br />  <dependencies><br />    <dependency><br />      <groupId>software.amazon.awssdk</groupId><br />      <artifactId>bom</artifactId><br />      <version>2.X.X*</version><br />      <type>pom</type><br />      <scope>import</scope><br />    </dependency><br />  </dependencies><br /></dependencyManagement> <br /><br /><dependencies><br />  <dependency><br />    <groupId>software.amazon.awssdk</groupId><br />    <artifactId>dynamodb-enhanced</artifactId><br />  </dependency><br /></dependencies></pre>  | 

\$1 [Dernière version](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

Dans la version 1, une seule dépendance inclut à la fois l'API DynamoDB de bas niveau et mapping/document l'API, tandis que dans la version 2, vous utilisez la dépendance d'artefact pour accéder à `dynamodb-enhanced` l'API. mapping/document Le `dynamodb-enhanced` module contient une dépendance transitive vis-à-vis du module de bas niveau. `dynamodb` 

# Modifications apportées au APIs mappage DynamoDB entre les versions 1 et 2 du SDK for Java
<a name="dynamodb-mapping-api-changes"></a>

## Création d'un client
<a name="dynamodb-mapping-api-changes-client"></a>


****  

| Cas d’utilisation | V1 | V2 | 
| --- | --- | --- | 
|   Instanciation normale  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard()<br />    .withCredentials(credentialsProvider)<br />    .withRegion(Regions.US_EAST_1)<br />    .build();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbClient standardClient = DynamoDbClient.builder()<br />    .credentialsProvider(ProfileCredentialsProvider.create())<br />    .region(Region.US_EAST_1)<br />    .build();<br />DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()<br />    .dynamoDbClient(standardClient)<br />    .build();</pre>  | 
|   Instanciation minimale  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create();</pre>  | 
|   Avec transformateur d'attributs \$1  |  <pre>DynamoDBMapper mapper = new DynamoDBMapper(standardClient, <br />                        attributeTransformerInstance);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()<br />    .dynamoDbClient(standardClient)<br />    .extensions(extensionAInstance, extensionBInstance)<br />    .build();</pre>  | 

\$1 Les extensions de la V2 correspondent approximativement aux transformateurs d'attributs de la V1. La [Utiliser des extensions pour personnaliser les opérations du client DynamoDB Enhanced](ddb-en-client-extensions.md) section contient plus d'informations sur les extensions de la version 2. 

## Établir le mappage vers la table/l'index DynamoDB
<a name="dynamodb-mapping-api-changes-mapping"></a>

Dans la version 1, vous spécifiez le nom d'une table DynamoDB par le biais d'une annotation de bean. Dans la version 2, une méthode d'usine produit une instance de `DynamoDbTable` qui représente la table DynamoDB distante. `table()` Le premier paramètre de la `table()` méthode est le nom de la table DynamoDB.


****  

| Cas d’utilisation | V1 | V2 | 
| --- | --- | --- | 
|   Mappez la classe Java POJO à la table DynamoDB  |  <pre>@DynamoDBTable(tableName ="Customer")<br />public class Customer {<br />  ...<br />}</pre>  |  <pre>DynamoDbTable<Customer> customerTable = enhancedClient.table("Customer",<br />    TableSchema.fromBean(Customer.class));</pre>  | 
|   Mapper vers un index secondaire DynamoDB  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) La section du Guide du développeur DynamoDB qui [décrit la méthode `query` V1](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query) présente un exemple complet.  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) La [Utiliser des indices secondaires](ddb-en-client-use-secindex.md) section de ce guide fournit plus d'informations.  | 

## Opérations de table
<a name="dynamodb-mapping-api-changes-tobleops"></a>

Cette section décrit les opérations APIs qui diffèrent entre la V1 et la V2 pour la plupart des cas d'utilisation standard. 

Dans la version 2, toutes les opérations impliquant une seule table sont appelées sur l'`DynamoDbTable`instance, et non sur le client amélioré. Le client amélioré contient des méthodes qui peuvent cibler plusieurs tables. 

Dans le tableau intitulé *Opérations de table* ci-dessous, une instance POJO est désignée sous le nom `item` ou en tant que type spécifique tel que`customer1`. Pour les exemples de la V2, les instances nommées `table` sont le résultat d'un appel précédent `enhancedClient.table()` qui renvoie une référence à l'`DynamoDbTable`instance.

Notez que la plupart des opérations V2 peuvent être appelées avec un modèle de consommation fluide, même lorsqu'elles ne sont pas affichées. Par exemple, 

```
Customer customer = table.getItem(r → r.key(key));
  or
Customer customer = table.getItem(r → r.key(k -> k.partitionValue("id").sortValue("email")))
```

Pour les opérations V1, *les opérations de table* (ci-dessous) contiennent certains des formulaires couramment utilisés, mais pas tous les formulaires surchargés. Par exemple, la `load()` méthode présente les surcharges suivantes :

```
mapper.load(Customer.class, hashKey)
mapper.load(Customer.class, hashKey, rangeKey)
mapper.load(Customer.class, hashKey, config)
mapper.load(Customer.class, hashKey, rangeKey, config)
mapper.load(item)
mapper.load(item, config)
```

*Le tableau des opérations* (ci-dessous) montre les formulaires couramment utilisés :

```
mapper.load(item)
mapper.load(item, config)
```


**Opérations de table**  

| Cas d’utilisation | V1 | V2 | 
| --- | --- | --- | 
|  Écrire un POJO Java dans une table DynamoDB **Opération DynamoDB** :, `PutItem` `UpdateItem`  |  <pre>mapper.save(item)<br />mapper.save(item, config)<br />mapper.save(item, saveExpression, config)</pre> Dans la version 1, `DynamoDBMapperConfig.SaveBehavior` les annotations déterminent la méthode DynamoDB de bas niveau qui sera appelée. En général, `UpdateItem` est appelé sauf lors de l'utilisation de `SaveBehavior.CLOBBER` et`SaveBehavior.PUT`. Les clés générées automatiquement constituent un cas d'utilisation particulier, et parfois les deux `PutItem` `UpdateItem` sont utilisées.  |  <pre>table.putItem(putItemRequest)<br />table.putItem(item)<br />table.putItemWithResponse(item) //Returns metadata.<br /><br />updateItem(updateItemRequest)<br />table.updateItem(item)<br />table.updateItemWithResponse(item) //Returns metadata.</pre>  | 
|  Lire un élément d'une table DynamoDB dans un POJO Java **Fonctionnement DynamoDB :** `GetItem`  |  <pre>mapper.load(item)<br />mapper.load(item, config)</pre>  |  <pre>table.getItem(getItemRequest)<br />table.getItem(item)<br />table.getItem(key)<br />table.getItemWithResponse(key) //Returns POJO with metadata.</pre>  | 
|  Supprimer un élément d'une table DynamoDB **Fonctionnement DynamoDB :** `DeleteItem`  |  <pre>mapper.delete(item, deleteExpression, config)</pre>  |  <pre>table.deleteItem(deleteItemRequest)<br />table.deleteItem(item)<br />table.deleteItem(key)</pre>  | 
|  Interrogez une table DynamoDB ou un index secondaire et renvoyez une liste paginée **Fonctionnement DynamoDB :** `Query`  |  <pre>mapper.query(Customer.class, queryExpression)<br />mapper.query(Customer.class, queryExpression, <br />                             mapperConfig)</pre>  |  <pre>table.query(queryRequest)<br />table.query(queryConditional)</pre> Utiliser le renvoi `PageIterable.stream()` (chargement différé) pour les réponses synchronisées et `PagePublisher.subscribe()` pour les réponses asynchrones  | 
|  Interrogez une table DynamoDB ou un index secondaire et renvoyez une liste **Fonctionnement DynamoDB :** `Query`  |  <pre>mapper.queryPage(Customer.class, queryExpression)<br />mapper.queryPage(Customer.class, queryExpression, <br />                                 mapperConfig)</pre>  |  <pre>table.query(queryRequest)<br />table.query(queryConditional)</pre> Utiliser le renvoi `PageIterable.items()` (chargement différé) pour les réponses synchronisées et `PagePublisher.items.subscribe()` pour les réponses asynchrones  | 
|  Scanner une table DynamoDB ou un index secondaire et renvoyer une liste paginée **Fonctionnement DynamoDB :** `Scan`  |  <pre>mapper.scan(Customer.class, scanExpression)<br />mapper.scan(Customer.class, scanExpression, <br />                            mapperConfig)</pre>  |  <pre>table.scan()<br />table.scan(scanRequest)</pre> Utiliser le renvoi `PageIterable.stream()` (chargement différé) pour les réponses synchronisées et `PagePublisher.subscribe()` pour les réponses asynchrones  | 
|  Scanner une table DynamoDB ou un index secondaire et renvoyer une liste **Fonctionnement DynamoDB :** `Scan`  |  <pre>mapper.scanPage(Customer.class, scanExpression)<br />mapper.scanPage(Customer.class, scanExpression, <br />                                mapperConfig)</pre>  |  <pre>table.scan()<br />table.scan(scanRequest)</pre> Utiliser le renvoi `PageIterable.items()` (chargement différé) pour les réponses synchronisées et `PagePublisher.items.subscribe()` pour les réponses asynchrones  | 
|  Lire plusieurs éléments de plusieurs tables dans un lot **Fonctionnement DynamoDB :** `BatchGetItem`  |  <pre>mapper.batchLoad(Arrays.asList(customer1, <br />                               customer2, <br />                               book1))<br />mapper.batchLoad(itemsToGet) <br />           // itemsToGet: Map<Class<?>, List<KeyPair>></pre>  |  <pre>enhancedClient.batchGetItem(batchGetItemRequest)<br /><br />enhancedClient.batchGetItem(r -> r.readBatches(<br />    ReadBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addGetItem(i -> i.key(k -> k.partitionValue(0)))<br />             .build(),<br />    ReadBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addGetItem(i -> i.key(k -> k.partitionValue(0)))<br />             .build()))<br /><br />// Iterate over pages with lazy loading or over all items <br />   from the same table.</pre>  | 
|  Écrire plusieurs éléments dans plusieurs tables par lot **Fonctionnement DynamoDB :** `BatchWriteItem`  |  <pre>mapper.batchSave(Arrays.asList(customer1, <br />                               customer2, <br />                               book1)) </pre>  |  <pre>enhancedClient.batchWriteItem(batchWriteItemRequest)<br /><br />enhancedClient.batchWriteItem(r -> r.writeBatches(<br />    WriteBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addPutItem(item1)<br />             .build(),<br />    WriteBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addPutItem(item2)<br />             .build()))</pre>  | 
|  Supprimer plusieurs éléments de plusieurs tables par lot **Fonctionnement DynamoDB :** `BatchWriteItem`  |  <pre>mapper.batchDelete(Arrays.asList(customer1, <br />                                 customer2, <br />                                 book1)) </pre>  |  <pre>enhancedClient.batchWriteItem(r -> r.writeBatches(<br />    WriteBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addDeleteItem(item1key)<br />             .build(),<br />    WriteBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addDeleteItem(item2key)<br />             .build()))</pre>  | 
|  Écrivez/supprimez plusieurs éléments dans un lot **Fonctionnement DynamoDB :** `BatchWriteItem`  |  <pre>mapper.batchWrite(Arrays.asList(customer1, book1), <br />                  Arrays.asList(customer2)) </pre>  |  <pre>enhancedClient.batchWriteItem(r -> r.writeBatches(<br />    WriteBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addPutItem(item1)<br />             .build(),<br />    WriteBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addDeleteItem(item2key)<br />             .build()))</pre>  | 
|  Réaliser une écriture transactionnelle **Fonctionnement DynamoDB :** `TransactWriteItems`  |  <pre>mapper.transactionWrite(transactionWriteRequest)</pre>  |  <pre>enhancedClient.transactWriteItems(transasctWriteItemsRequest)</pre>  | 
|  Réaliser une lecture transactionnelle **Fonctionnement DynamoDB :** `TransactGetItems`  |  <pre>mapper.transactionLoad(transactionLoadRequest)</pre>  |  <pre>enhancedClient.transactGetItems(transactGetItemsRequest) </pre>  | 
|  Obtenir le nombre d'éléments correspondants d'une requête **Fonctionnement DynamoDB** : avec `Query` `Select.COUNT`  |  <pre>mapper.count(Customer.class, queryExpression)</pre>  |  <pre>// Get the count from query results.<br />PageIterable<Customer> pageIterable =<br />    customerTable.query(QueryEnhancedRequest.builder()<br />        .queryConditional(queryConditional)<br />        .select(Select.COUNT)<br />        .build());<br />Iterator<Page<Customer>> iterator = pageIterable.iterator();<br />Page<Customer> page = iterator.next();<br />int count = page.count();<br /><br />// For a more concise approach, you can chain the method calls:<br />int count = customerTable.query(QueryEnhancedRequest.builder()<br />                .queryConditional(queryConditional)<br />                .select(Select.COUNT)<br />                .build())<br />            .iterator().next().count();</pre>  | 
|  Obtenez le nombre d'éléments correspondants d'un scan **Fonctionnement DynamoDB** : avec `Scan` `Select.COUNT`  |  <pre>mapper.count(Customer.class, scanExpression)</pre>  |  <pre>// Get the count from scan results.<br />PageIterable<Customer> pageIterable =<br />    customerTable.scan(ScanEnhancedRequest.builder()<br />        .filterExpression(filterExpression)<br />        .select(Select.COUNT)<br />        .build());<br />Iterator<Page<Customer>> iterator = pageIterable.iterator();<br />Page<Customer> page = iterator.next();<br />int count = page.count();<br /><br />// For a more concise approach, you can chain the method calls:<br />int count = customerTable.scan(ScanEnhancedRequest.builder()<br />                .filterExpression(filterExpression)<br />                .select(Select.COUNT)<br />                .build())<br />            .iterator().next().count();</pre>  | 
|  Créez une table dans DynamoDB correspondant à la classe POJO **Fonctionnement DynamoDB :** `CreateTable`  |  <pre>mapper.generateCreateTableRequest(Customer.class)</pre> L'instruction précédente génère une demande de création de table de bas niveau ; les utilisateurs doivent appeler `createTable` le client DynamoDB.  |  <pre>table.createTable(createTableRequest)<br /><br />table.createTable(r -> r.provisionedThroughput(defaultThroughput())<br />    .globalSecondaryIndices(<br />        EnhancedGlobalSecondaryIndex.builder()<br />            .indexName("gsi_1")<br />            .projection(p -> p.projectionType(ProjectionType.ALL))<br />            .provisionedThroughput(defaultThroughput())<br />            .build()));</pre>  | 
|  Effectuer un scan parallèle dans DynamoDB **Fonctionnement `Scan` DynamoDB** : avec et paramètres `Segment` `TotalSegments`  |  <pre>mapper.parallelScan(Customer.class, <br />                    scanExpression, <br />                    numTotalSegments)</pre>  |  Les utilisateurs sont tenus de gérer les threads de travail et d'appeler `scan` pour chaque segment : <pre>table.scan(r -> r.segment(0).totalSegments(5))</pre>  | 
|  Intégrez Amazon S3 à DynamoDB pour stocker des liens S3 intelligents  |  <pre>mapper.createS3Link(bucket, key)<br />mapper.getS3ClientCache()</pre>  |  Non pris en charge car il associe Amazon S3 et DynamoDB.  | 

## Classes et propriétés de cartes
<a name="dynamodb-mapping-schemas"></a>

Dans les versions V1 et V2, vous mappez des classes à des tables à l'aide d'annotations de style haricot. La V2 propose également [d'autres moyens de définir des schémas](ddb-en-client-adv-features.md#ddb-en-client-adv-features-schm-overview) pour des cas d'utilisation spécifiques, tels que l'utilisation de classes immuables.

### Annotations sur les haricots
<a name="dynamodb-mapping-schemas-annos"></a>

Le tableau suivant montre les annotations de bean équivalentes pour un cas d'utilisation spécifique qui sont utilisées dans les versions V1 et V2. Un scénario `Customer` de classe est utilisé pour illustrer les paramètres.

Les annotations, ainsi que les classes et les énumérations, de la version 2 suivent la convention Camel Case et utilisent « », et non « DynamoDB ». DynamoDb


| Cas d’utilisation | V1 | V2 | 
| --- | --- | --- | 
| Associer une classe à une table |  <pre>@DynamoDBTable (tableName ="CustomerTable")</pre>  | <pre>@DynamoDbBean<br />@DynamoDbBean(converterProviders = {...})</pre>Le nom de la table est défini lors de l'appel de la DynamoDbEnhancedClient\$1table() méthode. | 
| Désigner un membre de classe comme attribut de table  |  <pre>@DynamoDBAttribute(attributeName = "customerName")</pre>  |  <pre>@DynamoDbAttribute("customerName") </pre>  | 
| Désigner un membre de la classe est hash/partition essentiel |  <pre>@DynamoDBHashKey </pre>  |  <pre>@DynamoDbPartitionKey</pre>  | 
| Désigner un membre de la classe est range/sort essentiel |  <pre>@DynamoDBRangeKey </pre>  |  <pre>@DynamoDbSortKey </pre>  | 
| Désigner un membre de classe comme clé de hachage ou de partition d'index secondaire |  <pre>@DynamoDBIndexHashKey </pre>  |  <pre>@DynamoDbSecondaryPartitionKey </pre>  | 
| Désigner un membre de classe comme plage d'index secondaire/clé de tri |  <pre>@DynamoDBIndexRangeKey </pre>  |  <pre>@DynamoDbSecondarySortKey </pre>  | 
| Ignorer ce membre de classe lors du mappage vers une table |  <pre>@DynamoDBIgnore </pre>  |  <pre>@DynamoDbIgnore</pre>  | 
| Désigner un membre de classe comme attribut clé UUID généré automatiquement |  <pre>@DynamoDBAutoGeneratedKey</pre>  |  <pre>@DynamoDbAutoGeneratedUuid </pre> L'extension qui fournit cela n'est pas chargée par défaut ; vous devez ajouter l'extension au générateur de clients.  | 
| Désigner un membre de classe comme attribut d'horodatage généré automatiquement |  <pre>@DynamoDBAutoGeneratedTimestamp</pre>  |  <pre>@DynamoDbAutoGeneratedTimestampAttribute</pre> L'extension qui fournit cela n'est pas chargée par défaut ; vous devez ajouter l'extension au générateur de clients.  | 
| Désigner un membre de classe comme attribut de version auto-incrémenté |  <pre>@DynamoDBVersionAttribute</pre>  |  <pre>@DynamoDbVersionAttribute</pre> L'extension qui fournit cela est chargée automatiquement.  | 
| Désigner un membre de la classe comme nécessitant une conversion personnalisée |  <pre>@DynamoDBTypeConverted</pre>  |  <pre>@DynamoDbConvertedBy</pre>  | 
| Désignez un membre de classe à stocker sous un autre type d'attribut |  <pre>@DynamoDBTyped(<DynamoDBAttributeType>)</pre>  |  Utilisez une `AttributeConverter` implémentation. La V2 fournit de nombreux convertisseurs intégrés pour les types Java courants. Vous pouvez également implémenter votre propre personnalisation `AttributeConverter` ou`AttributeConverterProvider`. Voir [Conversion des attributs de contrôle](ddb-en-client-adv-features-conversion.md) dans ce guide.  | 
| Désignez une classe qui peut être sérialisée dans un document DynamoDB (document de style JSON) ou un sous-document  |  <pre>@DynamoDBDocument</pre>  | Utilisez l'API de document améliorée. Consultez les ressources suivantes :[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) | 

### Annotations supplémentaires V2
<a name="dynamodb-mapping-schemas-annos-v2-addnl"></a>


| Cas d’utilisation | V1 | V2 | 
| --- | --- | --- | 
| Désignez un membre de classe à ne pas stocker en tant qu'attribut NULL si la valeur Java est nulle | N/A |  <pre>@DynamoDbIgnoreNulls</pre>  | 
| Désignez un membre de classe comme un objet vide si tous les attributs sont nuls | N/A |  <pre>@DynamoDbPreserveEmptyObject</pre>  | 
| Désigner une action de mise à jour spéciale pour un membre du groupe | N/A |  <pre>@DynamoDbUpdateBehavior</pre>  | 
| Désigner une classe immuable | N/A |  <pre>@DynamoDbImmutable</pre>  | 
| Désigner un membre de classe comme attribut de compteur auto-incrémenté | N/A |  <pre>@DynamoDbAtomicCounter</pre> L'extension qui fournit cette fonctionnalité est chargée automatiquement.  | 

## Configuration
<a name="dynamodb-mapping-configuration"></a>

Dans la version 1, vous contrôlez généralement des comportements spécifiques à l'aide d'une instance de`DynamoDBMapperConfig`. Vous pouvez fournir l'objet de configuration lorsque vous créez le mappeur ou lorsque vous faites une demande. Dans la version 2, la configuration est spécifique à l'objet de demande pour l'opération.


| Cas d’utilisation | V1 | Par défaut dans la V1 | V2 | 
| --- | --- | --- | --- | 
|  |  <pre>DynamoDBMapperConfig.builder()</pre>  |  |  | 
| Stratégie de load/write nouvelle tentative par lots |  <pre>  .withBatchLoadRetryStrategy(loadRetryStrategy)</pre> <pre>  .withBatchWriteRetryStrategy(writeRetryStrategy)</pre>  | réessayer les articles ayant échoué | Configurez la stratégie de nouvelle tentative sur le sous-jacentDynamoDBClient. Voir [Configurez le comportement des nouvelles tentatives dans AWS SDK for Java 2.x](retry-strategy.md) dans ce guide. | 
| Lectures cohérentes |  <pre>  .withConsistentReads(CONSISTENT)</pre>  | EVENTUAL | Par défaut, les lectures cohérentes ont la valeur false pour les opérations de lecture. Remplacez par .consistentRead(true) sur l'objet de la requête. | 
| Schéma de conversion avec des ensembles de marshallers/unmarshallers |  <pre>  .withConversionSchema(conversionSchema)</pre> Les implémentations statiques offrent une rétrocompatibilité avec les anciennes versions.  | V2\$1COMPATIBLE | Non applicable. Il s'agit d'une fonctionnalité héritée qui fait référence à la manière dont les premières versions de DynamoDB (V1) stockaient les types de données. Ce comportement ne sera pas conservé dans le client amélioré. Un exemple de comportement dans DynamoDB V1 consiste à stocker les booléens sous forme de nombre plutôt que sous forme de booléen. | 
| Noms des tables |  <pre>  .withObjectTableNameResolver()<br />  .withTableNameOverride() <br />  .withTableNameResolver()</pre> Les implémentations statiques offrent une rétrocompatibilité avec les anciennes versions  | utiliser une annotation ou deviner à partir de la classe |  Le nom de la table est défini lors de l'appel de la `DynamoDbEnhancedClient#table()` méthode.  | 
| Stratégie de chargement de pagination |  <pre>  .withPaginationLoadingStrategy(strategy)</pre>  Les options sont : LAZY\$1`LOADING`, ou `EAGER_LOADING` `ITERATION_ONLY`  | LAZY\$1LOADING |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html)  | 
| Demander la collecte de métriques |  <pre>  .withRequestMetricCollector(collector)</pre>  | null | metricPublisher()À utiliser ClientOverrideConfiguration lors de la création du client DynamoDB standard.  | 
| Enregistrer le comportement |  <pre>  .withSaveBehavior(SaveBehavior.CLOBBER) </pre> Les options sont `UPDATE``CLOBBER`,`PUT`,`APPEND_SET`, ou`UPDATE_SKIP_NULL_ATTRIBUTES`.  | UPDATE |  Dans la V2, vous appelez `putItem()` ou `updateItem()` explicitement. `CLOBBER or PUT`: L'action correspondante dans la version 2 est l'appel`putItem()`. Il n'existe aucune `CLOBBER` configuration spécifique. `UPDATE`: Correspond à `updateItem()` `UPDATE_SKIP_NULL_ATTRIBUTES`: Correspond à`updateItem()`. Contrôlez le comportement des mises à jour à l'aide du paramètre de demande `ignoreNulls` et de l'`DynamoDbUpdateBehavior`annotation/de la balise. `APPEND_SET`: Non pris en charge  | 
| Type : usine de convertisseurs |  <pre>  .withTypeConverterFactory(typeConverterFactory) </pre>  | convertisseurs de type standard |  Fixez le haricot en utilisant <pre>@DynamoDbBean(converterProviders = {ConverterProvider.class, <br />        DefaultAttributeConverterProvider.class})</pre>  | 

### Configuration par opération
<a name="dynamodb-mapping-configuration-per-op"></a>

Dans la version 1, certaines opérations, telles que`query()`, sont hautement configurables via un objet « expression » soumis à l'opération. Par exemple :

```
DynamoDBQueryExpression<Customer> emailBwQueryExpr = new DynamoDBQueryExpression<Customer>()
    .withRangeKeyCondition("Email",
        new Condition()
            .withComparisonOperator(ComparisonOperator.BEGINS_WITH)
            .withAttributeValueList(
                new AttributeValue().withS("my")));

mapper.query(Customer.class, emailBwQueryExpr);
```

Dans la version 2, au lieu d'utiliser un objet de configuration, vous définissez les paramètres de l'objet de demande à l'aide d'un générateur. Par exemple :

```
QueryEnhancedRequest emailBw = QueryEnhancedRequest.builder()
    .queryConditional(QueryConditional
        .sortBeginsWith(kb -> kb
            .sortValue("my"))).build();

customerTable.query(emailBw);
```

## Conditionnels
<a name="dynamodb-mapping-conditionals"></a>

Dans la version 2, les expressions conditionnelles et filtrantes sont exprimées à l'aide d'un `Expression` objet qui encapsule la condition et le mappage des noms et des filtres. 


| Cas d’utilisation | Opérations | V1 | V2 | 
| --- | --- | --- | --- | 
| Conditions d'attribut attendues | enregistrer (), supprimer (), interroger (), scanner () |  <pre>new DynamoDBSaveExpression()<br />  .withExpected(Collections.singletonMap(<br />      "otherAttribute", new ExpectedAttributeValue(false)))<br />  .withConditionalOperator(ConditionalOperator.AND);</pre>  | Obsolète ; à utiliser ConditionExpression à la place. | 
| Expression de condition | supprimer () |  <pre>deleteExpression.setConditionExpression("zipcode = :zipcode")<br />deleteExpression.setExpressionAttributeValues(...)<br /></pre>  |  <pre>Expression conditionExpression =<br />    Expression.builder()<br />        .expression("#key = :value OR #key1 = :value1")<br />        .putExpressionName("#key", "attribute")<br />        .putExpressionName("#key1", "attribute3")<br />        .putExpressionValue(":value", AttributeValues.stringValue("wrong"))<br />        .putExpressionValue(":value1", AttributeValues.stringValue("three"))<br />        .build();<br /><br />DeleteItemEnhancedRequest request = DeleteItemEnhancedRequest.builder()<br />         .conditionExpression(conditionExpression).build();</pre>  | 
| Expression de filtre | requête (), scan () |  <pre>scanExpression<br />  .withFilterExpression("#statename = :state")<br />  .withExpressionAttributeValues(attributeValueMapBuilder.build())<br />  .withExpressionAttributeNames(attributeNameMapBuilder.build())<br /></pre>  |  <pre>Map<String, AttributeValue> values = singletonMap(":key", stringValue("value"));<br />Expression filterExpression =<br />    Expression.builder()<br />        .expression("name = :key")<br />        .expressionValues(values)<br />        .build();<br />QueryEnhancedRequest request = QueryEnhancedRequest.builder()<br />    .filterExpression(filterExpression).build();<br /></pre>  | 
| Expression de condition pour la requête | requête () |  <pre>queryExpression.withKeyConditionExpression()</pre>  |  <pre>QueryConditional keyEqual = QueryConditional.keyEqualTo(b -> b<br />                .partitionValue("movie01"));<br /><br />QueryEnhancedRequest tableQuery = QueryEnhancedRequest.builder()<br />                .queryConditional(keyEqual)<br />                .build();</pre>  | 

## Conversion de type
<a name="dynamodb-mapping-type-conv"></a>

### Convertisseurs par défaut
<a name="dynamodb-mapping-type-conv-defaults"></a>

Dans la version 2, le SDK fournit un ensemble de convertisseurs par défaut pour tous les types courants. Vous pouvez modifier les convertisseurs de type à la fois au niveau global du fournisseur et pour un seul attribut. Vous trouverez une liste des convertisseurs disponibles dans la référence de l'[AttributeConverter](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverter.html)API.

### Définir un convertisseur personnalisé pour un attribut
<a name="dynamodb-mapping-type-conv-anno"></a>

Dans la version 1, vous pouvez annoter une méthode getter `@DynamoDBTypeConverted` pour spécifier la classe qui effectue la conversion entre le type d'attribut Java et le type d'attribut DynamoDB. Par exemple, une `CurrencyFormatConverter` conversion entre un `Currency` type Java et une chaîne DynamoDB peut être appliquée comme indiqué dans l'extrait suivant.

```
@DynamoDBTypeConverted(converter = CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
```

L'équivalent V2 de l'extrait précédent est illustré ci-dessous.

```
@DynamoDbConvertedBy(CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
```

**Note**  
Dans la version 1, vous pouvez appliquer l'annotation à l'attribut lui-même, à un type ou à une annotation définie par l'utilisateur, tandis que la version 2 prend en charge l'application de l'annotation uniquement au getter.

### Ajouter un convertisseur de type, une usine ou un fournisseur
<a name="dynamodb-mapping-type-conv-factory"></a>

Dans la version 1, vous pouvez fournir votre propre ensemble de convertisseurs de type ou remplacer les types qui vous intéressent en ajoutant une usine de convertisseurs de type à la configuration. La fabrique de convertisseurs de types s'étend`DynamoDBTypeConverterFactory`, et les remplacements sont effectués en obtenant une référence à l'ensemble par défaut et en l'étendant. L'extrait suivant montre comment procéder.

```
DynamoDBTypeConverterFactory typeConverterFactory =
    DynamoDBTypeConverterFactory.standard().override()
        .with(String.class, CustomBoolean.class, new DynamoDBTypeConverter<String, CustomBoolean>() {
            @Override
            public String convert(CustomBoolean bool) {
                return String.valueOf(bool.getValue());
            }
            @Override
            public CustomBoolean unconvert(String string) {
                return new CustomBoolean(Boolean.valueOf(string));
            }}).build();
DynamoDBMapperConfig config =
    DynamoDBMapperConfig.builder()
        .withTypeConverterFactory(typeConverterFactory)
        .build();
DynamoDBMapper mapperWithTypeConverterFactory = new DynamoDBMapper(dynamo, config);
```

La V2 fournit des fonctionnalités similaires par le biais de l'`@DynamoDbBean`annotation. Vous pouvez fournir une commande unique `AttributeConverterProvider` ou une chaîne de `AttributeConverterProvider` commandes. Notez que si vous fournissez votre propre chaîne de fournisseurs de convertisseurs d'attributs, vous remplacerez le fournisseur de conversion par défaut et devrez l'inclure dans la chaîne pour utiliser ses convertisseurs d'attributs. 

```
@DynamoDbBean(converterProviders = {
   ConverterProvider1.class, 
   ConverterProvider2.class,
   DefaultAttributeConverterProvider.class})
public class Customer {
  ...
}
```

La section de ce guide consacrée à la [conversion d'attributs](ddb-en-client-adv-features-conversion.md#ddb-en-client-adv-features-conversion-example) contient un exemple complet pour la version 2.

# Différences de gestion des chaînes entre la version 1 et la version 2 du SDK for Java
<a name="dynamodb-migration-string-handling"></a>

Les versions V1 et V2 traitent différemment les chaînes vides lors de l'envoi de données vers DynamoDB :
+ **V1** : Convertit les chaînes vides en valeurs nulles avant de les envoyer à DynamoDB (aucun attribut n'est donc créé)
+ **V2** : envoie des chaînes vides sous forme de valeurs de chaînes vides réelles à DynamoDB

**Important**  
Après la migration vers la version V2, si vous ne souhaitez pas que des chaînes vides soient stockées dans DynamoDB, vous devez implémenter des convertisseurs personnalisés. Sans convertisseurs personnalisés, la V2 stocke les chaînes vides en tant qu'attributs de chaînes vides réels dans vos éléments DynamoDB, ce qui est différent du comportement de la V1 qui consiste à omettre complètement ces attributs.

**Example convertisseur personnalisé pour V2 qui convertit un attribut de chaîne vide en null**  

```
/**
 * Custom converter that maintains V1 behavior by converting empty strings to null values
 * when writing to DynamoDB, ensuring compatibility with existing data. No attribute will be saved to DynamoDB.
 */
public class NullifyEmptyStringConverter implements AttributeConverter<String> {
    @Override
    public AttributeValue transformFrom(String value) {
        if (value == null || value.isEmpty()) {
            return AttributeValue.builder().nul(true).build();
        }
        return AttributeValue.builder().s(value).build();
    }

    @Override
    public String transformTo(AttributeValue attributeValue) {
        if (attributeValue.nul()) {
            return null;
        }
        return attributeValue.s();
    }

    @Override
    public EnhancedType<String> type() {
        return EnhancedType.of(String.class);
    }

    @Override
    public AttributeValueType attributeValueType() {
        return AttributeValueType.S;
    }
}

// V2 usage:
@DynamoDbBean
public class Customer {
    private String name;

    @DynamoDbConvertedBy(NullifyEmptyStringConverter.class)
    public String getName() {
        return name;
    }
}
```



# Différences de verrouillage optimistes entre la version 1 et la version 2 du SDK for Java
<a name="dynamodb-migrate-optimstic-locking"></a>

Les versions V1 et V2 implémentent un verrouillage optimiste avec une annotation d'attribut qui marque une propriété de votre classe de bean pour stocker le numéro de version.


**Différences entre les comportements de verrouillage optimistes**  

|  | V1 | V2 | 
| --- | --- | --- | 
| Annotation de classe Bean | @DynamoDBVersionAttribute | @DynamoDbVersionAttribute(notez que la V2 utilise un « b » minuscule) | 
| Sauvegarde initiale | Attribut du numéro de version défini sur 1. |  La valeur de départ de l'attribut de version défini avec`@DynamoDbVersionAttribute(startAt = X)`. La valeur par défaut est 0.  | 
| Mettre à jour | L'attribut du numéro de version est incrémenté de 1 si le contrôle conditionnel vérifie que le numéro de version de l'objet mis à jour correspond au numéro de la base de données. |  L'attribut du numéro de version est incrémenté si le contrôle conditionnel vérifie que le numéro de version de l'objet mis à jour correspond au numéro de la base de données. L'attribut du numéro de version incrémenté par l'`incrementBy`option définie avec`@DynamoDbVersionAttribute(incrementBy = X)`. La valeur par défaut est 1.  | 
| Suppression | DynamoDBMapperajoute une vérification conditionnelle pour vérifier que le numéro de version de l'objet supprimé correspond au numéro de version de la base de données. |  La V2 n'ajoute pas automatiquement de conditions pour les opérations de suppression. Vous devez ajouter des expressions de condition manuellement si vous souhaitez contrôler le comportement de suppression. Dans l'exemple suivant, `recordVersion` il s'agit de l'attribut version du bean. <pre>// 1. Read the item and get its current version.<br />Customer item = customerTable.getItem(Key.builder().partitionValue("someId").build());<br />AttributeValue currentVersion = item.getRecordVersion();<br /><br />// 2. Create conditional delete with the `currentVersion` value.<br />DeleteItemEnhancedRequest deleteItemRequest =<br />    DeleteItemEnhancedRequest.builder()<br />       .key(KEY)<br />       .conditionExpression(Expression.builder()<br />           .expression("recordVersion = :current_version_value")<br />           .putExpressionValue(":current_version_value", currentVersion)<br />           .build()).build();<br /><br />customerTable.deleteItem(deleteItemRequest);</pre>  | 
| Rédaction transactionnelle avec vérification des conditions | Vous ne pouvez pas utiliser une classe de bean annotée @DynamoDBVersionAttribute dans une addConditionCheck méthode. | Vous pouvez utiliser une classe de bean avec l'@DynamoDbVersionAttributeannotation dans une addConditionCheck méthode de création pour une transactWriteItems demande. | 
| Désactiver | Désactivez le verrouillage optimiste en modifiant la valeur de l' DynamoDBMapperConfig.SaveBehaviorénumération de UPDATE àCLOBBER. |  N'utilisez pas l'`@DynamoDbVersionAttribute`annotation.  | 

# Différences entre les versions 1 et 2 du SDK for Java avec Fluent Setters
<a name="dynamodb-migrate-fluent-setters"></a>

Vous pouvez l'utiliser POJOs avec des setters fluides dans l'API de mappage DynamoDB pour la version V1 et avec la version V2 depuis la version 2.30.29. 

Par exemple, le POJO suivant renvoie une `Customer` instance à partir de la `setName` méthode :

```
// V1

@DynamoDBTable(tableName ="Customer")
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){
     this.name = name;
     return this;
  }
}
```

Toutefois, si vous utilisez une version de V2 antérieure à la version 2.30.29, `setName` renvoie une `Customer` instance avec une `name` valeur de. `null`

```
// V2 prior to version 2.30.29.

@DynamoDbBean
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){ 
     this.name = name;
     return this;  // Bug: returns this instance with a `name` value of `null`.
  }
}
```

```
// Available in V2 since version 2.30.29.

@DynamoDbBean
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){ 
     this.name = name;
     return this;  // Returns this instance for method chaining with the `name` value set.
  }
}
```

# Différences entre l'API des documents entre la version 1 et la version 2 du AWS SDK pour Java
<a name="dynamodb-mapping-document-api"></a>

L'API Document permet de travailler avec des documents de style JSON sous forme d'éléments uniques dans une table DynamoDB. L'API de document V1 possède une API correspondante dans la version V2, mais au lieu d'utiliser un client distinct pour l'API de document comme dans la version V1, la version V2 intègre les fonctionnalités de l'API de document dans le client amélioré DynamoDB. 

Dans la version 1, la [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Item.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Item.html)classe représente un enregistrement non structuré d'une table DynamoDB. Dans la version 2, un enregistrement non structuré est représenté par une instance de la [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html)classe. Notez que les clés primaires sont définies dans le schéma de table pour la version 2 et sur l'élément lui-même dans la version 1.

Le tableau ci-dessous compare les différences entre le document APIs de la version 1 et de la version 2.


| Cas d’utilisation | V1 | V2 | 
| --- |--- |--- |
| Création d'un client de documents |  <pre>AmazonDynamoDB client = ... //Create a client.<br />DynamoDB documentClient = new DynamoDB(client);</pre>  |  <pre>// The V2 Document API uses the same DynamoDbEnhancedClient<br />// that is used for mapping POJOs.<br />DynamoDbClient standardClient = ... //Create a standard client.<br />DynamoDbEnhancedClient enhancedClient = ... // Create an enhanced client.<br /></pre>  | 
| Référencer un tableau |  <pre>Table documentTable = docClient.documentClient("Person");</pre>  |  <pre>DynamoDbTable<EnhancedDocument> documentTable = enhancedClient.table("Person",  <br />        TableSchema.documentSchemaBuilder()<br />              .addIndexPartitionKey(TableMetadata.primaryIndexName(),"id", AttributeValueType.S)<br />              .attributeConverterProviders(AttributeConverterProvider.defaultProvider())<br />              .build());</pre>  | 
| **Work with semi-structured data** | 
| --- |
| Mettre un élément |  <pre>Item item = new Item()<br />      .withPrimaryKey("id", 50)<br />      .withString("firstName", "Shirley");<br />PutItemOutcome outcome = documentTable.putItem(item);</pre>  |  <pre>EnhancedDocument personDocument = EnhancedDocument.builder()<br />        .putNumber("id", 50)<br />        .putString("firstName", "Shirley")<br />        .build();<br />documentTable.putItem(personDocument);</pre>  | 
| Obtenir un élément |  <pre>GetItemOutcome outcome = documentTable.getItemOutcome( "id", 50);<br />Item personDocFromDb = outcome.getItem();<br />String firstName = personDocFromDb.getString("firstName");<br /></pre>  |  <pre>EnhancedDocument personDocFromDb = documentTable<br />        .getItem(Key.builder()<br />            .partitionValue(50)<br />            .build()); <br />String firstName = personDocFromDb.getString("firstName");<br /></pre>  | 
| **Work with JSON items** | 
| --- |
| Convertir une structure JSON pour l'utiliser avec l'API Document |  <pre>// The 'jsonPerson' identifier is a JSON string. <br />Item item = new Item().fromJSON(jsonPerson);</pre>  |  <pre>// The 'jsonPerson' identifier is a JSON string.<br />EnhancedDocument document = EnhancedDocument.builder()<br />        .json(jsonPerson).build());</pre>  | 
| Mettez JSON |  <pre>documentTable.putItem(item)</pre>  |  <pre>documentTable.putItem(document);</pre>  | 
| Lire le JSON |  <pre>GetItemOutcome outcome = //Get item.<br />String jsonPerson = outcome.getItem().toJSON();</pre>  |  <pre>String jsonPerson = documentTable.getItem(Key.builder()<br />        .partitionValue(50).build())<br />        .fromJson();</pre>  | 

## Référence de l'API et guides pour le document APIs
<a name="dynamodb-mapping-document-api-ref"></a>


|  | V1 | V2 | 
| --- | --- | --- | 
| Référence des API | [Référence d’API](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/package-summary.html) | [Référence d’API](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/package-summary.html) | 
| Guide de documentation | [Guide du développeur Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPIItemCRUD.html) | [API de documents améliorée](ddb-en-client-doc-api.md) (ce guide) | 

# API Xpec V1 vers API d'expressions V2
<a name="ddb-v1-xspec-migrate"></a>

L'API Expression Specification (Xspec) disponible dans la version 1 qui permet de créer des expressions destinées à fonctionner avec des données orientées document n'est pas disponible dans la version 2. La V2 utilise l'API Expression, qui fonctionne à la fois avec des données orientées document et des données object-to-item mappées.


****  

|  | V1 | V2 | 
| --- | --- | --- | 
| Nom de l’API | API de spécification d'expression (Xspec) | API d'expression | 
| Fonctionne avec | [Méthodes de la classe Document API [Table](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html), telles que [UpdateItem et scan](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html#updateItem-java.lang.String-java.lang.Object-com.amazonaws.services.dynamodbv2.xspec.UpdateItemExpressionSpec-)](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html#scan-com.amazonaws.services.dynamodbv2.xspec.ScanExpressionSpec-) |  Les deux APIs versions du client DynamoDB Enhanced : [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) Pour les deux types de APIs, après avoir acquis une [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/DynamoDbTable.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/DynamoDbTable.html)instance : [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) vous utilisez des expressions dans `DynamoDbTable` les méthodes lorsque vous créez des objets de demande. Par exemple, dans la `filterExpression` méthode du [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/model/QueryEnhancedRequest.Builder.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/model/QueryEnhancedRequest.Builder.html)  | 
| Ressources |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html)  | [Informations sur les expressions](ddb-en-client-expressions.md) contenues dans ce guide du développeur Java | 

# Migration de bibliothèques de chiffrement
<a name="ddb-encryption-lib-migrate"></a>

Pour plus d'informations sur la migration de la bibliothèque de chiffrement pour que DynamoDB fonctionne avec la version V2 du SDK Java, consultez le guide du développeur du client de chiffrement Amazon [DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html).