TableSchema从数据类生成 - AWS SDK for Java 2.x

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

TableSchema从数据类生成

TableSchema 使增强型客户端能够将 DynamoDB 属性值映射到您的客户端类,反之亦然。在本教程中,您将了解两类 TableSchema,一类是从静态数据类派生的,另一类是使用生成器从代码中生成的。

使用带注释的数据类

适用于 Java 的 SDK 2.x 包含一组注释,您可以将其与数据类结合使用,以快速生成 TableSchema 来将类映射到表。

首先创建一个符合JavaBean 规范的数据类。该规范要求类具有无参数的公共构造函数,并且类中的每个属性都有 getter 和 setter。包括类级别的注释,以指示数据类是 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 属性的映射。

有关使用由多个数据类组成的数据模型的示例,请参阅处理嵌套属性部分中的 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();