

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Alterações no APIs mapeamento do DynamoDB entre a versão 1 e a versão 2 do SDK for Java
<a name="dynamodb-mapping-api-changes"></a>

## Criar um cliente
<a name="dynamodb-mapping-api-changes-client"></a>


****  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|   Instanciação normal  |  <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>  | 
|   Instanciação mínima  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create();</pre>  | 
|   Com transformador de atributo\$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>  | 

\$1As extensões na V2 correspondem aproximadamente aos transformadores de atributos na V1. A seção [Usar extensões para personalizar as operações do Cliente Aprimorado do DynamoDB](ddb-en-client-extensions.md) contém mais informações sobre extensões na V2. 

## Estabelecer o mapeamento para tabela/índice do DynamoDB
<a name="dynamodb-mapping-api-changes-mapping"></a>

Na V1, você especifica um nome de tabela do DynamoDB por meio de uma anotação de bean. Na V2, um método de fábrica, `table()`, produz uma instância de `DynamoDbTable` que representa a tabela remota do DynamoDB. O primeiro parâmetro do método `table()` é o nome da tabela do DynamoDB.


****  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|   Mapear a classe Java POJO para a tabela do 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>  | 
|   Mapear para um índice secundário do DynamoDB  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) A seção do Guia do desenvolvedor do DynamoDB que discute[ o método `query` da V1](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query) mostra um exemplo completo.  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) A seção [Usar índices secundários](ddb-en-client-use-secindex.md) deste guia fornece mais informações.  | 

## Operações de tabela
<a name="dynamodb-mapping-api-changes-tobleops"></a>

Esta seção descreve as operações APIs que diferem entre V1 e V2 na maioria dos casos de uso padrão. 

Na V2, todas as operações que envolvem uma única tabela são chamadas na instância `DynamoDbTable`, não no cliente aprimorado. O cliente aprimorado contém métodos que podem ter como destino várias tabelas. 

Na tabela chamada *Operações de tabela* abaixo, uma instância POJO é chamada de `item` ou como um tipo específico, como `customer1`. Para os exemplos da V2 de as instâncias nomeadas, `table` é o resultado de uma chamada anterior a `enhancedClient.table()` que retorna uma referência à instância `DynamoDbTable`.

Observe que a maioria das operações da V2 pode ser chamada com um padrão de consumidor fluente, mesmo quando não mostrado. Por exemplo,

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

Para operações da V1, as *Operações de tabela* (abaixo) contêm algumas das formas mais usadas, mas não todas as formas com sobrecargas. Por exemplo, o método `load()` tem as seguintes sobrecargas:

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

As *Operações de tabela* (abaixo) mostram as formas comumente usados:

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


