Änderungen im DynamoDB-Mapping/Dokument APIs von Version 1 zu Version 2 - AWS SDK for Java 2.x

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Änderungen im DynamoDB-Mapping/Dokument APIs von Version 1 zu Version 2

In diesem Thema werden die Änderungen in SDK Javas High-Level APIs für Amazon DynamoDB von Version 1.x (v1) auf AWS SDK for Java 2.x (v2) beschrieben. Wir behandeln zuerst das object-to-table Mapping API und besprechen dann das Dokument API für die Arbeit mit JSON Dokumenten im -stil.

Änderungen auf hoher Ebene

Die Namen der Mapping-Clients in den einzelnen Bibliotheken unterscheiden sich in Version 1 und Version 2:

  • v1 — D ynamoDBMapper

  • v2 — Erweiterter DynamoDB-Client

Sie interagieren mit den beiden Bibliotheken auf die gleiche Weise: Sie instanziieren einen Mapper/Client und stellen dann ein Java bereit, APIs das diese Elemente liest und in POJO DynamoDB-Tabellen schreibt. Beide Bibliotheken bieten auch Anmerkungen für die Klasse von, um zu bestimmen, wie der Client mit dem umgehtPOJO. POJO

Zu den bemerkenswerten Unterschieden bei der Umstellung auf Version 2 gehören:

  • V2 und v1 verwenden unterschiedliche Methodennamen für die DynamoDB-Operationen auf niedriger Ebene. Beispielsweise:

    v1 v2
    load getItem
    save putItem
    batchLoad batchGetItem
  • V2 bietet mehrere Möglichkeiten, Tabellenschemas zu definieren und Tabellen zuzuordnen. POJOs Sie können zwischen der Verwendung von Anmerkungen oder einem Schema wählen, das mithilfe eines Builders aus Code generiert wurde. V2 bietet auch veränderbare und unveränderliche Versionen von Schemas.

  • Bei v2 erstellen Sie als einen der ersten Schritte speziell das Tabellenschema, wohingegen in Version 1 das Tabellenschema nach Bedarf aus der annotierten Klasse abgeleitet wird.

  • In V2 ist der APIDocument-Client im erweiterten Client enthaltenAPI, wohingegen in Version 1 ein separater Client verwendet wird. API

  • Alle APIs sind in Version 2 in synchronen und asynchronen Versionen verfügbar.

Ausführlichere Informationen zum erweiterten v2-Client finden Sie im Abschnitt DynamoDB-Mapping in diesem Handbuch.

Abhängigkeiten importieren

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

* Letzte Version.

In Version 1 umfasst eine einzelne Abhängigkeit sowohl DynamoDB API auf niedriger Ebene als auch das Mapping/DokumentAPI, wohingegen Sie in Version 2 die dynamodb-enhanced Artefaktabhängigkeit verwenden, um auf das Mapping/das Dokument zuzugreifen. API Das dynamodb-enhanced Modul enthält eine transitive Abhängigkeit vom Low-Level-Modul. dynamodb

APIändert sich

Einen Kunden erstellen

Anwendungsfall v1 v2

Normale Instanziierung

AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard() .withCredentials(credentialsProvider) .withRegion(Regions.US_EAST_1) .build(); DynamoDBMapper mapper = new DynamoDBMapper(standardClient);
DynamoDbClient standardClient = DynamoDbClient.builder() .credentialsProvider(ProfileCredentialsProvider.create()) .region(Region.US_EAST_1) .build(); DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder() .dynamoDbClient(standardClient) .build();

Minimale Instanziierung

AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard(); DynamoDBMapper mapper = new DynamoDBMapper(standardClient);
DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create();

Mit dem Attribut Transformator *

DynamoDBMapper mapper = new DynamoDBMapper(standardClient, attributeTransformerInstance);
DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder() .dynamoDbClient(standardClient) .extensions(extensionAInstance, extensionBInstance) .build();

* Erweiterungen in v2 entsprechen in etwa den Attributtransformatoren in v1. Der Verwenden Sie Erweiterungen Abschnitt enthält weitere Informationen zu Erweiterungen in v2.

