本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
DynamoDB APIs 映射/文档从版本 1 到版本 2 的更改
本主题详细介绍了APIs适用于亚马逊 DynamoDB SDK 的 Java 高级版本从版本 1.x (v1) 到 (v2) 的变化。 Amazon SDK for Java 2.x 我们首先介绍 object-to-table 映射API,然后讨论API用于处理JSON样式文档的文档。
高级别更改
在 v1 和 v2 中,每个库中映射客户端的名称不同:
-
v1-D ynamoDBMapper
-
v2-DynamoDB 增强版客户端
您与这两个库的交互方式大致相同:实例化映射器/客户端,然后提供一个 Java POJO 来读取这些项目并将其写入 Dy APIs namoDB 表。这两个库还为的类提供了注释POJO,以指导客户端如何处理POJO。
迁移到 v2 时的显著区别包括:
-
V2 和 v1 对低级 DynamoDB 操作使用不同的方法名称。例如:
v1 v2 load getItem save putItem batchLoad batchGetItem -
V2 提供了多种定义表架构和映射POJOs到表格的方法。您可以选择使用注释或使用生成器从代码中生成的架构。V2 还提供架构的可变和不可变版本。
-
在 v2 中,您专门创建表架构作为第一步,而在 v1 中,表架构是根据需要从带注释的类中推断出来的。
-
V2 在增强版API客户端中包含 Doc
ument 客户端API,而 v1 则使用单独的客户端。API -
在 v2 中,所有版本APIs均提供同步和异步版本。
有关 v2 增强版客户端的更多详细信息,请参阅本指南中的 DynamoDB 映射部分。
导入依赖关系
v1 | v2 |
---|---|
|
|
* 最新版本
在 v1 中,单个依赖关系包括低级 DynamoDB API 和映射/文档,而在 v2 中API,您可以使用构件依赖关系来访问映射/文档。dynamodb-enhanced
API该dynamodb-enhanced
模块包含对低级dynamodb
模块的传递依赖关系。
API改变
创建客户端
应用场景 | v1 | v2 |
---|---|---|
普通实例化 |
|
|
最少的实例化 |
|
|
使用属性转换器 * |
|
|
* v2 中的扩展与 v1 中的属性转换器大致对应。本使用扩展节包含有关 v2 中扩展的更多信息。
建立到 DynamoDB 表/索引的映射
在 v1 中,您可以通过 Bean 注释指定 DynamoDB 表名。在 v2 中,一种工厂方法table()
,会生成一个代表远程 Dynam DynamoDbTable
oDB 表的实例。该table()
方法的第一个参数是 DynamoDB 表名。
应用场景 | v1 | v2 |
---|---|---|
将 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 | DynamoDB 操作 | v2 |
---|---|---|---|
向 DynamoDB 表写一个 Java POJO |
在 v1 中, |
PutItem , UpdateItem |
|
从 DynamoDB 表中读取项目到 Java POJO |
|
GetItem |
|
从 DynamoDB 表中删除项目 |
|
DeleteItem |
|
查询 DynamoDB 表或二级索引并返回分页列表 |
|
Query |
使用返回的 |
查询 DynamoDB 表或二级索引并返回列表 |
|
Query |
使用返回的 |
扫描 DynamoDB 表或二级索引并返回分页列表 |
|
Scan |
使用返回的 |
扫描 DynamoDB 表或二级索引并返回列表 |
|
Scan |
使用返回的 |
批量读取多个表中的多个项目 |
|
BatchGetItem |
|
将多个项目批量写入多个表 |
|
BatchWriteItem |
|
批量删除多个表中的多个项目 |
|
BatchWriteItem |
|
批量写入/删除多个项目 |
|
BatchWriteItem |
|
进行交易写作 |
|
TransactWriteItems |
|
进行交易性读取 |
|
TransactGetItems |
|
获取扫描或查询中匹配项的计数 |
|
Query ,Scan 与 Select.COUNT |
不支持 |
在 DynamoDB 中创建与该类对应的表 POJO |
前面的语句生成低级创建表请求;用户必须在 DynamoDB |
CreateTable |
|
在 DynamoDB 中执行并行扫描 |
|
Scan 使用Segment 和TotalSegments 参数 |
用户需要处理工作线程
|
将 Amazon S3 与 DynamoDB 集成以存储智能 S3 链接 |
|
- |
不支持,因为它将 Amazon S3 和 DynamoDB 结合在一起。 |
地图类和属性
在 v1 和 v2 中,您都使用豆类样式注释将类映射到表。V2 还提供了其他方法来为特定用例定义架构,例如使用不可变类。
Bean 注释
下表显示了 v1 和 v2 中使用的特定用例的等效 bean 注释。Customer
类场景用于说明参数。
v2 中的注释以及类和枚举遵循驼峰大小写惯例,使用 “” 而不是 “DynamoDB”。DynamoDb
应用场景 | v1 | v2 |
---|---|---|
将类映射到表 |
|
表名是在调用DynamoDbEDnhancedClient#table() 方法时定义的。 |
将类成员指定为表属性 |
|
|
将类成员指定为哈希键/分区键 |
|
|
将类成员指定为范围/排序键 |
|
|
将类成员指定为二级索引哈希/分区键 |
|
|
将类成员指定为二级索引范围/排序键 |
|
|
映射到表时忽略该类成员 |
|
|
将类成员指定为自动生成的UUID键属性 |
|
默认情况下,不加载提供此功能的扩展;您必须将扩展程序添加到客户端生成器中。 |
将类成员指定为自动生成的时间戳属性 |
|
默认情况下,不加载提供此功能的扩展;您必须将扩展程序添加到客户端生成器中。 |
将类成员指定为自动递增的版本属性 |
|
提供此功能的扩展程序是自动加载的。 |
将类成员指定为需要自定义转换 |
|
|
指定要存储为其他属性类型的类成员 |
|
无等效函数 |
指定可以序列化为 DynamoDB 文档JSON(样式文档)或子文档的类 |
|
没有直接的等效注释。使用增强版文档API。 |
V2 附加注释
应用场景 | v1 | v2 |
---|---|---|
如果 Java 值为空,则指定不作为NULL属性存储的类成员 | 不适用 |
|
如果所有属性都为空,则将类成员指定为空对象 | 不适用 |
|
为班级成员指定特殊更新操作 | 不适用 |
|
指定一个不可变的类 | 不适用 |
|
将类成员指定为自动递增的计数器属性 | 不适用 |
提供此功能的扩展程序是自动加载的。 |
配置
在 v1 中,您通常使用实例来控制特定的行为。DynamoDBMapperConfig
您可以在创建映射器时或在发出请求时提供配置对象。在 v2 中,配置特定于操作的请求对象。
应用场景 | v1 | v1 中的默认值 | v2 |
---|---|---|---|
|
|||
Batch 加载重试策略 |
|
重试失败的项目 | |
Batch 写入重试策略 |
|
重试失败的项目 | |
一致性读取 |
|
EVENTUAL |
默认情况下,读取操作的一致性读取为 false。在请求对象.consistentRead(true) 上使用替换。 |
包含编组器/解组器集的转换架构 |
静态实现提供了与旧版本的向后兼容性。 |
V2_COMPATIBLE |
不适用。这是一项传统功能,指的是最早版本的 DynamoDB (v1) 如何存储数据类型,增强版客户端中不会保留此行为。DynamoDB v1 中的一个行为示例是将布尔值存储为数字而不是布尔值。 |
表名称 |
静态实现提供了与旧版本的向后兼容性 |
使用注释或从课堂上猜测 |
表名是在调用 |
分页加载策略 |
选项有:LAZY_ |
LAZY_LOADING |
默认为 “仅迭代”。不支持其他 v1 选项。 |
请求收集指标 |
|
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 | v2 |
---|---|---|---|
预期的属性条件 | 保存 ()、删除 ()、查询 ()、扫描 () |
|
已弃用;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 的完整示例。
文档历史记录API
该文档API支持在 DynamoDB 表中将JSON样式文档作为单个项目处理。v1 文档API在 v2 API 中有对应的,但是 v2 没有像 v1 API 那样为文档使用单独的客户端,而是在 DynamoDB 增强版客户端API中整合了文档功能。
在 v1 中,该Item
类代表来自 DynamoDB 表的非结构化记录。在 v2 中,非结构化记录由该EnhancedDocument
下表比较了 v1 和 v2 APIs 中文档之间的差异。
应用场景 | v1 | v2 |
---|---|---|
创建文档客户端 |
|
|
引用表格 |
|
|
Work with semi-structured data | ||
放置项目 |
|
|
获取项目 |
|
|
Work with JSON items | ||
转换JSON结构以将其与文档一起使用 API |
|
|
放 JSON |
|
|
阅读 JSON |
|
|
API文档参考和指南 APIs
v1 | v2 | |
---|---|---|
API参考 | Javadoc | Javadoc |
文档指南 | Amazon DynamoDB 开发人员指南 | 增强文档 API(本指南) |
FAQ
问:使用版本号进行乐观锁定在 v2 和 v1 中的工作方式是否相同?
答:行为类似,但是 v2 不会自动为删除操作添加条件。如果要控制删除行为,则必须手动添加条件表达式。