**Operações de tabela**  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|  Gravar um Java POJO em uma tabela do DynamoDB **Operação do DynamoDB:** `PutItem`, `UpdateItem`  |  <pre>mapper.save(item)<br />mapper.save(item, config)<br />mapper.save(item, saveExpression, config)</pre> Na V1, `DynamoDBMapperConfig.SaveBehavior` e anotações determinam qual método de baixo nível do DynamoDB será chamado. Em geral, `UpdateItem` é chamado, exceto quando se usa `SaveBehavior.CLOBBER` e `SaveBehavior.PUT`. As chaves geradas automaticamente são um caso de uso especial e, ocasionalmente, tanto `PutItem` como `UpdateItem` são usadas.  |  <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>  | 
|  Ler um item de uma tabela do DynamoDB para um Java POJO **Operação do 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>  | 
|  Excluir um item de uma tabela do DynamoDB **Operação do DynamoDB:** `DeleteItem`  |  <pre>mapper.delete(item, deleteExpression, config)</pre>  |  <pre>table.deleteItem(deleteItemRequest)<br />table.deleteItem(item)<br />table.deleteItem(key)</pre>  | 
|  Consultar uma tabela ou um índice secundário do DynamoDB e retornar uma lista paginada **Operação do 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> Usar o `PageIterable.stream()` retornado (carregamento lento) para respostas sincronizadas e `PagePublisher.subscribe()` para respostas assíncronas  | 
|  Consultar uma tabela ou um índice secundário do DynamoDB e retornar uma lista **Operação do 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> Usar o `PageIterable.items()` retornado (carregamento lento) para respostas sincronizadas e `PagePublisher.items.subscribe()` para respostas assíncronas  | 
|  Verificar uma tabela ou um índice secundário do DynamoDB e retornar uma lista paginada **Operação do 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> Usar o `PageIterable.stream()` retornado (carregamento lento) para respostas sincronizadas e `PagePublisher.subscribe()` para respostas assíncronas  | 
|  Fazer uma varredura de uma tabela ou um índice secundário do DynamoDB e retornar uma lista **Operação do 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> Usar o `PageIterable.items()` retornado (carregamento lento) para respostas sincronizadas e `PagePublisher.items.subscribe()` para respostas assíncronas  | 
|  Ler vários itens de várias tabelas em um lote **Operação do 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>  | 
|  Gravar vários itens em várias tabelas em um lote **Operação do 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>  | 
|  Excluir vários itens de várias tabelas em um lote **Operação do 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>  | 
|  Gravar/excluir vários itens em um lote **Operação do 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>  | 
|  Fazer uma gravação transacional **Operação do DynamoDB:** `TransactWriteItems`  |  <pre>mapper.transactionWrite(transactionWriteRequest)</pre>  |  <pre>enhancedClient.transactWriteItems(transasctWriteItemsRequest)</pre>  | 
|  Fazer uma leitura transacional **Operação do DynamoDB:** `TransactGetItems`  |  <pre>mapper.transactionLoad(transactionLoadRequest)</pre>  |  <pre>enhancedClient.transactGetItems(transactGetItemsRequest) </pre>  | 
|  Obter uma contagem de itens correspondentes de uma consulta **Operação do DynamoDB:** `Query` com `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>  | 
|  Obter uma contagem de itens correspondentes de uma varredura **Operação do DynamoDB:** `Scan` com `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>  | 
|  Criar uma tabela no DynamoDB correspondente à classe POJO **Operação do DynamoDB:** `CreateTable`  |  <pre>mapper.generateCreateTableRequest(Customer.class)</pre> A declaração anterior gera uma solicitação de criação de tabela de baixo nível; os usuários devem chamar `createTable` no cliente do 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>  | 
|  Fazer uma varredura paralela no DynamoDB **Operação do DynamoDB:** `Scan` com parâmetros `Segment` e `TotalSegments`  |  <pre>mapper.parallelScan(Customer.class, <br />                    scanExpression, <br />                    numTotalSegments)</pre>  |  Os usuários devem gerenciar as threads de operador e chamar `scan` para cada segmento: <pre>table.scan(r -> r.segment(0).totalSegments(5))</pre>  | 
|  Integrar o Amazon S3 com o DynamoDB para armazenar links inteligentes do S3  |  <pre>mapper.createS3Link(bucket, key)<br />mapper.getS3ClientCache()</pre>  |  Incompatível porque combina o Amazon S3 e o DynamoDB.  | 

## Classes e propriedades de mapa
<a name="dynamodb-mapping-schemas"></a>