Zuordnung zur DynamoDB-Tabelle/zum DynamoDB-Index einrichten

In Version 1 geben Sie einen DynamoDB-Tabellennamen über eine Bean-Annotation an. In Version 2 erzeugt eine Factory-Methode,table(), eine Instanz von, DynamoDbTable die die Remote-DynamoDB-Tabelle darstellt. Der erste Parameter der table() Methode ist der DynamoDB-Tabellenname.

Anwendungsfall v1 v2

Ordnen Sie die POJO Java-Klasse der DynamoDB-Tabelle zu

@DynamoDBTable(tableName ="Customer") public class Customer { ... }
DynamoDbTable<Customer> customerTable = enhancedClient.table("Customer", TableSchema.fromBean(Customer.class));

Einem DynamoDB-Sekundärindex zuordnen

  1. Definieren Sie eine POJO Klasse, die den Index repräsentiert.

    • Kommentieren Sie die Klasse @DynamoDBTable mit dem Namen der Tabelle, die den Index enthält.

    • Kommentieren Sie Eigenschaften optional mit @DynamoDBIndexHashKey und. @DynamoDBIndexRangeKey

  2. Erstellen Sie einen Abfrageausdruck.

  3. Abfrage unter Verwendung eines Verweises auf die POJO Klasse, die den Index darstellt. Beispiel

    mapper.query(IdEmailIndex.class, queryExpression)

    wo IdEmailIndex ist die Zuordnungsklasse für den Index.

Der Abschnitt im DynamoDB Developer Guide, in dem die query v1-Methode beschrieben wird, enthält ein vollständiges Beispiel.

  1. Kommentieren Sie Attribute einer POJO Klasse mit @DynamoDbSecondaryPartitionKey (für a GSI) und @DynamoDbSecondarySortKey (für und GSI oder). LSI Zum Beispiel

    @DynamoDbSecondarySortKey(indexNames = "IdEmailIndex") public String getEmail() { return this.email; }
  2. Ruft einen Verweis auf den Index ab. Zum Beispiel

    DynamoDbIndex<Customer> customerIndex = customerTable.index("IdEmailIndex");
  3. Fragen Sie den Index ab.

Der Verwenden Sie sekundäre Indizes Abschnitt in diesem Handbuch enthält weitere Informationen.

Tabellenoperationen

In diesem Abschnitt werden Operationen beschriebenAPIs, die sich in den meisten Standardanwendungsfällen zwischen Version 1 und Version 2 unterscheiden.

In Version 2 werden alle Operationen, die eine einzelne Tabelle betreffen, auf der DynamoDbTable Instanz aufgerufen, nicht auf dem erweiterten Client. Der erweiterte Client enthält Methoden, die auf mehrere Tabellen abzielen können.

In der folgenden Tabelle mit dem Namen Tabellenoperationen wird eine POJO Instanz als item oder als ein bestimmter Typ bezeichnet, z. customer1 B. In den v2-Beispielen sind die genannten Instanzen table das Ergebnis eines vorherigen AufrufsenhancedClient.table(), der einen Verweis auf die DynamoDbTable Instanz zurückgibt.

Beachten Sie, dass die meisten v2-Operationen mit einem fließenden Benutzermuster aufgerufen werden können, auch wenn sie nicht angezeigt werden. Zum Beispiel

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

Für v1-Operationen enthält die Tabelle einige der häufig verwendeten Formulare und nicht alle überladenen Formulare. Die load() Methode weist beispielsweise die folgenden Überladungen auf:

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)

Die Tabelle zeigt die am häufigsten verwendeten Formen:

mapper.load(item) mapper.load(item, config)
Tabellenoperationen
Anwendungsfall v1 DynamoDB-Betrieb v2

Schreiben Sie ein Java POJO in eine DynamoDB-Tabelle

mapper.save(item) mapper.save(item, config) mapper.save(item, saveExpression, config)

