本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
适用于 Java 的 SDK 版本 1 和版本 2 之间的 DynamoDB APIs 映射发生了变化
创建客户端
应用场景 | V1 | 第 2 版 |
---|---|---|
普通实例化 |
|
|
最少的实例化 |
|
|
使用属性转换器 * |
|
|
* V2 中的扩展与 V1 中的属性转换器大致对应。本使用扩展程序自定义 DynamoDB 增强型客户端操作节包含有关 V2 中扩展的更多信息。
建立到 DynamoDB 表/索引的映射
在 V1 中,您可以通过 Bean 注释指定 DynamoDB 表名。在 V2 中,一种工厂方法table()
,会生成一个代表远程 Dynam DynamoDbTable
oDB 表的实例。该table()
方法的第一个参数是 DynamoDB 表名。
应用场景 | V1 | 第 2 版 |
---|---|---|
将 Java POJO 类映射到 DynamoDB 表 |
|
|
映射到 DynamoDB 二级索引 |
《DynamoDB 开发者指南》中讨论 |
本指南中的使用二级索引部分提供了更多信息。 |
表操作
本节介绍大多数标准用例中 V1 和 V2 之间存在差异的操作 APIs 。
在 V2 中,所有涉及单个表的操作都是在DynamoDbTable
实例上调用的,而不是在增强型客户端上调用的。增强版客户端包含可以针对多个表的方法。
在下面名为 “表操作” 的表中,POJO 实例被称为item
或称为特定类型,例如。customer1
对于 V2 示例,名为、的实例table
是先前调用的结果enhancedClient.table()
,它返回了对该DynamoDbTable
实例的引用。
请注意,即使未显示,也可以使用流畅的使用者模式调用大多数 V2 操作。例如,
Customer customer = table.getItem(r → r.key(key));
or
Customer customer = table.getItem(r → r.key(k -> k.partitionValue("id").sortValue("email")))
对于 V1 操作,表格操作(下图)包含一些常用的表单,而不是所有重载表单。例如,该load()
方法有以下重载:
mapper.load(Customer.class, hashKey)
mapper.load(Customer.class, hashKey, rangeKey)
mapper.load(Customer.class, hashKey, config)
mapper.load(Customer.class, hashKey, rangeKey, config)
mapper.load(item)
mapper.load(item, config)
表格操作(下图)显示了常用的表单:
mapper.load(item) mapper.load(item, config)
应用场景 | V1 | 第 2 版 |
---|---|---|
向 DynamoDB 表写一个 Java POJO DynamoDB 操作:, |
在 V1 中, |
|
从 DynamoDB 表中读取一个项目到 Java POJO DynamoDB 操作: |
|
|
从 DynamoDB 表中删除项目 DynamoDB 操作: |
|
|
查询 DynamoDB 表或二级索引并返回分页列表 DynamoDB 操作: |
|
使用返回的 |
查询 DynamoDB 表或二级索引并返回列表 DynamoDB 操作: |
|
使用返回的 |
扫描 DynamoDB 表或二级索引并返回分页列表 DynamoDB 操作: |
|
使用返回的 |
扫描 DynamoDB 表或二级索引并返回列表 DynamoDB 操作: |
|
使用返回的 |
批量读取多个表中的多个项目 DynamoDB 操作: |
|
|
将多个项目批量写入多个表 DynamoDB 操作: |
|
|
批量删除多个表中的多个项目 DynamoDB 操作: |
|
|
批量写入/删除多个项目 DynamoDB 操作: |
|
|
进行交易写作 DynamoDB 操作: |
|
|
进行交易性读取 DynamoDB 操作: |
|
|
获取查询中匹配项的计数 DynamoDB 操作:使用 |
|
|
获取扫描中匹配的项目数量 DynamoDB 操作:使用 |
|
|
在 DynamoDB 中创建与 POJO 类对应的表 DynamoDB 操作: |
前面的语句生成一个低级别的创建表请求;用户必须在 DynamoDB |
|
在 DynamoDB 中执行并行扫描 DynamoDB 操作 |
|
用户需要处理工作线程
|
将 Amazon S3 与 DynamoDB 集成以存储智能 S3 链接 |
|
不支持,因为它将 Amazon S3 和 DynamoDB 结合在一起。 |
地图类和属性
在 V1 和 V2 中,您都使用 bean 样式的注释将类映射到表。V2 还提供了其他方法来为特定用例定义架构,例如使用不可变类。
Bean 注释
下表显示了 V1 和 V2 中使用的特定用例的等效 bean 注释。Customer
类场景用于说明参数。
V2 中的注释以及类和枚举遵循驼峰大小写惯例,使用 “” 而不是 “DynamoDB”。DynamoDb
应用场景 | V1 | 第 2 版 |
---|---|---|
将类映射到表 |
|
表名是在调用DynamoDbEnhancedClient#table() 方法时定义的。 |
将类成员指定为表属性 |
|
|
指定班级成员是 hash/partition 关键 |
|
|
指定班级成员是 range/sort 关键 |
|
|
将类成员指定为二级索引哈希/分区键 |
|
|
将类成员指定为二级索引范围/排序键 |
|
|
映射到表时忽略该类成员 |
|
|
将类成员指定为自动生成的 UUID 密钥属性 |
|
默认情况下,不加载提供此功能的扩展;您必须将扩展程序添加到客户端生成器中。 |
将类成员指定为自动生成的时间戳属性 |
|
默认情况下,不加载提供此功能的扩展;您必须将扩展程序添加到客户端生成器中。 |
将类成员指定为自动递增的版本属性 |
|
提供此功能的扩展程序是自动加载的。 |
将类成员指定为需要自定义转换 |
|
|
指定要存储为其他属性类型的类成员 |
|
使用 |
指定一个可以序列化为 DynamoDB 文档(JSON 风格的文档)或子文档的类 |
|
使用增强型文档 API。请参阅以下资源:
|
V2 附加注释
应用场景 | V1 | 第 2 版 |
---|---|---|
如果 Java 值为空,则指定不存储为空属性的类成员 | 不适用 |
|
如果所有属性都为空,则将类成员指定为空对象 | 不适用 |
|
为班级成员指定特殊更新操作 | 不适用 |
|
指定一个不可变的类 | 不适用 |
|
将类成员指定为自动递增的计数器属性 | 不适用 |
提供此功能的扩展程序是自动加载的。 |
配置
在 V1 中,您通常使用实例来控制特定的行为。DynamoDBMapperConfig
您可以在创建映射器时或在发出请求时提供配置对象。在 V2 中,配置特定于操作的请求对象。
应用场景 | V1 | V1 中的默认设置 | 第 2 版 |
---|---|---|---|
|
|||
Batch load/write 重试策略 |
|
重试失败的项目 | 在底层DynamoDBClient 配置重试策略。请参阅本指南中的在中配置重试行为 AWS SDK for Java 2.x。 |
一致性读取 |
|
EVENTUAL |
默认情况下,读取操作的一致性读取为 false。在请求对象.consistentRead(true) 上使用替换。 |
包含编组器/解组器集的转换架构 |
静态实现提供了与旧版本的向后兼容性。 |
V2_COMPATIBLE |
不适用。这是一项传统功能,指的是最早版本的 DynamoDB (V1) 如何存储数据类型,增强版客户端中不会保留此行为。DynamoDB V1 中的一个行为示例是将布尔值存储为数字而不是布尔值。 |
表名称 |
静态实现提供了与旧版本的向后兼容性 |
使用注释或从课堂上猜测 |
表名是在调用 |
分页加载策略 |
选项有:LAZY_ |
LAZY_LOADING |
|
请求收集指标 |
|
null |
metricPublisher() 在构建标准 DynamoDB 客户端ClientOverrideConfiguration 时使用。 |
保存行为 |
选项为 |
UPDATE |
在 V2 中,您可以
|
类型转换器工厂 |
|
标准型转换器 |
使用在 bean 上设置
|
每个操作的配置
在 V1 中,某些操作(例如query()
)可以通过提交给操作的 “表达式” 对象进行高度配置。例如:
DynamoDBQueryExpression<Customer> emailBwQueryExpr = new DynamoDBQueryExpression<Customer>() .withRangeKeyCondition("Email", new Condition() .withComparisonOperator(ComparisonOperator.BEGINS_WITH) .withAttributeValueList( new AttributeValue().withS("my"))); mapper.query(Customer.class, emailBwQueryExpr);
在 V2 中,您不使用配置对象,而是使用生成器在请求对象上设置参数。例如:
QueryEnhancedRequest emailBw = QueryEnhancedRequest.builder() .queryConditional(QueryConditional .sortBeginsWith(kb -> kb .sortValue("my"))).build(); customerTable.query(emailBw);
条件
在 V2 中,条件表达式和筛选表达式使用Expression
对象来表达,该对象封装了条件以及名称和过滤器的映射。
应用场景 | 操作 | V1 | 第 2 版 |
---|---|---|---|
预期的属性条件 | 保存 ()、删除 ()、查询 ()、扫描 () |
|
已弃用;ConditionExpression 改用。 |
条件表达式 | 删除 () |
|
|
筛选表达式 | 查询 ()、扫描 () |
|
|
查询条件表达式 | 查询 () |
|
|
类型转换
默认转换器
在 V2 中,SDK 为所有常见类型提供了一组默认转换器。既可以在整体提供程序级别上更改类型转换器,也可以在单个属性上更改类型转换器。您可以在 AttributeConverter
为属性设置自定义转换器
在 V1 中,您可以使用对 getter 方法进行注释,@DynamoDBTypeConverted
以指定在 Java 属性类型和 DynamoDB 属性类型之间进行转换的类。例如,可以应用在 Java Currency
类型和 DynamoDB 字符串之间进行转换的,如以下代码段所示。CurrencyFormatConverter
@DynamoDBTypeConverted(converter = CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
上一个代码段的 V2 等效代码如下所示。
@DynamoDbConvertedBy(CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
注意
在 V1 中,您可以将注释应用于属性本身、类型或用户定义的注释,V2 仅支持将注释应用于 getter。
添加类型转换器工厂或提供商
在 V1 中,您可以提供自己的类型转换器集,也可以通过在配置中添加类型转换器工厂来覆盖您关心的类型。类型转换器出厂扩展DynamoDBTypeConverterFactory
,覆盖是通过获取对默认集的引用并对其进行扩展来完成的。以下片段演示了如何执行此操作。
DynamoDBTypeConverterFactory typeConverterFactory =
DynamoDBTypeConverterFactory.standard().override()
.with(String.class, CustomBoolean.class, new DynamoDBTypeConverter<String, CustomBoolean>() {
@Override
public String convert(CustomBoolean bool) {
return String.valueOf(bool.getValue());
}
@Override
public CustomBoolean unconvert(String string) {
return new CustomBoolean(Boolean.valueOf(string));
}}).build();
DynamoDBMapperConfig config =
DynamoDBMapperConfig.builder()
.withTypeConverterFactory(typeConverterFactory)
.build();
DynamoDBMapper mapperWithTypeConverterFactory = new DynamoDBMapper(dynamo, config);
V2 通过@DynamoDbBean
注解提供了类似的功能。您可以提供单个AttributeConverterProvider
或一系列订购AttributeConverterProvider
的。请注意,如果您提供自己的属性转换器提供程序链,则将覆盖默认的转换器提供程序,并且必须将其包含在链中才能使用其属性转换器。
@DynamoDbBean(converterProviders = {
ConverterProvider1.class,
ConverterProvider2.class,
DefaultAttributeConverterProvider.class})
public class Customer {
...
}
本指南中关于属性转换的部分包含了 V2 的完整示例。