Tanto na V1 quanto na V2, você mapeia classes para tabelas usando anotações no estilo bean. A V2 também [oferece outras formas de definir esquemas](ddb-en-client-adv-features.md#ddb-en-client-adv-features-schm-overview) para casos de uso específicos, como trabalhar com classes imutáveis.

### Anotações de bean
<a name="dynamodb-mapping-schemas-annos"></a>

A tabela a seguir mostra as anotações de bean equivalentes para um caso de uso específico que são usadas na V1 e na V2. Um cenário de classe `Customer` é usado para ilustrar os parâmetros.

As anotações, assim como as classes e enumerações, na V2 seguem a convenção camel case e usam '', não 'DynamoDB'. DynamoDb


| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
| Mapear classe para tabela |  <pre>@DynamoDBTable (tableName ="CustomerTable")</pre>  | <pre>@DynamoDbBean<br />@DynamoDbBean(converterProviders = {...})</pre>O nome da tabela é definido ao chamar o método DynamoDbEnhancedClient\$1table(). | 
| Designar um membro da classe como um atributo da tabela  |  <pre>@DynamoDBAttribute(attributeName = "customerName")</pre>  |  <pre>@DynamoDbAttribute("customerName") </pre>  | 
| Designar um membro da classe é fundamental hash/partition  |  <pre>@DynamoDBHashKey </pre>  |  <pre>@DynamoDbPartitionKey</pre>  | 
| Designar um membro da classe é fundamental range/sort  |  <pre>@DynamoDBRangeKey </pre>  |  <pre>@DynamoDbSortKey </pre>  | 
| Designar um membro da classe é uma chave de partição/hash de índice secundário |  <pre>@DynamoDBIndexHashKey </pre>  |  <pre>@DynamoDbSecondaryPartitionKey </pre>  | 
| Designar um membro da classe é uma chave de classificação/intervalo de índice secundário |  <pre>@DynamoDBIndexRangeKey </pre>  |  <pre>@DynamoDbSecondarySortKey </pre>  | 
| Ignorar esse membro da classe ao mapear para uma tabela |  <pre>@DynamoDBIgnore </pre>  |  <pre>@DynamoDbIgnore</pre>  | 
| Designar um membro da classe como um atributo de chave UUID gerado automaticamente |  <pre>@DynamoDBAutoGeneratedKey</pre>  |  <pre>@DynamoDbAutoGeneratedUuid </pre> A extensão que fornece isso não é carregada por padrão; você deve adicionar a extensão ao compilador de cliente.  | 
| Designar um membro da classe como um atributo de carimbo de data e hora gerado automaticamente |  <pre>@DynamoDBAutoGeneratedTimestamp</pre>  |  <pre>@DynamoDbAutoGeneratedTimestampAttribute</pre> A extensão que fornece isso não é carregada por padrão; você deve adicionar a extensão ao compilador de cliente.  | 
| Designar um membro da classe como um atributo de versão incrementado automaticamente |  <pre>@DynamoDBVersionAttribute</pre>  |  <pre>@DynamoDbVersionAttribute</pre> A extensão que fornece isso é carregada automaticamente.  | 
| Designar um membro da classe como solicitando uma conversão personalizada |  <pre>@DynamoDBTypeConverted</pre>  |  <pre>@DynamoDbConvertedBy</pre>  | 
| Designar um membro da classe para ser armazenado como um tipo de atributo diferente |  <pre>@DynamoDBTyped(<DynamoDBAttributeType>)</pre>  |  Use uma implementação `AttributeConverter`. A V2 fornece muitos conversores incorporados para tipos de Java comuns. Você também pode implementar seu próprio `AttributeConverter` ou `AttributeConverterProvider` personalizado. Veja [Conversão de atributo de controle](ddb-en-client-adv-features-conversion.md) neste guia.  | 
| Designar uma classe que possa ser serializada em um documento do DynamoDB (documento no estilo JSON) ou subdocumento  |  <pre>@DynamoDBDocument</pre>  | Use a API de documento aprimorado. Consulte os recursos a seguir:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) | 

### Anotações adicionais da V2
<a name="dynamodb-mapping-schemas-annos-v2-addnl"></a>


| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
| Designar um membro da classe para não ser armazenado como um atributo NULL se o valor Java for nulo | N/D |  <pre>@DynamoDbIgnoreNulls</pre>  | 
| Designar um membro da classe para ser um objeto vazio se todos os atributos forem nulos | N/D |  <pre>@DynamoDbPreserveEmptyObject</pre>  | 
| Designar uma ação especial de atualização para um membro da classe | N/D |  <pre>@DynamoDbUpdateBehavior</pre>  | 
| Designar uma classe imutável | N/D |  <pre>@DynamoDbImmutable</pre>  | 
| Designar um membro da classe como um atributo de contador incrementado automaticamente | N/D |  <pre>@DynamoDbAtomicCounter</pre> A extensão que fornece essa funcionalidade é carregada automaticamente.  | 

## Configuração
<a name="dynamodb-mapping-configuration"></a>

Na V1, você geralmente controla comportamentos específicos usando uma instância de `DynamoDBMapperConfig`. Você pode fornecer o objeto de configuração ao criar o mapeador ou ao fazer uma solicitação. Na V2, a configuração é específica para o objeto de solicitação da operação.


| Caso de uso | V1 | Padrão na V1 | V2 | 
| --- | --- | --- | --- | 
|  |  <pre>DynamoDBMapperConfig.builder()</pre>  |  |  | 
| Estratégia de load/write repetição em lote |  <pre>  .withBatchLoadRetryStrategy(loadRetryStrategy)</pre> <pre>  .withBatchWriteRetryStrategy(writeRetryStrategy)</pre>  | fazer novas tentativas de itens com falha | Configure a estratégia de novas tentativas no DynamoDBClient subjacente. Veja [Configure o comportamento de repetição no AWS SDK for Java 2.x](retry-strategy.md) neste guia. | 
| Leituras consistentes |  <pre>  .withConsistentReads(CONSISTENT)</pre>  | EVENTUAL | Por padrão, leituras consistentes são falsas para operações de leitura. Substitua por .consistentRead(true) no objeto de solicitação. | 
| Esquema de conversão com conjuntos de marshallers/unmarshallers |  <pre>  .withConversionSchema(conversionSchema)</pre> As implementações estáticas fornecem compatibilidade retroativa com versões mais antigas.  | V2\$1COMPATIBLE | Não aplicável. Esse é um recurso legado que se refere à forma como as versões mais antigas do DynamoDB (V1) armazenavam os tipos de dados, e esse comportamento não será preservado no cliente aprimorado. Um exemplo de comportamento no DynamoDB V1 é armazenar boolianos como número em vez de boolianos. | 
| Nomes das tabelas |  <pre>  .withObjectTableNameResolver()<br />  .withTableNameOverride() <br />  .withTableNameResolver()</pre> As implementações estáticas fornecem compatibilidade retroativa com versões mais antigas  | usar anotação ou suposição da classe |  O nome da tabela é definido ao chamar o método `DynamoDbEnhancedClient#table()`.  | 
| Estratégia de carregamento de paginação |  <pre>  .withPaginationLoadingStrategy(strategy)</pre>  As opções são: LAZY\$1`LOADING`, `EAGER_LOADING` ou `ITERATION_ONLY`  | LAZY\$1LOADING |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html)  | 
| Solicitar coleta de métricas |  <pre>  .withRequestMetricCollector(collector)</pre>  | null | Use metricPublisher() em ClientOverrideConfiguration ao criar o cliente padrão do DynamoDB.  | 
| Comportamento de salvamento |  <pre>  .withSaveBehavior(SaveBehavior.CLOBBER) </pre> As opções são `UPDATE`, `CLOBBER`, `PUT`, `APPEND_SET` ou `UPDATE_SKIP_NULL_ATTRIBUTES`.  | UPDATE |  Na V2, você chama `putItem()` ou `updateItem()` explicitamente. `CLOBBER or PUT`: a ação correspondente na v2 está chamando `putItem()`. Não há configuração `CLOBBER` específica. `UPDATE`: Corresponde a `updateItem()` `UPDATE_SKIP_NULL_ATTRIBUTES`: Corresponde `updateItem()` a. Controle o comportamento da atualização com a configuração da solicitação `ignoreNulls` e a anotação/tag `DynamoDbUpdateBehavior`. `APPEND_SET`: incompatível  | 
| Fábrica de conversão de tipo |  <pre>  .withTypeConverterFactory(typeConverterFactory) </pre>  | conversores de tipo padrão |  Definir o bean usando <pre>@DynamoDbBean(converterProviders = {ConverterProvider.class, <br />        DefaultAttributeConverterProvider.class})</pre>  | 