In Version 1 bestimmen DynamoDBMapperConfig.SaveBehavior Annotationen, welche Low-Level-DynamoDB-Methode aufgerufen wird. Wird im Allgemeinen aufgerufen, außer wenn und verwendet UpdateItem wird. SaveBehavior.CLOBBER SaveBehavior.PUT Automatisch generierte Schlüssel sind ein besonderer Anwendungsfall. Gelegentlich UpdateItem werden PutItem sowohl als auch beide verwendet.

PutItem, UpdateItem
table.putItem(putItemRequest) table.putItem(item) table.putItemWithResponse(item) //Returns metadata. updateItem(updateItemRequest) table.updateItem(item) table.updateItemWithResponse(item) //Returns metadata.
Ein Element aus einer DynamoDB-Tabelle in ein Java lesen POJO
mapper.load(item) mapper.load(item, config)
GetItem
table.getItem(getItemRequest) table.getItem(item) table.getItem(key) table.getItemWithResponse(key) //Returns POJO with metadata.
Löschen Sie ein Element aus einer DynamoDB-Tabelle
mapper.delete(item, deleteExpression, config)
DeleteItem
table.deleteItem(deleteItemRequest) table.deleteItem(item) table.deleteItem(key)
Fragen Sie eine DynamoDB-Tabelle oder einen sekundären Index ab und geben Sie eine paginierte Liste zurück
mapper.query(Customer.class, queryExpression) mapper.query(Customer.class, queryExpression, mapperConfig)
Query
table.query(queryRequest) table.query(queryConditional)

Verwenden Sie die zurückgegebenen Daten PageIterable.stream() (verzögertes Laden) für synchrone Antworten und für asynchrone PagePublisher.subscribe() Antworten

Eine DynamoDB-Tabelle oder einen sekundären Index abfragen und eine Liste zurückgeben
mapper.queryPage(Customer.class, queryExpression) mapper.queryPage(Customer.class, queryExpression, mapperConfig)
Query
table.query(queryRequest) table.query(queryConditional)

Verwenden Sie die zurückgegebenen Daten PageIterable.items() (verzögertes Laden) für synchrone Antworten und PagePublisher.items.subscribe() für asynchrone Antworten

Scannen Sie eine DynamoDB-Tabelle oder einen sekundären Index und geben Sie eine paginierte Liste zurück
mapper.scan(Customer.class, scanExpression) mapper.scan(Customer.class, scanExpression, mapperConfig)
Scan
table.scan() table.scan(scanRequest)

Verwenden Sie die zurückgegebenen Daten PageIterable.stream() (verzögertes Laden) für synchrone Antworten und für asynchrone PagePublisher.subscribe() Antworten

Eine DynamoDB-Tabelle oder einen sekundären Index scannen und eine Liste zurückgeben
mapper.scanPage(Customer.class, scanExpression) mapper.scanPage(Customer.class, scanExpression, mapperConfig)
Scan
table.scan() table.scan(scanRequest)

Verwenden Sie die zurückgegebenen Daten PageIterable.items() (verzögertes Laden) für synchrone Antworten und PagePublisher.items.subscribe() für asynchrone Antworten

