

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# `TableSchema` 從資料類別產生
<a name="ddb-en-client-gs-tableschema"></a>

`[TableSchema](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/TableSchema.html)` 可讓增強型用戶端在用戶端類別之間映射 DynamoDB 屬性值。在本教學課程中，您將了解衍生自靜態資料類別並使用建置器從程式碼產生的 `TableSchema`。

## 使用標註的資料類別
<a name="ddb-en-client-gs-tableschema-anno-bean"></a>

適用於 Java 的 SDK 2.x 包含[一組註釋](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/mapper/annotations/package-summary.html)，您可以搭配資料類別使用，以快速產生 `TableSchema`，將您的類別映射至資料表。

首先建立符合 [JavaBean 規格](https://download.oracle.com/otn-pub/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/beans.101.pdf)的資料類別。規格要求 類別具有無引數的公有建構函數，並具有類別中每個屬性的 getter 和 setter。包含類別層級註釋，表示資料類別是 `DynamoDbBean`。此外，在 getter 或 setter 上至少包含主索引鍵屬性的`DynamoDbPartitionKey`註釋。

您可以將[屬性層級註釋](ddb-en-client-anno-index.md)套用至 getter 或 setter，但不能同時套用兩者。

**注意**  
此術語`property`通常用於封裝在 JavaBean 中的值。不過，本指南會`attribute`改用 一詞，以符合 DynamoDB 所使用的術語。

下列`Customer`類別顯示將類別定義連結至 DynamoDB 資料表的註釋。

### `Customer` 類別
<a name="ddb-en-client-gs-tableschema-anno-bean-cust"></a>

```
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、地圖、清單和集合等屬性](ddb-en-client-adv-features-nested.md)區段中的 `Person`類別。

## 使用建置器
<a name="ddb-en-client-gs-tableschema-builder"></a>

如果您在程式碼中定義資料表結構描述，則可以略過 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();
```