### Configuração por operação
<a name="dynamodb-mapping-configuration-per-op"></a>

Na V1, algumas operações, como `query()`, são altamente configuráveis por meio de um objeto de “expressão” enviado à operação. Por exemplo:

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

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

Na V2, em vez de usar um objeto de configuração, você define parâmetros no objeto de solicitação usando um compilador. Por exemplo:

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

customerTable.query(emailBw);
```

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

Na V2, as expressões condicionais e de filtragem são expressas usando um objeto `Expression`, que encapsula a condição e o mapeamento de nomes e filtros. 


| Caso de uso | Operações | V1 | V2 | 
| --- | --- | --- | --- | 
| Condições de atributo esperadas | save(), delete(), query(), scan() |  <pre>new DynamoDBSaveExpression()<br />  .withExpected(Collections.singletonMap(<br />      "otherAttribute", new ExpectedAttributeValue(false)))<br />  .withConditionalOperator(ConditionalOperator.AND);</pre>  | Obsoleto; use ConditionExpression em vez disso. | 
| Expressão de condição | delete() |  <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>  | 
| Expressão de filtro | query(), 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>  | 
| Expressão de condição para consulta | query() |  <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>  | 

## Conversão de tipo
<a name="dynamodb-mapping-type-conv"></a>

### Conversores padrão
<a name="dynamodb-mapping-type-conv-defaults"></a>

Na V2, o SDK fornece um conjunto de conversores padrão para todos os tipos comuns. É possível alterar os conversores de tipo tanto no nível geral do provedor quanto em um único atributo. Você pode encontrar uma lista dos conversores disponíveis na referência da [AttributeConverter](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverter.html)API.

### Definir um conversor personalizado para um atributo
<a name="dynamodb-mapping-type-conv-anno"></a>

Na V1, é possível e anotar um método getter com `@DynamoDBTypeConverted` para especificar a classe que é convertida entre o tipo de atributo Java e o tipo de atributo do DynamoDB. Por exemplo, um `CurrencyFormatConverter` que converte entre um tipo Java `Currency` e uma string do DynamoDB pode ser aplicada conforme mostrado no trecho a seguir.

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

O equivalente da V2 do trecho anterior é mostrado abaixo.

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

**nota**  
Na V1, é possível aplicar a anotação ao próprio atributo, a um tipo ou a uma anotação definida pelo usuário. A V2 permite a aplicação da anotação somente ao getter.

### Adicionar uma fábrica ou fornecedor de conversor de tipo
<a name="dynamodb-mapping-type-conv-factory"></a>

Na V1, você pode fornecer seu próprio conjunto de conversores de tipo, ou substituir os tipos que forem importantes para você adicionando uma fábrica de conversores de tipo à configuração. A fábrica do conversor de tipos amplia `DynamoDBTypeConverterFactory` e as substituições são feitas obtendo uma referência ao conjunto padrão e ampliando-o. O trecho a seguir demonstra como fazer isso.

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

A V2 fornece funcionalidade semelhante por meio da anotação `@DynamoDbBean`. Você pode fornecer um único `AttributeConverterProvider` ou uma cadeia de `AttributeConverterProvider`s ordenados. Observe que, se fornecer sua própria cadeia de provedores de conversão de atributos, você substituirá o provedor de conversão padrão, e deve incluí-lo na cadeia para usar os conversores de atributos. 

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

A seção sobre [conversão de atributos](ddb-en-client-adv-features-conversion.md#ddb-en-client-adv-features-conversion-example) neste guia contém um exemplo completo para a V2.