Lesen Sie mehrere Elemente aus mehreren Tabellen in einem Stapel
mapper.batchLoad(Arrays.asList(customer1, customer2, book1)) mapper.batchLoad(itemsToGet) // itemsToGet: Map<Class<?>, List<KeyPair>>
BatchGetItem
enhancedClient.batchGetItem(batchGetItemRequest) enhancedClient.batchGetItem(r -> r.readBatches( ReadBatch.builder(Record1.class) .mappedTableResource(mappedTable1) .addGetItem(i -> i.key(k -> k.partitionValue(0))) .build(), ReadBatch.builder(Record2.class) .mappedTableResource(mappedTable2) .addGetItem(i -> i.key(k -> k.partitionValue(0))) .build())) // Iterate over pages with lazy loading or over all items from the same table.
Schreiben Sie mehrere Elemente in einem Stapel in mehrere Tabellen
mapper.batchSave(Arrays.asList(customer1, customer2, book1))
BatchWriteItem
enhancedClient.batchWriteItem(batchWriteItemRequest) enhancedClient.batchWriteItem(r -> r.writeBatches( WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) .addPutItem(item1) .build(), WriteBatch.builder(Record2.class) .mappedTableResource(mappedTable2) .addPutItem(item2) .build()))
Löschen Sie mehrere Elemente aus mehreren Tabellen in einem Stapel
mapper.batchDelete(Arrays.asList(customer1, customer2, book1))
BatchWriteItem
enhancedClient.batchWriteItem(r -> r.writeBatches( WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) .addDeleteItem(item1key) .build(), WriteBatch.builder(Record2.class) .mappedTableResource(mappedTable2) .addDeleteItem(item2key) .build()))
Schreiben/löschen Sie mehrere Elemente in einem Stapel
mapper.batchWrite(Arrays.asList(customer1, book1), Arrays.asList(customer2))
BatchWriteItem
enhancedClient.batchWriteItem(r -> r.writeBatches( WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) .addPutItem(item1) .build(), WriteBatch.builder(Record2.class) .mappedTableResource(mappedTable2) .addDeleteItem(item2key) .build()))
Führen Sie einen transaktionalen Schreibvorgang durch
mapper.transactionWrite(transactionWriteRequest)
TransactWriteItems
enhancedClient.transactWriteItems(transasctWriteItemsRequest)
Führen Sie einen transaktionalen Lesevorgang durch
mapper.transactionLoad(transactionLoadRequest)
TransactGetItems
enhancedClient.transactGetItems(transactGetItemsRequest)
Ermittelt die Anzahl der übereinstimmenden Elemente eines Scans oder einer Abfrage
mapper.count(Customer.class, queryExpression) mapper.count(Customer.class, scanExpression)
Query, Scan mit Select.COUNT Nicht unterstützt
Erstellen Sie eine Tabelle in DynamoDB, die der Klasse entspricht POJO
mapper.generateCreateTableRequest(Customer.class)

Die vorherige Anweisung generiert eine Low-Level-Anforderung zur Tabellenerstellung; Benutzer müssen den DynamoDB-Client aufrufencreateTable.

CreateTable
table.createTable(createTableRequest) table.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput()) .globalSecondaryIndices( EnhancedGlobalSecondaryIndex.builder() .indexName("gsi_1") .projection(p -> p.projectionType(ProjectionType.ALL)) .provisionedThroughput(getDefaultProvisionedThroughput()) .build()));
Führen Sie einen parallel Scan in DynamoDB durch
mapper.parallelScan(Customer.class, scanExpression, numTotalSegments)
Scanmit und Parametern Segment TotalSegments

Benutzer müssen die Worker-Threads verwalten und scan für jedes Segment aufrufen:

table.scan(r -> r.segment(0).totalSegments(5))
Integrieren Sie Amazon S3 mit DynamoDB, um intelligente S3-Links zu speichern
mapper.createS3Link(bucket, key) mapper.getS3ClientCache()
-

Wird nicht unterstützt, da es Amazon S3 und DynamoDB verbindet.

Ordnen Sie Klassen und Eigenschaften zu

Sowohl in Version 1 als auch in Version 2 ordnen Sie Klassen Tabellen mithilfe von Anmerkungen im Bean-Stil zu. V2 bietet auch andere Möglichkeiten, Schemas für bestimmte Anwendungsfälle zu definieren, z. B. die Arbeit mit unveränderlichen Klassen.

Bean-Anmerkungen

Die folgende Tabelle zeigt die entsprechenden Bean-Annotationen für einen bestimmten Anwendungsfall, die in Version 1 und V2 verwendet werden. Ein Customer Klassenszenario wird verwendet, um Parameter zu veranschaulichen.

Anmerkungen — ebenso wie Klassen und Aufzählungen — in Version 2 folgen der Camel-Case-Konvention und verwenden '', nicht 'DynamoDB'. DynamoDb

