Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
ynamoDBMapper Classe D
La classe DynamoDBMapper
est le point d'entrée d'Amazon DynamoDB. Elle donne accès à un point de terminaison DynamoDB et vous permet d'accéder à vos données dans différentes tables. Il vous permet également d'effectuer diverses opérations de création, de lecture, de mise à jour et de suppression (CRUD) sur des éléments, ainsi que d'exécuter des requêtes et des analyses sur des tables. Cette classe fournit les méthodes suivantes utiliser DynamoDB.
Pour la documentation Javadoc correspondante, voir D ynamoDBMapper dans la AWS SDK for Java API référence.
Rubriques
enregistrer
Enregistre l'objet spécifié dans la table. L'objet que vous voulez enregistrer est le seul paramètre requis pour cette méthode. Vous pouvez fournir des paramètres de configuration facultatifs en utilisant l'objet DynamoDBMapperConfig
.
Si un élément qui a la même clé primaire n'existe pas, cette méthode crée un nouvel élément dans la table. Si un élément qui a la même clé primaire existe, elle met à jour l'élément existant. Si la clé de partition et la clé de tri sont de type String et sont annotées avec@DynamoDBAutoGeneratedKey
, elles reçoivent un identifiant unique universel aléatoire (UUID) si elles ne sont pas initialisées. Les champs de version qui sont annotés avec @DynamoDBVersionAttribute
seront incrémentés d'un niveau. En outre, si un champ de version est mis à jour ou généré par une clé, l'objet adopté est mis à jour à la suite de l'opération.
Par défaut, seuls les attributs correspondants aux propriétés de classes mappées sont mis à jour. Tous les attributs supplémentaires existant sur un élément ne sont pas affectés. Toutefois, si vous spécifiez SaveBehavior.CLOBBER
, vous pouvez forcer le remplacement complet de l'élément.
DynamoDBMapperConfig config = DynamoDBMapperConfig.builder() .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.CLOBBER).build(); mapper.save(item, config);
Si vous avez activé le contrôle de version, alors les versions d'élément côté client et côté serveur doivent correspondre. Toutefois, la version n'a pas besoin de correspondre si l'option SaveBehavior.CLOBBER
est utilisée. Pour plus d’informations sur la gestion des versions, consultez DynamoDB et verrouillage optimiste avec numéro de version.
charge
Récupère un élément dans une table. Vous devez fournir la clé primaire de l'élément que vous voulez récupérer. Vous pouvez fournir des paramètres de configuration facultatifs en utilisant l'objet DynamoDBMapperConfig
. Par exemple, vous pouvez demander le cas échéant des lectures fortement cohérentes afin de garantir que cette méthode récupère uniquement les dernières valeurs d'élément comme indiqué dans l'instruction Java suivante.
DynamoDBMapperConfig config = DynamoDBMapperConfig.builder() .withConsistentReads(DynamoDBMapperConfig.ConsistentReads.CONSISTENT).build(); CatalogItem item = mapper.load(CatalogItem.class, item.getId(), config);
Par défaut, DynamoDB renvoie l'élément ayant des valeurs éventuellement cohérentes. Pour plus d'informations sur le modèle de cohérence éventuelle de DynamoDB, consultez Cohérence de lecture DynamoDB.
supprimer
Supprime un élément de la table. Vous devez communiquer une instance d'objet de la classe mappée.
Si vous avez activé le contrôle de version, alors les versions d'élément côté client et côté serveur doivent correspondre. Toutefois, la version n'a pas besoin de correspondre si l'option SaveBehavior.CLOBBER
est utilisée. Pour plus d’informations sur la gestion des versions, consultez DynamoDB et verrouillage optimiste avec numéro de version.
query
Interroge une table ou un index secondaire.
Supposons que vous ayez une table, Reply
, qui stocke des réponses de threads de forum. Chaque objet thread peut avoir zéro ou plusieurs réponses. La clé primaire de la table Reply
se compose des champs Id
et ReplyDateTime
, où Id
est la clé de partition et ReplyDateTime
est la clé de tri de la clé primaire.
Reply ( Id, ReplyDateTime, ... )
Supposons que vous ayez créé un mappage entre une classe Reply
et la table Reply
correspondante dans DynamoDB. L'exemple de code Java suivant utilise DynamoDBMapper
pour trouver toutes les réponses au cours des deux dernières semaines pour un objet thread spécifique.
Exemple
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);
La requête renvoie un ensemble d'objets Reply
.
Par défaut, la méthode query
renvoie une collection « avec chargement différé ». Elle ne renvoie initialement qu'une seule page de résultats puis effectue un appel de service pour la page suivante si nécessaire. Pour obtenir tous les éléments correspondants, itérez sur la collection latestReplies
.
Notez que l'appel de la méthode size()
sur la collection chargera chaque résultat afin de fournir un décompte précis. Cela peut entraîner une consommation importante du débit provisionné et, sur une très grande table, vous risquez même d'épuiser toute la mémoire de votre ordinateur. JVM
Pour interroger un index, vous devez tout d'abord affecter un modèle à l'index en tant que classe d'outil de mappage. Supposons que la Reply
table possède un index secondaire global nommé PostedBy-Message-Index. La clé de partition de cet index est PostedBy
, et la clé de tri est Message
. La définition de classe d'un élément dans l'index se présenterait comme suit :
@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. }
L'annotation @DynamoDBTable
indique que cet index est associé à la table Reply
. L'@DynamoDBIndexHashKey
annotation indique la clé de partition (PostedBy) de l'index et @DynamoDBIndexRangeKey
la clé de tri (Message) de l'index.
Vous pouvez maintenant utiliser DynamoDBMapper
pour interroger l'index, en récupérant un sous-ensemble de messages qui ont été publiés par un utilisateur particulier. Il n'est pas nécessaire de spécifier le nom de l'index si vous n'avez pas de mappages contradictoires entre les tables et les index et si les mappages sont déjà établis dans l'outil de mappage. L'outil de mappage déduit en fonction de la clé primaire et de la clé de tri. L'exemple de code suivant interroge un index secondaire global. Étant donné que les index globaux secondaires (gsi) prennent en charge des lectures cohérentes à terme, mais pas des lectures fortement cohérentes, vous devez spécifier withConsistentRead(false)
.
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);
La requête renvoie un ensemble d'objets PostedByMessage
.
queryPage
Interroge une table ou un index secondaire, et renvoie une seule page de résultats correspondants. Comme avec la méthode query
, vous devez spécifier une valeur de clé de partition et un filtre de requête qui est appliqué à l'attribut de clé de tri. Toutefois, queryPage
renvoie uniquement la première « page » de données, c'est-à-dire la quantité de données pouvant tenir dans 1 Mo
scan
Analyse une table ou un index secondaire entiers. Vous pouvez spécifier le cas échéant un FilterExpression
pour filtrer l'ensemble de résultats.
Supposons que vous ayez une table, Reply
, qui stocke des réponses de threads de forum. Chaque objet thread peut avoir zéro ou plusieurs réponses. La clé primaire de la table Reply
se compose des champs Id
et ReplyDateTime
, où Id
est la clé de partition et ReplyDateTime
est la clé de tri de la clé primaire.
Reply ( Id, ReplyDateTime, ... )
Si vous avez mappé une classe Java à la table Reply
, vous pouvez utiliser le DynamoDBMapper
pour analyser la table. Par exemple, le code Java suivant analyse l'ensemble de la table Reply
, en renvoyant uniquement les réponses pour une année donnée.
Exemple
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);
Par défaut, la méthode scan
renvoie une collection « avec chargement différé ». Elle ne renvoie initialement qu'une seule page de résultats puis effectue un appel de service pour la page suivante si nécessaire. Pour obtenir tous les éléments correspondants, itérez sur la collection replies
.
Notez que l'appel de la méthode size()
sur la collection chargera chaque résultat afin de fournir un décompte précis. Cela peut entraîner une consommation importante du débit provisionné et, sur une très grande table, vous risquez même d'épuiser toute la mémoire de votre ordinateur. JVM
Pour analyser un index, vous devez tout d'abord affecter un modèle à l'index en tant que classe d'outil de mappage. Supposons que la table Reply
a un index secondaire global nommé PostedBy-Message-Index
. La clé de partition de cet index est PostedBy
, et la clé de tri est Message
. Une classe d'outil de mappage pour cet index est disponible dans la section query. Elle utilise les annotations @DynamoDBIndexHashKey
et @DynamoDBIndexRangeKey
pour spécifier la clé de partition et la clé de tri de l'index.
L'exemple de code suivant présente analyse PostedBy-Message-Index
. Il n'utilise pas un filtre d'analyse. Ainsi, tous les éléments dans l'index vous sont renvoyés.
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression() .withIndexName("PostedBy-Message-Index") .withConsistentRead(false); List<PostedByMessage> iList = mapper.scan(PostedByMessage.class, scanExpression); Iterator<PostedByMessage> indexItems = iList.iterator();
scanPage
Analyse une table ou un index secondaire, et renvoie une seule page de résultats correspondants. Comme avec la méthode scan
, vous pouvez spécifier le cas échéant un FilterExpression
pour filtrer le jeu de résultats. Toutefois, scanPage
renvoie uniquement la première « page » de données, c'est-à-dire la quantité de données pouvant tenir dans 1 Mo.
parallelScan
Effectue une analyse parallèle d'une table ou d'un index secondaire entiers. Vous spécifiez un certain nombre de segments logiques pour la table, avec une expression d'analyse pour filtrer les résultats. Le parallelScan
répartit la tâche d'analyse entre plusieurs instances de travail, une pour chaque segment logique ; les instances de travail traitent les données en parallèle et renvoient les résultats.
L'exemple de code Java suivant effectue une analyse parallèle sur la table Product
.
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
Enregistre des objets dans une ou plusieurs tables à l'aide d'un ou de plusieurs appels à la méthode AmazonDynamoDB.batchWriteItem
. Cette méthode n'offre pas de garanties de transaction.
Le code Java enregistre deux éléments (livres) dans la table 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
Récupère plusieurs éléments d'une ou de plusieurs tables en utilisant leurs clés primaires.
Le code Java suivant récupère deux éléments dans deux tables différentes.
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
Supprime des objets d'une ou de plusieurs tables à l'aide d'un ou de plusieurs appels à la méthode AmazonDynamoDB.batchWriteItem
. Cette méthode n'offre pas de garanties de transaction.
Le code Java supprime deux éléments (livres) dans la table ProductCatalog
.
Book book1 = mapper.load(Book.class, 901); Book book2 = mapper.load(Book.class, 902); mapper.batchDelete(Arrays.asList(book1, book2));
batchWrite
Enregistre et supprime des objets dans une ou plusieurs des tables à l'aide d'un ou de plusieurs appels à la méthode AmazonDynamoDB.batchWriteItem
. Cette méthode ne fournit pas des garanties de transactions et ne prend pas en charge le contrôle de version (suppressions ou insertions conditionnelles).
Le code Java suivant écrit un nouvel élément dans la table Forum
, écrit un nouvel élément dans la table Thread
et supprime un élément de la table 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
Enregistre et supprime des objets dans une ou plusieurs des tables à l'aide d'un appel à la méthode AmazonDynamoDB.transactWriteItems
.
Note
Cette méthode ne prend pas en charge :
Le code Java suivant écrit un nouvel élément dans chacune des tables Forum
et Thread
, par voie de transaction.
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
Charge des objets d'une ou de plusieurs tables à l'aide d'un appel à la méthode AmazonDynamoDB.transactGetItems
.
L'extrait de code Java suivent charge un élément à partir de chacune des tables Forum
et Thread
, par voie de transaction.
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
Évalue l'expression d'analyse spécifiée et renvoie le nombre d'éléments correspondants. Aucun élément de données n'est renvoyé.
generateCreateTableDemande
Analyse une POJO classe qui représente une table DynamoDB et renvoie CreateTableRequest
un pour cette table.
createS3Link
Crée un lien vers un objet dans Amazon S3. Vous devez spécifier un nom de compartiment et un nom de clé identifiant l'objet de manière unique dans le compartiment.
Pour utiliser createS3Link
, votre classe d'outil de mappage doit définir des méthodes getter et setter. L'exemple de code suivant illustre cela en ajoutant un nouvel attribut et des méthodes getter/setter à la classe CatalogItem
:
@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; } ... }
Le code Java suivant définit un nouvel élément à écrire dans la table Product
. L'élément inclut un lien vers une image de produit ; les données d'image sont chargées dans Amazon S3.
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);
La classe S3Link
fournit de nombreuses autres méthodes pour la manipulation d'objets dans Amazon S3. Pour plus d'informations, consultez Javadocs pour S3Link
.
Obtient S3 ClientCache
Renvoie le S3ClientCache
sous-jacent pour l'accès à Amazon S3. Un S3ClientCache
est une carte intelligente pour des objets AmazonS3Client
. Si vous avez plusieurs clients, cela S3ClientCache
peut vous aider à les organiser par AWS région et à créer de nouveaux clients Amazon S3 à la demande.