本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
TableSchema
从数据类生成
TableSchema
使增强型客户端能够将 DynamoDB 属性值映射到您的客户端类,反之亦然。在本教程中,您将了解两类 TableSchema
,一类是从静态数据类派生的,另一类是使用生成器从代码中生成的。
使用带注释的数据类
f SDK or Java 2.x 包含一组标注,您可以将这些注释TableSchema
用于将类映射到表的标注。
首先创建一个符合JavaBean 规范DynamoDbBean
. 此外,至少要在 getter 或 setter 上包含关于主键属性的 DynamoDbPartitionKey
注释。
您可以将属性级注释应用于 getter 或 setter,但不能同时应用两者。
注意
该术语property
通常用于封装在 a 中的值。 JavaBean但是,为了与 DynamoDB 使用的术语保持一致,本指南(英文版)改用术语 attribute
。(中文版中,两者的翻译均为“属性”。)
以下Customer
类显示了将类定义链接到 DynamoDB 表的注释。
Customer
类
package org.example.tests.model; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbSortKey; import java.time.Instant; @DynamoDbBean public class Customer { private String id; private String name; private String email; private Instant regDate; @DynamoDbPartitionKey public String getId() { return this.id; } public void setId(String id) { this.id = id; } public String getCustName() { return this.name; } public void setCustName(String name) { this.name = name; } @DynamoDbSortKey public String getEmail() { return this.email; } public void setEmail(String email) { this.email = email; } public Instant getRegistrationDate() { return this.regDate; } public void setRegistrationDate(Instant registrationDate) { this.regDate = registrationDate; } @Override public String toString() { return "Customer [id=" + id + ", name=" + name + ", email=" + email + ", regDate=" + regDate + "]"; } }
创建带注释的数据类后,使用它来创建 TableSchema
,如以下代码段所示。
static final TableSchema<Customer> customerTableSchema = TableSchema.fromBean(Customer.class);
TableSchema
被设计为静态且不可变。您通常可以在类加载时将其实例化。
静态TableSchema.fromBean()
工厂方法对 Bean 进行内省,生成数据类属性(属性)与 DynamoDB 属性的映射。
有关使用由多个数据类组成的数据模型的示例,请参阅使用 bean、地图、列表和集合等属性部分中的 Person
类。
使用生成器
如果您在代码中定义表架构,则可以避免 Bean 自检的开销。如果您对架构进行编码,则您的类无需遵循 JavaBean 命名标准,也不需要对其进行注释。以下示例使用生成器,与使用注释的 Customer
类示例等效。
static final TableSchema<Customer> customerTableSchema = TableSchema.builder(Customer.class) .newItemSupplier(Customer::new) .addAttribute(String.class, a -> a.name("id") .getter(Customer::getId) .setter(Customer::setId) .tags(StaticAttributeTags.primaryPartitionKey())) .addAttribute(String.class, a -> a.name("email") .getter(Customer::getEmail) .setter(Customer::setEmail) .tags(StaticAttributeTags.primarySortKey())) .addAttribute(String.class, a -> a.name("name") .getter(Customer::getCustName) .setter(Customer::setCustName)) .addAttribute(Instant.class, a -> a.name("registrationDate") .getter(Customer::getRegistrationDate) .setter(Customer::setRegistrationDate)) .build();