Anwendungsfall v1 v2
Ordnen Sie die Klasse der Tabelle zu
@DynamoDBTable (tableName ="CustomerTable")
@DynamoDbBean @DynamoDbBean(converterProviders = {...})
Der Tabellenname wird beim Aufrufen der DynamoDbEDnhancedClient#table() Methode definiert.
Benennen Sie ein Klassenmitglied als Tabellenattribut
@DynamoDBAttribute(attributeName = "customerName")
@DynamoDbAttribute("customerName")
Benennen Sie ein Klassenmitglied als Hash-/Partitionsschlüssel
@DynamoDBHashKey
@DynamoDbPartitionKey
Ein Klassenmitglied als Bereichs-/Sortierschlüssel bezeichnen
@DynamoDBHashKey
@DynamoDbSortKey
Benennen Sie ein Klassenmitglied als sekundären Index-Hash-/Partitionsschlüssel
@DynamoDBIndexHashKey
@DynamoDbSecondaryPartitionKey
Ein Klassenmitglied als sekundären Indexbereich/Sortierschlüssel bezeichnen
@DynamoDBIndexRangeKey
@DynamoDbSecondarySortKey
Ignorieren Sie dieses Klassenmitglied bei der Zuordnung zu einer Tabelle
@DynamoDBIgnore
@DynamoDbIgnore
Benennen Sie ein Klassenmitglied als automatisch generiertes UUID identifizierendes Attribut
@DynamoDBAutoGeneratedKey
@DynamoDbAutoGeneratedUuid

Die Erweiterung, die dies bereitstellt, wird standardmäßig nicht geladen. Sie müssen die Erweiterung zu Client Builder hinzufügen.

Kennzeichnen Sie ein Klassenmitglied als automatisch generiertes Zeitstempelattribut
@DynamoDBAutoGeneratedTimestamp
@DynamoDbAutoGeneratedTimestampAttribute

Die Erweiterung, die dies bereitstellt, wird standardmäßig nicht geladen. Sie müssen die Erweiterung zu Client Builder hinzufügen.

Kennzeichnen Sie ein Klassenmitglied als automatisch inkrementiertes Versionsattribut
@DynamoDBVersionAttribute
@DynamoDbVersionAttribute

Die Erweiterung, die dies bereitstellt, wird automatisch geladen.

Weisen Sie einem Klassenmitglied zu, für das eine benutzerdefinierte Konvertierung erforderlich ist
@DynamoDBTypeConverted
@DynamoDbConvertedBy
Legen Sie ein Klassenmitglied fest, das mit einem anderen Attributtyp gespeichert werden soll
@DynamoDBTyped(<DynamoDBAttributeType>)
Keine Entsprechung
Bestimmen Sie eine Klasse, die in ein DynamoDB-Dokument (Dokument im JSON -Format) oder Unterdokument serialisiert werden kann
@DynamoDBDocument
Keine direkte äquivalente Anmerkung. Verwenden Sie das erweiterte DokumentAPI.

V2 zusätzliche Anmerkungen

Anwendungsfall v1 v2
Geben Sie ein Klassenmitglied an, das nicht als NULL Attribut gespeichert werden soll, wenn der Java-Wert Null ist N/A
@DynamoDbIgnoreNulls
Bestimmen Sie ein Klassenmitglied als leeres Objekt, wenn alle Attribute Null sind N/A
@DynamoDbPreserveEmptyObject
Legen Sie eine spezielle Aktualisierungsaktion für ein Klassenmitglied fest N/A
@DynamoDbUpdateBehavior
Bestimmen Sie eine unveränderliche Klasse N/A
@DynamoDbImmutable
Kennzeichnen Sie ein Klassenmitglied als automatisch inkrementiertes Zählerattribut N/A
@DynamoDbAtomicCounter

Die Erweiterung, die diese Funktionalität bereitstellt, wird automatisch geladen.

Konfiguration

In Version 1 steuern Sie im Allgemeinen bestimmte Verhaltensweisen, indem Sie eine Instanz von DynamoDBMapperConfig verwenden. Sie können das Konfigurationsobjekt entweder angeben, wenn Sie den Mapper erstellen oder wenn Sie eine Anfrage stellen. In Version 2 ist die Konfiguration spezifisch für das Anforderungsobjekt für den Vorgang.

