Java 1.x:DynamoDBMapper
注意
SDK for Java 有两个版本:1.x 和 2.x。我们已于 2024 年 1 月 12 日宣布
AWS SDK for Java 提供了 DynamoDBMapper
类,使您能够将客户端类映射到 Amazon DynamoDB 表。要使用 DynamoDBMapper
,您应在代码中定义 DynamoDB 表中项目与其相应对象实例之间的关系。DynamoDBMapper
类让您能够对项目执行各种创建、读取、更新和删除 (CRUD) 操作,并对表运行查询和扫描。
主题
注意
DynamoDBMapper
类不允许创建、更新或删除表。要执行这些任务,请改用低级别 SDK for Java 接口。有关更多信息,请参阅 在 Java 中使用 DynamoDB 表。
SDK for Java 提供了一组注释类型,可用于将类映射到表。例如,我们来看一个使用 Id
作为分区键的 ProductCatalog
表。
ProductCatalog(Id, ...)
您可以将客户端应用程序中的类映射到 ProductCatalog
表(如下面的 Java 代码所示)。该代码定义了一个名为 CatalogItem
的普通旧 Java 对象 (POJO),此对象使用注释将对象字段映射到 DynamoDB 属性名称。
例
package com.amazonaws.codesamples; import java.util.Set; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBIgnore; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; @DynamoDBTable(tableName="ProductCatalog") public class CatalogItem { private Integer id; private String title; private String ISBN; private Set<String> bookAuthors; private String someProp; @DynamoDBHashKey(attributeName="Id") public Integer getId() { return id; } public void setId(Integer id) {this.id = id; } @DynamoDBAttribute(attributeName="Title") public String getTitle() {return title; } public void setTitle(String title) { this.title = title; } @DynamoDBAttribute(attributeName="ISBN") public String getISBN() { return ISBN; } public void setISBN(String ISBN) { this.ISBN = ISBN; } @DynamoDBAttribute(attributeName="Authors") public Set<String> getBookAuthors() { return bookAuthors; } public void setBookAuthors(Set<String> bookAuthors) { this.bookAuthors = bookAuthors; } @DynamoDBIgnore public String getSomeProp() { return someProp; } public void setSomeProp(String someProp) { this.someProp = someProp; } }
在上述代码中,@DynamoDBTable
注释将 CatalogItem
类映射到 ProductCatalog
表。您可以将各个类实例存储为表中的项目。在类定义中,@DynamoDBHashKey
注释将 Id
属性映射到主键。
默认情况下,类属性会映射到表中的同名属性。Title
和 ISBN
属性会映射到表中的同名属性。
当 DynamoDB 属性的名称与类中声明的属性的名称匹配时,@DynamoDBAttribute
注释是可选的。当这两个名称不同时,请将此注释与 attributeName
参数一起使用以指定此属性对应的 DynamoDB 属性。
在上述示例中,@DynamoDBAttribute
注释将添加到每个属性中以确保属性名称与为 DynamoDB 中的代码示例创建表和加载数据中创建的表完全匹配,并且与本指南中其他代码示例中使用的属性名称保持一致。
您的类定义的某些属性可以不用映射到表中的任何属性。您可以通过添加 @DynamoDBIgnore
注释来识别这些属性。在上述示例中,SomeProp
属性是使用 @DynamoDBIgnore
注释标记的。在将 CatalogItem
实例上传到该表时,您的 DynamoDBMapper
实例不包含 SomeProp
属性。另外,映射器也不会在您检索表中的项目时返回此属性。
在定义了映射类之后,可以使用 DynamoDBMapper
方法将该类的实例写入 Catalog
表的对应项目。以下代码示例展示了这一技术。
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDBMapper mapper = new DynamoDBMapper(client); CatalogItem item = new CatalogItem(); item.setId(102); item.setTitle("Book 102 Title"); item.setISBN("222-2222222222"); item.setBookAuthors(new HashSet<String>(Arrays.asList("Author 1", "Author 2"))); item.setSomeProp("Test"); mapper.save(item);
以下代码示例说明如何检索该项目并访问它的某些属性。
CatalogItem partitionKey = new CatalogItem(); partitionKey.setId(102); DynamoDBQueryExpression<CatalogItem> queryExpression = new DynamoDBQueryExpression<CatalogItem>() .withHashKeyValues(partitionKey); List<CatalogItem> itemList = mapper.query(CatalogItem.class, queryExpression); for (int i = 0; i < itemList.size(); i++) { System.out.println(itemList.get(i).getTitle()); System.out.println(itemList.get(i).getBookAuthors()); }
DynamoDBMapper
提供了在 Java 内使用 DynamoDB 数据的一种直观而自然的方式。它还提供了一些内置功能,如乐观锁、ACID 事务、自动生成的分区键和排序键值以及对象版本控制。