我们使用机器学习技术将英文博客翻译为简体中文。您可以点击导航栏中的“中文(简体)”切换到英文版本。
在适用于 Java 的 亚马逊云科技 开发工具包 2.x 中介绍适用于 DynamoDB 的增强文档 API
我们很高兴地宣布,适用于
ent 实例来表示没有固定架构的项目,然后使用 DynamoDB 增强客户端读取和写入 DynamoDB。
此外,与提供类型不安全的参数和返回类型的 aws-sdk-java 1.x 的文档 API 不同,增强型文档提供用于处理文档的强类型化 API。该接口简化了开发过程并确保了数据的正确输入。
先决条件:
开始之前,请确保您使用的是最新版本的 亚马逊云科技 Java SDK 依赖项,其中包含所有最新发布的错误修复和功能。要获得增强文档 API 支持,您必须使用 2.20.33 或更高版本。有关如何管理
在 pom.xml 中添加对动态增强版的依赖关系。
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>dynamodb-enhanced</artifactId>
<version>2.20.33</version>
</dependency>
使用增强文档 API 与 DDB 进行交互的快速演练
步骤 1:创建 DynamoDB 增强型客户端
创建 DynamodBenhancedClient 类的实例,该类为 Amazon DynamoDB 提供了一个高级接口,可以简化 DynamoDB 表的使用。
DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
.dynamoDbClient(DynamoDbClient.create())
.build();
步骤 2:使用文档表架构创建 DynamodbTable 资源对象
要使用增强文档 API 对 DynamoDB 表执行命令,必须将该表与您的文档表架构关联以创建
DynamoD
BTable 资源对象。文档表架构生成器需要主索引键和属性转换器提供商。使用 A
ttributeConverterProvider.defaultProvider () 来转换默认类型的文档属性
。 可以向生成器中添加可选的二级索引键。
DynamoDbTable<EnhancedDocument> documentTable = enhancedClient.table("my_table",
TableSchema.documentSchemaBuilder()
.addIndexPartitionKey(TableMetadata.primaryIndexName(),"hashKey", AttributeValueType.S)
.addIndexSortKey(TableMetadata.primaryIndexName(), "sortKey", AttributeValueType.N)
.attributeConverterProviders(AttributeConverterProvider.defaultProvider())
.build());
// call documentTable.createTable() if "my_table" does not exist in DynamoDB
步骤 3:使用增强文档编写 DynamoDB 项目
En
hancedDocument 类具有静态工厂方法以及 用于向文档
添加属性的
生成器
方法。以下代码段演示了在构造
文档项目 时由 enhancedDoc
ument 提供的类型安全性。
EnhancedDocument simpleDoc = EnhancedDocument.builder()
.attributeConverterProviders(defaultProvider())
.putString("hashKey", "sampleHash")
.putNull("nullKey")
.putNumber("sortKey", 1.0)
.putBytes("byte", SdkBytes.fromUtf8String("a"))
.putBoolean("booleanKey", true)
.build();
documentTable.putItem(simpleDoc);
步骤 4:将 Dynamo 数据库项目作为增强文档读取
可以使用 getter 方法访问从 DynamoDB 表中检索到的文档的属性
EnhancedDocument docGetItem = documentTable.getItem(r -> r.key(k -> k.partitionValue("samppleHash").sortValue(1)));
docGetItem.getString("hashKey");
docGetItem.isNull("nullKey")
docGetItem.getNumber("sortKey").floatValue();
docGetItem.getBytes("byte");
docGetItem.getBoolean("booleanKey");
用于以自定义对象形式访问文档属性的属性转换器提供商
您可以向 EnhancedDocument 提供自定义 A
ttribute
转换为特定的对象类型。
ConverterProvider 实例,以将文档
属性
可以在 DocumentT
ableSchema 或 En hancedDocum
ent 上设置这些提供器
, 以便将属性作为自定义对象读取或写入。
TableSchema.documentSchemaBuilder()
.attributeConverterProviders(CustomClassConverterProvider.create(), defaultProvider())
.build();
// Insert a custom class instance into an EnhancedDocument as attribute 'customMapOfAttribute'.
EnhancedDocument customAttributeDocument =
EnhancedDocument.builder().put("customMapOfAttribute", customClassInstance, CustomClass.class).build();
// Retrieve attribute 'customMapOfAttribute' as CustomClass object.
CustomClass customClassObject = customAttributeDocument.get("customMapOfAttribute", CustomClass.class);
将文档转换为 JSON,反之亦然
增强文档 API 允许您将 JSON 字符串转换为
增强文档,反之亦然
。
// Enhanced document created from JSON string using defaultConverterProviders.
EnhancedDocument documentFromJson = EnhancedDocument.fromJson("{\"key\": \"Value\"}")
// Converting an EnhancedDocument to JSON string "{\"key\": \"Value\"}"
String jsonFromDocument = documentFromJson.toJson();
定义自定义属性转换器提供商
自定义属性转换器提供者是 Att
ributeConverterProvider 的实现 ,它为自定义类提供
转换器。
以下是 cu
stomClassforDocumentAPI
的示例,其单个字段为字符串类型 的
StringAttribute 及其相应的 Attribute
Con verterProvider 实现。
public class CustomClassForDocumentAPI {
private final String stringAttribute;
public CustomClassForDocumentAPI(Builder builder) {
this.stringAttribute = builder.stringAttribute;
}
public static Builder builder() {
return new Builder();
}
public String stringAttribute() {
return stringAttribute;
}
public static final class Builder {
private String stringAttribute;
private Builder() {
}
public Builder stringAttribute(String stringAttribute) {
this.stringAttribute = string;
return this;
}
public CustomClassForDocumentAPI build() {
return new CustomClassForDocumentAPI(this);
}
}
}
import java.util.Map;
import software.amazon.awssdk.enhanced.dynamodb.AttributeConverter;
import software.amazon.awssdk.enhanced.dynamodb.AttributeConverterProvider;
import software.amazon.awssdk.enhanced.dynamodb.EnhancedType;
import software.amazon.awssdk.utils.ImmutableMap;
public class CustomAttributeForDocumentConverterProvider implements AttributeConverterProvider {
private final Map<EnhancedType<?>, AttributeConverter<?>> converterCache = ImmutableMap.of(
EnhancedType.of(CustomClassForDocumentAPI.class), new CustomClassForDocumentAttributeConverter());
// Different types of converters can be added to this map.
public static CustomAttributeForDocumentConverterProvider create() {
return new CustomAttributeForDocumentConverterProvider();
}
@Override
public <T> AttributeConverter<T> converterFor(EnhancedType<T> enhancedType) {
return (AttributeConverter<T>) converterCache.get(enhancedType);
}
}
自定义属性转换器是 A
ttributeConv
erter 的实现 ,它可以将自定义类与属性值映射进行转换,如下所示。
import java.util.LinkedHashMap;
import java.util.Map;
import software.amazon.awssdk.enhanced.dynamodb.AttributeConverter;
import software.amazon.awssdk.enhanced.dynamodb.AttributeValueType;
import software.amazon.awssdk.enhanced.dynamodb.EnhancedType;
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.EnhancedAttributeValue;
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.StringAttributeConverter;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
public class CustomClassForDocumentAttributeConverter implements AttributeConverter<CustomClassForDocumentAPI> {
public static CustomClassForDocumentAttributeConverter create() {
return new CustomClassForDocumentAttributeConverter();
}
@Override
public AttributeValue transformFrom(CustomClassForDocumentAPI input) {
Map<String, AttributeValue> attributeValueMap = new LinkedHashMap<>();
if(input.string() != null){
attributeValueMap.put("stringAttribute", AttributeValue.fromS(input.string()));
}
return EnhancedAttributeValue.fromMap(attributeValueMap).toAttributeValue();
}
@Override
public CustomClassForDocumentAPI transformTo(AttributeValue input) {
Map<String, AttributeValue> customAttr = input.m();
CustomClassForDocumentAPI.Builder builder = CustomClassForDocumentAPI.builder();
if (customAttr.get("stringAttribute") != null) {
builder.stringAttribute(StringAttributeConverter.create().transformTo(customAttr.get("stringAttribute")));
}
return builder.build();
}
@Override
public EnhancedType<CustomClassForDocumentAPI> type() {
return EnhancedType.of(CustomClassForDocumentAPI.class);
}
@Override
public AttributeValueType attributeValueType() {
return AttributeValueType.M;
}
}
增强型文档生成器的属性转换器提供商
在 DynamoDB 表上下文之外工作时,请务必在 EnhancedDocument 生成器上明确设置属性转换器提供程序
。
在 DynamoDB 表上下文中使用时,表架构的转换器提供程序将自动用于 EnhancedDocument。
下面的代码片段显示了如何使用 EnhancedDocument 生成器方法设置 A
ttributeConverterProvid
er。
// Enhanced document created from JSON string using custom AttributeConverterProvider.
EnhancedDocument documentFromJson = EnhancedDocument.builder()
.attributeConverterProviders(CustomClassConverterProvider.create())
.json("{\"key\": \"Values\"}")
.build();
CustomClassForDocumentAPI customClass = documentFromJson.get("key", CustomClassForDocumentAPI.class)
结论
在这篇博客文章中,我们向您展示了如何在
增强
文档 API。增强版客户端是开源的,与适用于
作者简介:
*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。