Anwendungsfall v1 Standard in Version 1 v2
DynamoDBMapperConfig.builder()
Strategie zum erneuten Laden von Batch
.withBatchLoadRetryStrategy(batchLoadRetryStrategy)
Fehlgeschlagene Artikel erneut versuchen
Strategie zur Wiederholung von Batch-Schreibversuchen
.withBatchWriteRetryStrategy(batchWriteRetryStrategy)
Fehlgeschlagene Objekte erneut versuchen
Konsistente Lesevorgänge
.withConsistentReads(CONSISTENT)
EVENTUAL Standardmäßig ist der Wert für konsistente Lesevorgänge für Lesevorgänge falsch. Überschreiben .consistentRead(true) Sie mit im Anforderungsobjekt.
Konvertierungsschema mit Sätzen von Marshallern/Unmarshallern
.withConversionSchema(conversionSchema)

Statische Implementierungen bieten Abwärtskompatibilität mit älteren Versionen.

V2_COMPATIBLE Nicht zutreffend. Dies ist ein veraltetes Feature, das sich darauf bezieht, wie die frühesten Versionen von DynamoDB (v1) Datentypen gespeichert haben. Dieses Verhalten wird im erweiterten Client nicht beibehalten. Ein Beispiel für ein Verhalten in DynamoDB v1 ist das Speichern von Booleschen Werten als Zahl statt als Boolean.
Tabellennamen
.withObjectTableNameResolver() .withTableNameOverride() .withTableNameResolver()

Statische Implementierungen bieten Abwärtskompatibilität mit älteren Versionen

verwende Anmerkungen oder Vermutungen aus der Klasse

Der Tabellenname wird beim Aufrufen der DynamoDbEDnhancedClient#table() Methode definiert.

Strategie beim Laden der Seitennummerierung
.withPaginationLoadingStrategy(strategy)

Die Optionen sind: LAZY _ LOADINGEAGER_LOADING, oder ITERATION_ONLY

LAZY_LOADING

Nur Iteration ist die Standardeinstellung. Die anderen v1-Optionen werden nicht unterstützt.

Erfassung von Metriken anfordern
.withRequestMetricCollector(collector)
null Verwenden Sie metricPublisher() inClientOverrideConfiguration, wenn Sie den standardmäßigen DynamoDB-Client erstellen.
Verhalten speichern
.withSaveBehavior(SaveBehavior.CLOBBER)

Die Optionen sind UPDATECLOBBER,PUT,APPEND_SET, oderUPDATE_SKIP_NULL_ATTRIBUTES.

UPDATE

In Version 2 rufen Sie putItem() oder updateItem() explizit auf.

CLOBBER or PUT: Die entsprechende Aktion in Version 2 ist das AufrufenputItem(). Es gibt keine spezifische CLOBBER Konfiguration.

UPDATE: Entspricht updateItem()

UPDATE_SKIP_NULL_ATTRIBUTES: EntsprichtupdateItem(). Steuern Sie das Aktualisierungsverhalten mit der Anforderungseinstellung ignoreNulls und der Annotation/dem TagDynamoDbUpdateBehavior.

APPEND_SET: Wird nicht unterstützt

Geben Sie Converter Factory ein
.withTypeConverterFactory(typeConverterFactory)
Wandler vom Typ Standard

Auf die Bohne legen, indem Sie

@DynamoDbBean(converterProviders = {ConverterProvider.class, DefaultAttributeConverterProvider.class})

Konfiguration pro Vorgang

In Version 1 sind einige Operationen, wie z. B.query(), über ein Ausdrucksobjekt, das der Operation übergeben wird, in hohem Maße konfigurierbar. Beispielsweise:

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

In Version 2 verwenden Sie kein Konfigurationsobjekt, sondern legen die Parameter für das Anforderungsobjekt mithilfe eines Builders fest. Beispielsweise:

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

Bedingungen

In v2 werden Bedingungs- und Filterausdrücke mithilfe eines Expression Objekts ausgedrückt, das die Bedingung und die Zuordnung von Namen und Filtern kapselt.

