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.
D-Klasse ynamoDBMapper
Die Klasse ADynamoDBMapper
ist der Eintrittspunkt für Amazon DynamoDB. Sie stellt Zugriff auf einen DynamoDB-Endpunkt bereit und ermöglicht Ihnen, auf Ihre Daten in verschiedenen Tabellen zuzugreifen. Außerdem können Sie damit verschiedene Erstellungs-, Lese-, Aktualisierungs- und Löschvorgänge (CRUD) für Elemente ausführen sowie Abfragen und Scans für Tabellen ausführen. Diese Klasse bietet die folgenden Methoden für die Arbeit mit DynamoDB.
Die entsprechende Javadoc-Dokumentation finden Sie unter D ynamoDBMapper in der AWS SDK for Java API Referenz.
Themen
save
Speichert das angegebene Objekt in der Tabelle. Das Objekt, das Sie speichern möchten, ist der einzige erforderliche Parameter für diese Methode. Sie können optionale Konfigurationsparameter mithilfe des DynamoDBMapperConfig
-Objekts bereitstellen.
Wenn ein Element mit demselben Primärschlüssel nicht vorhanden ist, erstellt diese Methode ein neues Element in der Tabelle. Wenn ein Element mit demselben Primärschlüssel vorhanden ist, aktualisiert sie das vorhandene Element. Wenn der Partitionsschlüssel und der Sortierschlüssel vom Typ String sind und mit einer Anmerkung versehen sind, erhalten sie einen zufälligen@DynamoDBAutoGeneratedKey
, universell eindeutigen Bezeichner (UUID), wenn sie nicht initialisiert werden. Versionsfelder, die mit @DynamoDBVersionAttribute
angemerkt sind, werden um eins erhöht. Wenn ein Versionsfeld aktualisiert oder ein Schlüssel generiert wird, wird das übergebene Objekt als Folge der Operation aktualisiert.
Standardmäßig werden nur Attribute aktualisiert, die Eigenschaften der zugewiesenen Klasse entsprechen. Zusätzlich für ein Element vorhandene Attribute sind nicht betroffen. Wenn Sie jedoch SaveBehavior.CLOBBER
angeben, können Sie die vollständige Überschreibung des Elements erzwingen.
DynamoDBMapperConfig config = DynamoDBMapperConfig.builder() .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.CLOBBER).build(); mapper.save(item, config);
Wenn Versioning aktiviert ist, müssen die client- und serverseitigen Elementversionen übereinstimmen. Jedoch muss die Version nicht übereinstimmen, wenn die Option SaveBehavior.CLOBBER
verwendet wird. Weitere Informationen über das Versioning finden Sie unter DynamoDB und optimistisches Sperren mit Versionsnummer.
load
Ruft ein Element aus einer Tabelle ab. Sie müssen den Primärschlüssel des Elements bereitstellen, das Sie abrufen möchten. Sie können optionale Konfigurationsparameter mithilfe des DynamoDBMapperConfig
-Objekts bereitstellen. Beispielsweise können Sie optional Strongly Consistent-Lesevorgänge anfordern, um sicherzustellen, dass diese Methode ausschließlich die neuesten Elementwerte, wie in der folgenden Java-Anweisung dargestellt, bereitstellt.
DynamoDBMapperConfig config = DynamoDBMapperConfig.builder() .withConsistentReads(DynamoDBMapperConfig.ConsistentReads.CONSISTENT).build(); CatalogItem item = mapper.load(CatalogItem.class, item.getId(), config);
Standardmäßig gibt DynamoDB das Element zurück, das über Eventually-Consistent-Werte verfügt. Weitere Informationen über das Eventual-Consistency-Modell von DynamoDB finden Sie unter DynamoDB-Lesekonsistenz.
delete
Löscht ein Element aus der Tabelle. Sie müssen eine Objekt-Instance aus der zugeordneten Klasse übergeben.
Wenn Versioning aktiviert ist, müssen die client- und serverseitigen Elementversionen übereinstimmen. Jedoch muss die Version nicht übereinstimmen, wenn die Option SaveBehavior.CLOBBER
verwendet wird. Weitere Informationen zum Versioning finden Sie unter DynamoDB und optimistisches Sperren mit Versionsnummer.
query
Fragt eine Tabelle oder einen sekundären Index ab.
Angenommen, Sie verfügen über die Tabelle Reply
, die Antworten für Forum-Threads speichert. Jedes Thread-Thema kann null oder mehr Antworten enthalten. Der Primärschlüssel der Tabelle Reply
besteht aus den Feldern Id
und ReplyDateTime
, wobei Id
der Partitionsschlüssel und ReplyDateTime
der Sortierschlüssel des Primärschlüssels ist.
Reply ( Id, ReplyDateTime, ... )
Angenommen, Sie haben eine Mapping zwischen der Klasse Reply
und der entsprechenden Tabelle Reply
in DynamoDB erstellt. Der folgende Java-Code verwendet DynamoDBMapper
, um alle Antworten der letzten zwei Wochen zu einem bestimmten Thread-Thema zu finden.
Beispiel
String forumName = "&DDB;"; String forumSubject = "&DDB; Thread 1"; String partitionKey = forumName + "#" + forumSubject; long twoWeeksAgoMilli = (new Date()).getTime() - (14L*24L*60L*60L*1000L); Date twoWeeksAgo = new Date(); twoWeeksAgo.setTime(twoWeeksAgoMilli); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); String twoWeeksAgoStr = df.format(twoWeeksAgo); Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>(); eav.put(":v1", new AttributeValue().withS(partitionKey)); eav.put(":v2",new AttributeValue().withS(twoWeeksAgoStr.toString())); DynamoDBQueryExpression<Reply> queryExpression = new DynamoDBQueryExpression<Reply>() .withKeyConditionExpression("Id = :v1 and ReplyDateTime > :v2") .withExpressionAttributeValues(eav); List<Reply> latestReplies = mapper.query(Reply.class, queryExpression);
Die Abfrage gibt eine Sammlung von Reply
-Objekten zurück.
Die query
-Methode gibt standardmäßig eine "lazy-loaded"-Sammlung zurück. Sie gibt anfänglich ausschließlich eine Ergebnisseite zurück und führt dann bei Bedarf einen Dienstaufruf für die nächste Seite durch. Um alle übereinstimmenden Elemente zu erhalten, müssen Sie die Sammlung latestReplies
durchlaufen.
Beachten Sie, dass beim Aufrufen der size()
-Methode für die Sammlung jedes Ergebnis geladen wird, um eine genaue Zählung zu liefern. Dies kann dazu führen, dass ein großer Teil des bereitgestellten Durchsatzes verbraucht wird, und bei einer sehr großen Tabelle könnte sogar der gesamte Speicher in Ihrer Tabelle erschöpft sein. JVM
Für eine Indexabfrage müssen Sie zuerst den Index als eine Mapper-Klasse modellieren. Angenommen, die Reply
Tabelle hat einen globalen sekundären Index namens PostedBy-Message-Index. Der Partitionsschlüssel für diesen Index ist PostedBy
und der Sortierschlüssel ist Message
. Die Klassendefinition für ein Element im Index würde wie folgt aussehen.
@DynamoDBTable(tableName="Reply") public class PostedByMessage { private String postedBy; private String message; @DynamoDBIndexHashKey(globalSecondaryIndexName = "PostedBy-Message-Index", attributeName = "PostedBy") public String getPostedBy() { return postedBy; } public void setPostedBy(String postedBy) { this.postedBy = postedBy; } @DynamoDBIndexRangeKey(globalSecondaryIndexName = "PostedBy-Message-Index", attributeName = "Message") public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } // Additional properties go here. }
Die Anmerkung @DynamoDBTable
gibt an, dass dieser Index mit der Tabelle Reply
verknüpft ist. Die @DynamoDBIndexHashKey
Anmerkung bezeichnet den Partitionsschlüssel (PostedBy) des Indexes und @DynamoDBIndexRangeKey
den Sortierschlüssel (Message) des Indexes.
Sie können jetzt DynamoDBMapper
nutzen, um den Index abzufragen, der eine Teilmenge der Nachrichten, die von einem bestimmten Benutzer gepostet wurden, abruft. Sie müssen den Indexnamen nicht angeben, wenn Sie keine widersprüchlichen Zuordnungen zwischen Tabellen und Indizes haben und die Zuordnungen bereits im Mapper vorgenommen wurden. Der Mapper leitet anhand des Primärschlüssels und des Sortierschlüssels ab. Der folgende Code fragt den globalen sekundären Index ab. Da globale sekundäre Indizes Eventually Consistent-Lesevorgänge, jedoch keine Strongly Consistent-Lesevorgänge unterstützen, müssen Sie withConsistentRead(false)
angeben.
HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>(); eav.put(":v1", new AttributeValue().withS("User A")); eav.put(":v2", new AttributeValue().withS("DynamoDB")); DynamoDBQueryExpression<PostedByMessage> queryExpression = new DynamoDBQueryExpression<PostedByMessage>() .withIndexName("PostedBy-Message-Index") .withConsistentRead(false) .withKeyConditionExpression("PostedBy = :v1 and begins_with(Message, :v2)") .withExpressionAttributeValues(eav); List<PostedByMessage> iList = mapper.query(PostedByMessage.class, queryExpression);
Die Abfrage gibt eine Sammlung von PostedByMessage
-Objekten zurück.
queryPage
Fragt eine Tabelle oder einen sekundären Index ab und gibt eine einzelne Seite der übereinstimmenden Ergebnisse zurück. Ebenso wie bei der query
-Methode, müssen Sie einen Partitions-Schlüsselwert und einen Abfragefilter angeben, der auf das Sortierschlüsselattribut angewendet wird. queryPage
gibt jedoch ausschließlich die erste „Seite“ der Daten zurück, d. h. Menge von Daten, die in 1 MB passt.
scan
Scannt eine gesamte Tabelle oder einen sekundären Index. Sie können optional einen FilterExpression
angeben, um den Ergebnissatz zu filtern.
Angenommen, Sie verfügen über die Tabelle Reply
, die Antworten für Forum-Threads speichert. Jedes Thread-Thema kann null oder mehr Antworten enthalten. Der Primärschlüssel der Tabelle Reply
besteht aus den Feldern Id
und ReplyDateTime
, wobei Id
der Partitionsschlüssel und ReplyDateTime
der Sortierschlüssel des Primärschlüssels ist.
Reply ( Id, ReplyDateTime, ... )
Wenn Sie der Tabelle Reply
eine Java-Klasse zugewiesen haben, können Sie DynamoDBMapper
verwenden, um die Tabelle zu scannen. Der folgende Java-Code scannt beispielsweise die gesamte Tabelle Reply
und gibt nur die Antworten für ein bestimmtes Jahr zurück.
Beispiel
HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>(); eav.put(":v1", new AttributeValue().withS("2015")); DynamoDBScanExpression scanExpression = new DynamoDBScanExpression() .withFilterExpression("begins_with(ReplyDateTime,:v1)") .withExpressionAttributeValues(eav); List<Reply> replies = mapper.scan(Reply.class, scanExpression);
Die scan
-Methode gibt standardmäßig eine "lazy-loaded"-Sammlung zurück. Sie gibt anfänglich ausschließlich eine Ergebnisseite zurück und führt dann bei Bedarf einen Dienstaufruf für die nächste Seite durch. Um alle übereinstimmenden Elemente zu erhalten, müssen Sie die Sammlung replies
durchlaufen.
Beachten Sie, dass beim Aufrufen der size()
-Methode für die Sammlung jedes Ergebnis geladen wird, um eine genaue Zählung zu liefern. Dies kann dazu führen, dass ein großer Teil des bereitgestellten Durchsatzes verbraucht wird, und bei einer sehr großen Tabelle könnte sogar der gesamte Speicher in Ihrer Tabelle erschöpft sein. JVM
Um einen Index zu scannen, müssen Sie zuerst den Index als eine Mapper-Klasse modellieren. Angenommen, die Reply
-Tabelle hat einen globalen sekundären Index namens PostedBy-Message-Index
. Der Partitionsschlüssel für diesen Index ist PostedBy
und der Sortierschlüssel ist Message
. Im Abschnitt query wird eine Mapper-Klasse für diesen Index gezeigt. Sie verwendet die Anmerkungen @DynamoDBIndexHashKey
und @DynamoDBIndexRangeKey
, um den Partitions- und Sortierschlüssel des Index anzugeben.
Im folgenden Codebeispiel wird PostedBy-Message-Index
gescannt. Er verwendet keinen Scan-Filter, sodass alle Elemente im Index an Sie zurückgegeben werden.
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression() .withIndexName("PostedBy-Message-Index") .withConsistentRead(false); List<PostedByMessage> iList = mapper.scan(PostedByMessage.class, scanExpression); Iterator<PostedByMessage> indexItems = iList.iterator();
scanPage
Scannt eine Tabelle oder einen sekundären Index und gibt eine einzelne Seite der übereinstimmenden Ergebnisse zurück. Ebenso wie bei der scan
-Methode, können Sie optional einen FilterExpression
festlegen, um den Ergebnissatz zu filtern. scanPage
gibt jedoch nur die erste „Seite“ der Daten zurück, d. h. Menge von Daten, die in 1 MB passt.
parallelScan
Führt einen parallelen Scan einer gesamten Tabelle oder einem sekundären Index durch. Sie geben eine Reihe von logischen Segmente für die Tabelle zusammen mit einem Scan-Ausdruck an, um Ergebnisse zu filtern. Der parallelScan
teilt die Scan-Aufgabe unter mehreren Benutzern auf, einer für jedes logische Segment; die Benutzer verarbeiten die Daten parallel und geben die Ergebnisse zurück.
Im folgenden Java-Codebeispiel wird ein paralleler Scan der Tabelle Product
ausgeführt.
int numberOfThreads = 4; Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>(); eav.put(":n", new AttributeValue().withN("100")); DynamoDBScanExpression scanExpression = new DynamoDBScanExpression() .withFilterExpression("Price <= :n") .withExpressionAttributeValues(eav); List<Product> scanResult = mapper.parallelScan(Product.class, scanExpression, numberOfThreads);
batchSave
Speichert Objekte in eine oder mehrere Tabellen mithilfe eines Aufrufs oder mehrerer Aufrufe der Methode AmazonDynamoDB.batchWriteItem
. Diese Methode bietet keine Transaktionsgarantien.
Der folgende Java-Code speichert zwei Elemente (Bücher) in der Tabelle ProductCatalog
.
Book book1 = new Book(); book1.setId(901); book1.setProductCategory("Book"); book1.setTitle("Book 901 Title"); Book book2 = new Book(); book2.setId(902); book2.setProductCategory("Book"); book2.setTitle("Book 902 Title"); mapper.batchSave(Arrays.asList(book1, book2));
batchLoad
Ruft mehrere Elemente aus einer oder mehreren Tabellen anhand ihrer Primärschlüssel ab.
Der folgende Java-Code ruft zwei Elemente aus zwei verschiedenen Tabellen ab.
ArrayList<Object> itemsToGet = new ArrayList<Object>(); ForumItem forumItem = new ForumItem(); forumItem.setForumName("Amazon DynamoDB"); itemsToGet.add(forumItem); ThreadItem threadItem = new ThreadItem(); threadItem.setForumName("Amazon DynamoDB"); threadItem.setSubject("Amazon DynamoDB thread 1 message text"); itemsToGet.add(threadItem); Map<String, List<Object>> items = mapper.batchLoad(itemsToGet);
batchDelete
Löscht Objekte aus einer oder mehreren Tabellen mithilfe einer oder mehrerer Aufrufe der AmazonDynamoDB.batchWriteItem
-Methode. Diese Methode bietet keine Transaktionsgarantien.
Der folgende Java-Code löscht zwei Elemente (Bücher) aus der Tabelle ProductCatalog
.
Book book1 = mapper.load(Book.class, 901); Book book2 = mapper.load(Book.class, 902); mapper.batchDelete(Arrays.asList(book1, book2));
batchWrite
Speichert Objekte in und löscht Objekte aus einer oder mehreren Tabellen mithilfe einer oder mehrerer Aufrufe der AmazonDynamoDB.batchWriteItem
-Methode. Diese Methode bietet keine Transaktionsgarantien oder Versioning-Support (bedingte Ablege- oder Löschvorgänge).
Der folgende Java-Code schreibt ein neues Element in die Tabelle Forum
, schreibt ein neues Element in die Tabelle Thread
und löscht ein Element aus der Tabelle ProductCatalog
.
// Create a Forum item to save Forum forumItem = new Forum(); forumItem.setName("Test BatchWrite Forum"); // Create a Thread item to save Thread threadItem = new Thread(); threadItem.setForumName("AmazonDynamoDB"); threadItem.setSubject("My sample question"); // Load a ProductCatalog item to delete Book book3 = mapper.load(Book.class, 903); List<Object> objectsToWrite = Arrays.asList(forumItem, threadItem); List<Book> objectsToDelete = Arrays.asList(book3); mapper.batchWrite(objectsToWrite, objectsToDelete);
transactionWrite
Speichert Objekte in und löscht Objekte aus mindestens einer Tabelle mithilfe eines Aufrufs der AmazonDynamoDB.transactWriteItems
-Methode.
Eine Liste der transaktionsspezifischen Ausnahmen finden Sie unter Fehler. TransactWriteItems
Anmerkung
Diese Methode unterstützt Folgendes nicht:
Der folgende Java-Code schreibt transaktional jeweils ein neues Element in die Tabellen Forum
und Thread
.
Thread s3ForumThread = new Thread(); s3ForumThread.setForumName("S3 Forum"); s3ForumThread.setSubject("Sample Subject 1"); s3ForumThread.setMessage("Sample Question 1"); Forum s3Forum = new Forum(); s3Forum.setName("S3 Forum"); s3Forum.setCategory("Amazon Web Services"); s3Forum.setThreads(1); TransactionWriteRequest transactionWriteRequest = new TransactionWriteRequest(); transactionWriteRequest.addPut(s3Forum); transactionWriteRequest.addPut(s3ForumThread); mapper.transactionWrite(transactionWriteRequest);
transactionLoad
Lädt Objekte aus mindestens einer Tabelle mithilfe eines Aufrufs der AmazonDynamoDB.transactGetItems
-Methode.
Eine Liste der transaktionsspezifischen Ausnahmen finden Sie unter Fehler. TransactGetItems
Der folgende Java-Code lädt transaktional jeweils ein Element aus den Tabellen Forum
und Thread
.
Forum dynamodbForum = new Forum(); dynamodbForum.setName("DynamoDB Forum"); Thread dynamodbForumThread = new Thread(); dynamodbForumThread.setForumName("DynamoDB Forum"); TransactionLoadRequest transactionLoadRequest = new TransactionLoadRequest(); transactionLoadRequest.addLoad(dynamodbForum); transactionLoadRequest.addLoad(dynamodbForumThread); mapper.transactionLoad(transactionLoadRequest);
count
Bewertet den angegebenen Scanausdruck und gibt die Anzahl der übereinstimmenden Elemente zurück. Es werden keine Elementdaten zurückgegeben.
generateCreateTableAnfrage
Analysiert eine POJO Klasse, die eine DynamoDB-Tabelle darstellt, und gibt a CreateTableRequest
für diese Tabelle zurück.
createS3Link
Erstellt einen Link zu einem Objekt in Amazon S3. Sie müssen einen Bucket-Namen und einen Schlüsselnamen angeben, welches das Objekt in dem Bucket eindeutig identifiziert.
Um createS3Link
zu verwenden, muss die Mapper-Klasse die Methoden "Getter" und "Setter" definieren. Im folgenden Codebeispiel wird dies veranschaulicht, indem der Klasse CatalogItem
ein neues Attribut und Getter/Setter-Methoden hinzugefügt werden.
@DynamoDBTable(tableName="ProductCatalog") public class CatalogItem { ... public S3Link productImage; .... @DynamoDBAttribute(attributeName = "ProductImage") public S3Link getProductImage() { return productImage; } public void setProductImage(S3Link productImage) { this.productImage = productImage; } ... }
Der folgende Java-Code definiert ein neues Element, das in die Tabelle Product
geschrieben werden soll. Das Element enthält einen Link zu einemr Produktimage. Die Imagedaten werden auf Amazon S3 hochgeladen.
CatalogItem item = new CatalogItem(); item.setId(150); item.setTitle("Book 150 Title"); String myS3Bucket = "myS3bucket"; String myS3Key = "productImages/book_150_cover.jpg"; item.setProductImage(mapper.createS3Link(myS3Bucket, myS3Key)); item.getProductImage().uploadFrom(new File("/file/path/book_150_cover.jpg")); mapper.save(item);
Die S3Link
-Klasse bietet viele andere Methoden für die Bearbeitung von Objekten in Amazon S3. Weitere Informationen finden Sie unter Javadocs for S3Link
.
Ruft S3 ab ClientCache
Gibt den zugrunde liegenden S3ClientCache
für den Zugriff auf Amazon S3 zurück. Ein S3ClientCache
ist ein intelligentes Mapping für AmazonS3Client
-Objekte. Wenn Sie mehrere Kunden haben, S3ClientCache
kann Ihnen an dabei helfen, die Kunden nach AWS Regionen zu organisieren und bei Bedarf neue Amazon S3 S3-Clients zu erstellen.