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.
Arbeiten mit Elementen: Java
Sie können das AWS SDK for Java Dokument verwenden, API um typische Erstellungs-, Lese-, Aktualisierungs- und Löschvorgänge (CRUD) für Amazon DynamoDB DynamoDB-Elemente in einer Tabelle durchzuführen.
Anmerkung
The SDK for Java bietet auch ein Objektpersistenzmodell, mit dem Sie Ihre clientseitigen Klassen DynamoDB-Tabellen zuordnen können. Mit diesem Ansatz können Sie die Codemenge, die Sie schreiben müssen, verringern. Weitere Informationen finden Sie unter Java 1.x: D ynamoDBMapper.
Dieser Abschnitt enthält Java-Beispiele für die Ausführung verschiedener Aktionen für Java-Dokumentelemente sowie mehrere API vollständige Arbeitsbeispiele.
Themen
- Einfügen eines Elements
- Abrufen eines Elements
- Batch Write: Einfügen und Löschen mehrerer Elemente
- Batch Get: Abrufen mehrerer Elemente
- Aktualisieren eines Elements
- Löschen eines Elements
- Beispiel: CRUD Operationen, die das AWS SDK for Java Dokument verwenden API
- Beispiel: Batch-Operationen mit AWS SDK for Java Dokument API
- Beispiel: Umgang mit binären Typattributen mithilfe des AWS SDK for Java Dokuments API
Einfügen eines Elements
Die putItem
-Methode speichert ein Element in einer Tabelle. Wenn das Element bereits vorhanden ist, wird das ganze Element ersetzt. Anstatt das gesamte Element zu ersetzen und nur spezifische Attribute zu aktualisieren, können Sie die Methode updateItem
verwenden. Weitere Informationen finden Sie unter Aktualisieren eines Elements.
Angeben eines optionalen Parameters
Neben den erforderlichen Parametern können Sie auch optionale Parameter für die putItem
-Methode angeben. Zum Beispiel verwendet das folgende Java-Codebeispiel einen optionalen Parameter, um eine Bedingung für das Hochladen des Elements anzugeben. Wenn die von Ihnen angegebene Bedingung nicht erfüllt ist, wird AWS SDK for Java ein ConditionalCheckFailedException
ausgelöst. Das Codebeispiel gibt die folgenden optionalen Parameter in der putItem
-Methode an:
-
Ein
ConditionExpression
, der die Bedingungen für die Anforderung definiert. Der Code definiert die Bedingung, dass das vorhandene Element mit demselben Primärschlüssel nur ersetzt wird, wenn es ein ISBN Attribut hat, das einem bestimmten Wert entspricht. -
Eine Zuordnung für
ExpressionAttributeValues
, die in der Bedingung verwendet wird. In diesem Fall ist nur eine Ersetzung erforderlich: Der Platzhalter:val
im Bedingungsausdruck wird zur Laufzeit durch den tatsächlich zu prüfenden ISBN Wert ersetzt.
Im folgenden Beispiel wird ein neues Buchelement mit diesen optionalen Parameter hinzugefügt.
Beispiel
Item item = new Item() .withPrimaryKey("Id", 104) .withString("Title", "Book 104 Title") .withString("ISBN", "444-4444444444") .withNumber("Price", 20) .withStringSet("Authors", new HashSet<String>(Arrays.asList("Author1", "Author2"))); Map<String, Object> expressionAttributeValues = new HashMap<String, Object>(); expressionAttributeValues.put(":val", "444-4444444444"); PutItemOutcome outcome = table.putItem( item, "ISBN = :val", // ConditionExpression parameter null, // ExpressionAttributeNames parameter - we're not using it for this example expressionAttributeValues);
PutItem und Dokumente JSON
Sie können ein JSON Dokument als Attribut in einer DynamoDB-Tabelle speichern. Verwenden Sie dazu die withJSON
-Methode Item
. Diese Methode analysiert das JSON Dokument und ordnet jedes Element einem systemeigenen DynamoDB-Datentyp zu.
Angenommen, Sie möchten das folgende JSON Dokument speichern, das Lieferanten enthält, die Bestellungen für ein bestimmtes Produkt ausführen können.
Beispiel
{ "V01": { "Name": "Acme Books", "Offices": [ "Seattle" ] }, "V02": { "Name": "New Publishers, Inc.", "Offices": ["London", "New York" ] }, "V03": { "Name": "Better Buy Books", "Offices": [ "Tokyo", "Los Angeles", "Sydney" ] } }
Sie können die withJSON
-Methode verwenden, um es in der ProductCatalog
-Tabelle in einem Map
´-Attribut mit dem Namen VendorInfo
zu speichern. Das folgende Java-Codebeispiel veranschaulicht dies.
// Convert the document into a String. Must escape all double-quotes. String vendorDocument = "{" + " \"V01\": {" + " \"Name\": \"Acme Books\"," + " \"Offices\": [ \"Seattle\" ]" + " }," + " \"V02\": {" + " \"Name\": \"New Publishers, Inc.\"," + " \"Offices\": [ \"London\", \"New York\"" + "]" + "}," + " \"V03\": {" + " \"Name\": \"Better Buy Books\"," + "\"Offices\": [ \"Tokyo\", \"Los Angeles\", \"Sydney\"" + " ]" + " }" + " }"; Item item = new Item() .withPrimaryKey("Id", 210) .withString("Title", "Book 210 Title") .withString("ISBN", "210-2102102102") .withNumber("Price", 30) .withJSON("VendorInfo", vendorDocument); PutItemOutcome outcome = table.putItem(item);
Abrufen eines Elements
Um ein einzelnes Element abzurufen, verwenden Sie die getItem
-Methode eines Table
-Objekts. Dazu gehen Sie wie folgt vor:
-
Erstellen Sie eine Instance der
DynamoDB
-Klasse. -
Erstellen Sie eine Instance der
Table
-Klasse, um die Tabelle zu repräsentieren, mit der Sie arbeiten möchten. -
Rufen Sie die
getItem
-Methode für dieTable
-Instance auf. Sie müssen den Primärschlüssel des Elements angeben, das Sie abrufen möchten.
Im folgenden Java-Codebeispiel werden die vorherigen Schritte veranschaulicht. Im Codebeispiel wird das Element abgerufen, das den angegebenen Partitionsschlüssel aufweist.
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("ProductCatalog"); Item item = table.getItem("Id", 210);
Angeben eines optionalen Parameters
Neben den erforderlichen Parametern können Sie auch optionale Parameter für die getItem
-Methode angeben. Zum Beispiel verwendet das folgende Java-Codebeispiel eine optionale Methode zum Abrufen nur einer bestimmten Liste von Attributen und zum Angeben von Strongly Consistent-Lesevorgängen. (Weitere Informationen zur Lesekonsistenz finden Sie unter DynamoDB-Lesekonsistenz.)
Sie können einen ProjectionExpression
verwenden, um nur spezifische Attribute oder Elemente anstelle eines ganzen Elements abzurufen. Ein ProjectionExpression
kann Attribute auf oberster Ebene oder verschachtelte Attribute mithilfe von Dokumentpfaden angeben. Weitere Informationen finden Sie unter Verwenden von Projektionsausdrücken in DynamoDB.
Mit den Parametern der getItem
-Methode kann keine Read Consistency angegeben werden. Sie können jedoch eine GetItemSpec
erstellen, die vollständigen Zugriff auf die Eingaben für die GetItem
-Low-Level-Operation bietet. Durch das Codebeispiel unten wird eine GetItemSpec
erstellt. Es verwendet diese Spezifikation als Eingabe für die getItem
-Methode.
Beispiel
GetItemSpec spec = new GetItemSpec() .withPrimaryKey("Id", 206) .withProjectionExpression("Id, Title, RelatedItems[0], Reviews.FiveStar") .withConsistentRead(true); Item item = table.getItem(spec); System.out.println(item.toJSONPretty());
Um ein Item
in einem vom Menschen lesbaren Format zu drucken, verwenden Sie die Methode toJSONPretty
. Die Ausgabe aus dem vorherigen Beispiel sieht wie folgt aus.
{ "RelatedItems" : [ 341 ], "Reviews" : { "FiveStar" : [ "Excellent! Can't recommend it highly enough! Buy it!", "Do yourself a favor and buy this" ] }, "Id" : 123, "Title" : "20-Bicycle 123" }
GetItem und JSON Dokumente
In dem PutItem und Dokumente JSON Abschnitt speichern Sie ein JSON Dokument in einem Map
Attribut mit dem NamenVendorInfo
. Sie können die getItem
Methode verwenden, um das gesamte Dokument im JSON Format abzurufen. Sie können auch die Dokumentpfadnotation verwenden, um nur einige der Elemente des Dokuments abzurufen. Das folgende Java-Codebeispiel veranschaulicht diese Vorgehensweisen.
GetItemSpec spec = new GetItemSpec() .withPrimaryKey("Id", 210); System.out.println("All vendor info:"); spec.withProjectionExpression("VendorInfo"); System.out.println(table.getItem(spec).toJSON()); System.out.println("A single vendor:"); spec.withProjectionExpression("VendorInfo.V03"); System.out.println(table.getItem(spec).toJSON()); System.out.println("First office location for this vendor:"); spec.withProjectionExpression("VendorInfo.V03.Offices[0]"); System.out.println(table.getItem(spec).toJSON());
Die Ausgabe aus dem vorherigen Beispiel sieht wie folgt aus.
All vendor info: {"VendorInfo":{"V03":{"Name":"Better Buy Books","Offices":["Tokyo","Los Angeles","Sydney"]},"V02":{"Name":"New Publishers, Inc.","Offices":["London","New York"]},"V01":{"Name":"Acme Books","Offices":["Seattle"]}}} A single vendor: {"VendorInfo":{"V03":{"Name":"Better Buy Books","Offices":["Tokyo","Los Angeles","Sydney"]}}} First office location for a single vendor: {"VendorInfo":{"V03":{"Offices":["Tokyo"]}}}
Anmerkung
Sie können die toJSON
Methode verwenden, um ein beliebiges Element (oder seine Attribute) in eine Zeichenfolge im JSON -Format zu konvertieren. Der folgende Code ruft mehrere Attribute der obersten Ebene und verschachtelte Attribute ab und druckt die Ergebnisse als. JSON
GetItemSpec spec = new GetItemSpec() .withPrimaryKey("Id", 210) .withProjectionExpression("VendorInfo.V01, Title, Price"); Item item = table.getItem(spec); System.out.println(item.toJSON());
Die Ausgabe sieht wie folgt aus.
{"VendorInfo":{"V01":{"Name":"Acme Books","Offices":["Seattle"]}},"Price":30,"Title":"Book 210 Title"}
Batch Write: Einfügen und Löschen mehrerer Elemente
Batch Write bezieht sich auf das Einfügen und Löschen mehrerer Elemente in einem Batch. Die batchWriteItem
-Methode ermöglicht Ihnen das Einfügen und Löschen von mehreren Elementen aus einer oder mehreren Tabellen anhand eines einzigen Aufrufs. Im Folgenden finden Sie die Schritte zum Einfügen oder Löschen mehrerer Elemente mithilfe des Dokuments. AWS SDK for Java API
-
Erstellen Sie eine Instance der
DynamoDB
-Klasse. -
Erstellen Sie eine Instance der
TableWriteItems
-Klasse, die alle Einfügen- und Löschen-Operationen für eine Tabelle beschreibt. Wenn Sie mit einer einzigen BatchWrite-Operation in mehrere Tabellen schreiben möchten, müssen Sie eineTableWriteItems
-Instance pro Tabelle erstellen. -
Rufen Sie die
batchWriteItem
-Methode auf, indem Sie das bzw. dieTableWriteItems
-Objekt(e) bereitstellen, das/die Sie im vorangegangenen Schritt erstellt haben. -
Verarbeiten Sie die Antwort. Überprüfen Sie, ob in der Antwort nicht verarbeitete Anforderungselemente zurückgegeben wurden. Dies kann der Fall sein, wenn Sie das Kontingent für den bereitgestellten Durchsatz erreichen oder ein anderer vorübergehender Fehler auftritt. Außerdem begrenzt DynamoDB die Anforderungsgröße und die Anzahl der Vorgänge, die Sie in einer Anforderung angeben können. Wenn Sie diese Limits überschreiten, wird die Anforderung von DynamoDB abgelehnt. Weitere Informationen finden Sie unter Service-, Konto- und Tabellenkontingente in Amazon DynamoDB.
Im folgenden Java-Codebeispiel werden die vorherigen Schritte veranschaulicht. Das folgende Beispiel führt eine batchWriteItem
-Operation für zwei Tabellen durch: Forum
und Thread
. Die entsprechenden TableWriteItems
-Objekte definieren die folgenden Aktionen:
-
Einfügen eines Elements in die
Forum
-Tabelle -
Einfügen und Löschen eines Elements in der
Thread
-Tabelle
Der Code ruft dann batchWriteItem
auf, um die Operation durchzuführen.
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); TableWriteItems forumTableWriteItems = new TableWriteItems("Forum") .withItemsToPut( new Item() .withPrimaryKey("Name", "Amazon RDS") .withNumber("Threads", 0)); TableWriteItems threadTableWriteItems = new TableWriteItems("Thread") .withItemsToPut( new Item() .withPrimaryKey("ForumName","Amazon RDS","Subject","Amazon RDS Thread 1") .withHashAndRangeKeysToDelete("ForumName","Some partition key value", "Amazon S3", "Some sort key value"); BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem(forumTableWriteItems, threadTableWriteItems); // Code for checking unprocessed items is omitted in this example
Ein funktionierendes Beispiel finden Sie unter Beispiel: Batch-Schreibvorgang unter Verwendung des AWS SDK for Java Dokuments API.
Batch Get: Abrufen mehrerer Elemente
Die batchGetItem
-Methode ermöglicht Ihnen das Abrufen mehrerer Elemente aus einer oder mehreren Tabellen. Um ein einzelnes Element abzurufen, können Sie die getItem
-Methode verwenden.
Dazu gehen Sie wie folgt vor:
-
Erstellen Sie eine Instance der
DynamoDB
-Klasse. -
Erstellen Sie eine Instance der
TableKeysAndAttributes
-Klasse, die eine Liste der Primärschlüsselwerte beschreibt, die von einer Tabelle abgerufen werden sollen. Wenn Sie mit einer einzigen BatchGet-Operation aus mehreren Tabellen lesen möchten, müssen Sie eineTableKeysAndAttributes
-Instance pro Tabelle erstellen. -
Rufen Sie die
batchGetItem
-Methode auf, indem Sie das bzw. dieTableKeysAndAttributes
-Objekt(e) bereitstellen, das/die Sie im vorangegangenen Schritt erstellt haben.
Im folgenden Java-Codebeispiel werden die vorherigen Schritte veranschaulicht. In dem Beispiel werden zwei Elemente aus der Forum
-Tabelle und drei Elemente aus der Thread
-Tabelle abgerufen.
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); TableKeysAndAttributes forumTableKeysAndAttributes = new TableKeysAndAttributes(forumTableName); forumTableKeysAndAttributes.addHashOnlyPrimaryKeys("Name", "Amazon S3", "Amazon DynamoDB"); TableKeysAndAttributes threadTableKeysAndAttributes = new TableKeysAndAttributes(threadTableName); threadTableKeysAndAttributes.addHashAndRangePrimaryKeys("ForumName", "Subject", "Amazon DynamoDB","DynamoDB Thread 1", "Amazon DynamoDB","DynamoDB Thread 2", "Amazon S3","S3 Thread 1"); BatchGetItemOutcome outcome = dynamoDB.batchGetItem( forumTableKeysAndAttributes, threadTableKeysAndAttributes); for (String tableName : outcome.getTableItems().keySet()) { System.out.println("Items in table " + tableName); List<Item> items = outcome.getTableItems().get(tableName); for (Item item : items) { System.out.println(item); } }
Angeben eines optionalen Parameters
Neben den erforderlichen Parametern können Sie bei Verwendung von batchGetItem
auch optionale Parameter angeben. Beispielsweise können Sie einen ProjectionExpression
mit jedem TableKeysAndAttributes
, das Sie definieren, bereitstellen. So können Sie die Attribute angeben, die aus der Tabelle abgerufen werden sollen.
Im folgenden C#-Codebeispiel werden zwei Elemente aus der Forum
-Tabelle abgerufen. Der Parameter withProjectionExpression
gibt an, dass nur das Attribut Threads
abgerufen werden soll.
Beispiel
TableKeysAndAttributes forumTableKeysAndAttributes = new TableKeysAndAttributes("Forum") .withProjectionExpression("Threads"); forumTableKeysAndAttributes.addHashOnlyPrimaryKeys("Name", "Amazon S3", "Amazon DynamoDB"); BatchGetItemOutcome outcome = dynamoDB.batchGetItem(forumTableKeysAndAttributes);
Aktualisieren eines Elements
Die updateItem
-Methode eines Table
-Objekts kann vorhandene Attributwerte aktualisieren, neue Attribute hinzuzufügen oder Attribute aus einem vorhandenen Element löschen.
Die updateItem
-Methode verhält sich wie folgt:
-
Wenn kein Element vorhanden ist (kein Element in der Tabelle mit dem angegebenen Primärschlüssel), fügt
updateItem
der Tabelle ein neues Element hinzu. -
Wenn ein Element vorhanden ist, führt
updateItem
die Aktualisierung wie vomUpdateExpression
-Parameter angegeben aus.
Anmerkung
Es ist auch möglich, ein Element mit putItem
zu "aktualisieren". Wenn Sie z. B. putItem
aufrufen, um der Tabelle ein Element hinzuzufügen, aber bereits ein Element mit dem angegebenen Primärschlüssel vorhanden ist, wird das gesamte Element von putItem
ersetzt. Wenn Attribute in dem vorhandenen Element nicht in der Eingabe angegeben sind, werden diese Attribute von putItem
aus dem Element entfernt.
Im Allgemeinen empfehlen wir, updateItem
immer dann zu verwenden, wenn Sie Elementattribute ändern möchten. Die updateItem
-Methode ändert nur die Elementattribute, die Sie in der Eingabe angeben. Die anderen Attribute im Element bleiben unverändert.
Dazu gehen Sie wie folgt vor:
-
Erstellen Sie eine Instance der
Table
-Klasse, um die Tabelle zu repräsentieren, mit der Sie arbeiten möchten. -
Rufen Sie die
updateTable
-Methode für dieTable
-Instance auf. Sie müssen den Primärschlüssel des abzurufenden Elements und einenUpdateExpression
angeben, der die zu ändernden Attribute beschreibt und mitteilt, wie diese geändert werden sollen.
Im folgenden Java-Codebeispiel werden die vorherigen Aufgaben veranschaulicht. Das Beispiel aktualisiert ein Buchelement in der ProductCatalog
-Tabelle. Es wird ein neuer Autor zum Satz der Authors
hinzugefügt und das vorhandene ISBN
-Attribut wird gelöscht. Darüber hinaus wird auch der Preis um eins gesenkt.
Im ExpressionAttributeValues
wird eine UpdateExpression
-Zuordnung verwendet. Die Platzhalter :val1
und :val2
werden zur Laufzeit durch die tatsächlichen Werte für Authors
und Price
ersetzt.
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("ProductCatalog"); Map<String, String> expressionAttributeNames = new HashMap<String, String>(); expressionAttributeNames.put("#A", "Authors"); expressionAttributeNames.put("#P", "Price"); expressionAttributeNames.put("#I", "ISBN"); Map<String, Object> expressionAttributeValues = new HashMap<String, Object>(); expressionAttributeValues.put(":val1", new HashSet<String>(Arrays.asList("Author YY","Author ZZ"))); expressionAttributeValues.put(":val2", 1); //Price UpdateItemOutcome outcome = table.updateItem( "Id", // key attribute name 101, // key attribute value "add #A :val1 set #P = #P - :val2 remove #I", // UpdateExpression expressionAttributeNames, expressionAttributeValues);
Angeben eines optionalen Parameters
Neben den erforderlichen Parametern können Sie auch optionale Parameter für die updateItem
-Methode angeben, z. B. eine Bedingung, die erfüllt werden muss, damit die Aktualisierung erfolgt. Wenn die von Ihnen angegebene Bedingung nicht erfüllt ist, wird AWS SDK for Java eine ConditionalCheckFailedException
ausgelöst. Beim folgenden Java-Codebeispiel wird der Preis eines Buchelements bedingungsabhängig auf 25 erhöht. Das Beispiel zeigt einen ConditionExpression
, der besagt, dass der Preis nur aktualisiert werden soll, wenn der vorhandene Preis 20 lautet.
Beispiel
Table table = dynamoDB.getTable("ProductCatalog"); Map<String, String> expressionAttributeNames = new HashMap<String, String>(); expressionAttributeNames.put("#P", "Price"); Map<String, Object> expressionAttributeValues = new HashMap<String, Object>(); expressionAttributeValues.put(":val1", 25); // update Price to 25... expressionAttributeValues.put(":val2", 20); //...but only if existing Price is 20 UpdateItemOutcome outcome = table.updateItem( new PrimaryKey("Id",101), "set #P = :val1", // UpdateExpression "#P = :val2", // ConditionExpression expressionAttributeNames, expressionAttributeValues);
Unteilbarer Zähler
Sie können updateItem
verwenden, um einen unteilbaren Zähler zu implementieren, mit dem der Wert eines bestehenden Attributs erhöht oder verringert wird, ohne andere Schreibanforderungen zu beeinflussen. Zum Erhöhen eines unteilbaren Zählers verwenden Sie einen UpdateExpression
mit einer set
-Aktion, um einem vorhandenen Attribut vom Typ Number
einen numerischen Wert hinzuzufügen.
Das folgende Codebeispiel zeigt diesen Vorgang und erhöht das Attribut Quantity
um eins. Es zeigt auch die Verwendung des Parameters ExpressionAttributeNames
in einem UpdateExpression
.
Table table = dynamoDB.getTable("ProductCatalog"); Map<String,String> expressionAttributeNames = new HashMap<String,String>(); expressionAttributeNames.put("#p", "PageCount"); Map<String,Object> expressionAttributeValues = new HashMap<String,Object>(); expressionAttributeValues.put(":val", 1); UpdateItemOutcome outcome = table.updateItem( "Id", 121, "set #p = #p + :val", expressionAttributeNames, expressionAttributeValues);
Löschen eines Elements
Die deleteItem
-Methode löscht ein Element aus einer Tabelle. Sie müssen den Primärschlüssel des Elements bereitstellen, das Sie löschen möchten.
Dazu gehen Sie wie folgt vor:
-
Erstellen Sie eine Instance des
DynamoDB
-Clients. -
Rufen Sie die
deleteItem
-Methode durch Angabe des Schlüssels des Elements auf, das Sie löschen möchten.
Das folgende Java-Codebeispiel veranschaulicht diese Vorgehensweisen.
Beispiel
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("ProductCatalog"); DeleteItemOutcome outcome = table.deleteItem("Id", 101);
Angeben eines optionalen Parameters
Sie können für deleteItem
optionale Parameter angeben. Das folgende Java-Codebeispiel enthält einen ConditionExpression
, der besagt, dass ein Buchelement im InPublication
nur dann gelöscht werden darf, wenn das Buch nicht mehr veröffentlicht wird (das Attribut ProductCatalog
ist False).
Beispiel
Map<String,Object> expressionAttributeValues = new HashMap<String,Object>(); expressionAttributeValues.put(":val", false); DeleteItemOutcome outcome = table.deleteItem("Id",103, "InPublication = :val", null, // ExpressionAttributeNames - not used in this example expressionAttributeValues);