Anwendungsfall Operationen v1 v2
Erwartete Attributbedingungen speichern (), löschen (), abfragen (), scannen ()
new DynamoDBSaveExpression() .withExpected(Collections.singletonMap( "otherAttribute", new ExpectedAttributeValue(false))) .withConditionalOperator(ConditionalOperator.AND);
Veraltet; stattdessen verwendenConditionExpression.
Ausdruck der Bedingung löschen ()
deleteExpression.setConditionExpression("zipcode = :zipcode") deleteExpression.setExpressionAttributeValues(...)
Expression conditionExpression = Expression.builder() .expression("#key = :value OR #key1 = :value1") .putExpressionName("#key", "attribute") .putExpressionName("#key1", "attribute3") .putExpressionValue(":value", AttributeValues.stringValue("wrong")) .putExpressionValue(":value1", AttributeValues.stringValue("three")) .build(); DeleteItemEnhancedRequest request = DeleteItemEnhancedRequest.builder() .conditionExpression(conditionExpression).build();
Filterausdruck abfragen (), scannen ()
scanExpression .withFilterExpression("#statename = :state") .withExpressionAttributeValues(attributeValueMapBuilder.build()) .withExpressionAttributeNames(attributeNameMapBuilder.build())
Map<String, AttributeValue> values = singletonMap(":key", stringValue("value")); Expression filterExpression = Expression.builder() .expression("name = :key") .expressionValues(values) .build(); QueryEnhancedRequest request = QueryEnhancedRequest.builder() .filterExpression(filterExpression).build();
Bedingungsausdruck für die Abfrage abfrage ()
queryExpression.withKeyConditionExpression()
QueryConditional keyEqual = QueryConditional.keyEqualTo(b -> b .partitionValue("movie01")); QueryEnhancedRequest tableQuery = QueryEnhancedRequest.builder() .queryConditional(keyEqual) .build();

Typkonvertierung

Standardkonverter

In Version 2 SDK bietet der eine Reihe von Standardkonvertern für alle gängigen Typen. Sie können Typkonverter sowohl auf der Gesamtanbieterebene als auch für ein einzelnes Attribut ändern. Eine Liste der verfügbaren Konverter finden Sie in der AttributeConverterAPIReferenz.

Legen Sie einen benutzerdefinierten Konverter für ein Attribut fest

In Version 1 können Sie eine Getter-Methode mit annotieren, @DynamoDBTypeConverted um die Klasse anzugeben, die zwischen dem Java-Attributtyp und einem DynamoDB-Attributtyp konvertiert. Beispielsweise kann eine, CurrencyFormatConverter die zwischen einem Currency Java-Typ und einem DynamoDB-String konvertiert, angewendet werden, wie im folgenden Codeausschnitt gezeigt.

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

Das v2-Äquivalent des vorherigen Snippets ist unten dargestellt.

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

In Version 1 können Sie die Anmerkung auf das Attribut selbst, einen Typ oder eine benutzerdefinierte Anmerkung anwenden. V2 unterstützt das Anwenden der Anmerkung nur auf den Getter.

Fügen Sie einen Typkonverter, eine Fabrik oder einen Anbieter hinzu

In Version 1 können Sie Ihren eigenen Satz von Typkonvertern bereitstellen oder die Typen, die Ihnen wichtig sind, überschreiben, indem Sie der Konfiguration eine Typkonverter-Factory hinzufügen. Die Typkonverter-Factory wird erweitertDynamoDBTypeConverterFactory, und Überschreibungen werden vorgenommen, indem ein Verweis auf den Standardsatz abgerufen und dieser erweitert wird. Der folgende Ausschnitt zeigt, wie das geht.

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

V2 bietet durch die Anmerkung eine ähnliche Funktionalität. @DynamoDbBean Sie können ein einzelnes AttributeConverterProvider oder eine Kette von bestellten AttributeConverterProvider s angeben. Beachten Sie, dass Sie, wenn Sie Ihre eigene Kette von Anbietern für Attributkonverter angeben, den Standardkonverter-Anbieter überschreiben und ihn in die Kette aufnehmen müssen, um die zugehörigen Attributkonverter verwenden zu können.

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

Der Abschnitt zur Attributkonvertierung in diesem Handbuch enthält ein vollständiges Beispiel für Version 2.

Dokumentenverlauf

Das Dokument API unterstützt die Arbeit mit Dokumenten JSON im -stil als einzelne Elemente in einer DynamoDB-Tabelle. Das v1-Dokument API hat ein entsprechendes API in Version 2, aber anstatt API wie in Version 1 einen separaten Client für das Dokument zu verwenden, enthält v2 API Dokumentfunktionen in den erweiterten DynamoDB-Client.

In Version 1 stellt die ItemKlasse einen unstrukturierten Datensatz aus einer DynamoDB-Tabelle dar. In v2 wird ein unstrukturierter Datensatz durch eine Instanz der Klasse dargestellt. EnhancedDocument Beachten Sie, dass Primärschlüssel im Tabellenschema für v2 und im Element selbst in Version 1 definiert sind.

In der folgenden Tabelle werden die Unterschiede zwischen dem Dokument APIs in Version 1 und Version 2 verglichen.

Anwendungsfall v1 v2
Erstellen Sie einen Dokumentenclient
AmazonDynamoDB client = ... //Create a client. DynamoDB documentClient = new DynamoDB(client);
// The v2 Document API uses the same DynamoDbEnhancedClient // that is used for mapping POJOs. DynamoDbClient standardClient = ... //Create a standard client. DynamoDbEnhancedClient enhancedClient = ... // Create an enhanced client.
Verweisen Sie auf eine Tabelle
Table documentTable = docClient.documentClient("Person");
DynamoDbTable<EnhancedDocument> documentTable = enhancedClient.table("Person", TableSchema.documentSchemaBuilder() .addIndexPartitionKey(TableMetadata.primaryIndexName(),"id", AttributeValueType.S) .attributeConverterProviders(AttributeConverterProvider.defaultProvider()) .build());
Work with semi-structured data
Element einfügen
Item item = new Item() .withPrimaryKey("id", 50) .withString("firstName", "Shirley"); PutItemOutcome outcome = documentTable.putItem(item);
EnhancedDocument personDocument = EnhancedDocument.builder() .putNumber("id", 50) .putString("firstName", "Shirley") .build(); documentTable.putItem(personDocument);
Element abrufen
GetItemOutcome outcome = documentTable.getItemOutcome( "id", 50); Item personDocFromDb = outcome.getItem(); String firstName = personDocFromDb.getString("firstName");
EnhancedDocument personDocFromDb = documentTable .getItem(Key.builder() .partitionValue(50) .build()); String firstName = personDocFromDb.getString("firstName");
Work with JSON items
Konvertiert eine JSON Struktur, um sie mit dem Dokument zu verwenden API
// The 'jsonPerson' identifier is a JSON string. Item item = new Item().fromJSON(jsonPerson);
// The 'jsonPerson' identifier is a JSON string. EnhancedDocument document = EnhancedDocument.builder() .json(jsonPerson).build());
Setzen JSON
documentTable.putItem(item)
documentTable.putItem(document);
Lesen JSON
GetItemOutcome outcome = //Get item. String jsonPerson = outcome.getItem().toJSON();
String jsonPerson = documentTable.getItem(Key.builder() .partitionValue(50).build()) .fromJson();

APIReferenz und Anleitungen für das Dokument APIs

v1 v2
API-Referenz Javadoc Javadoc
Leitfaden zur Dokumentation Entwicklerhandbuch für Amazon DynamoDB Erweitertes Dokument API (dieser Leitfaden)

FAQ

F: Funktioniert optimistisches Sperren mit einer Versionsnummer in Version 2 genauso wie in Version 1?

Antwort: Das Verhalten ist ähnlich, aber v2 fügt nicht automatisch Bedingungen für die Löschvorgänge hinzu. Sie müssen Bedingungsausdrücke manuell hinzufügen, wenn Sie das Löschverhalten steuern möchten.