以前,我们使用Java创建了DynamoDB表。
对于各种数据库(例如sql数据库或nosql),有一组工具可帮助访问,持久化和管理对象/类与基础数据库之间的数据。 例如,对于SQL数据库,我们使用JPA,对于Cassandra,我们使用MappingManager。
DynamoDBMapper是使您能够访问各种表中的数据,对项目执行各种CRUD操作以及对表执行查询和扫描的工具。
我们将尝试映射上一个示例中的“用户”,“登录名”,“主管”和“公司”表。
Users是一个简单的表,使用用户的电子邮件作为哈希键。
package com.gkatzioura.dynamodb.mapper.entities;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
/**
* Created by gkatzioura on 9/20/16.
*/
@DynamoDBTable(tableName="Users")
public class User {
private String email;
private String fullName;
@DynamoDBHashKey(attributeName="email")
public String getEmail() {
return email;
}
@DynamoDBAttribute(attributeName="fullname")
public void setEmail(String email) {
this.email = email;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
}
但是,在各种情况下,我们的DynamoDB表都使用哈希和范围键。 Logins表跟踪用户的登录尝试。 电子邮件是哈希键,时间戳是范围键。
package com.gkatzioura.dynamodb.mapper.entities;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
/**
* Created by gkatzioura on 9/20/16.
*/
@DynamoDBTable(tableName="Logins")
public class Login {
private String email;
private Long timestamp;
@DynamoDBHashKey(attributeName="email")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@DynamoDBRangeKey(attributeName="timestamp")
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
}
另一种流行的情况是带有全局二级索引(GSI)的表。 例如,“主管”表用于按主管的姓名检索主管。 但是,我们也使用此表来检索特定公司的所有主管或在公司特定工厂工作的主管。
主管名称是我们的哈希键,公司名称是哈希键,工厂名称是全局二级索引的范围键。
package com.gkatzioura.dynamodb.mapper.entities;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBIndexHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBIndexRangeKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
/**
* Created by gkatzioura on 9/21/16.
*/
@DynamoDBTable(tableName="Supervisors")
public class Supervisor {
private String name;
private String company;
private String factory;
@DynamoDBHashKey(attributeName="name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@DynamoDBIndexHashKey(globalSecondaryIndexName = "FactoryIndex",attributeName = "company")
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@DynamoDBIndexRangeKey(globalSecondaryIndexName = "FactoryIndex",attributeName = "factory")
public String getFactory() {
return factory;
}
public void setFactory(String factory) {
this.factory = factory;
}
}
最后但并非最不重要的一点是,我们可以使用本地二级索引。 公司表使用公司名称作为哈希键,使用子公司名称作为范围键。 由于我们要基于公司的CEO发出查询,因此将本地二级索引与基于CEO姓名的范围键一起使用。
package com.gkatzioura.dynamodb.mapper.entities;
import com.amazonaws.services.dynamodbv2.datamodeling.*;
/**
* Created by gkatzioura on 9/21/16.
*/
@DynamoDBTable(tableName="Companies")
public class Company {
private String name;
private String subsidiary;
private String ceo;
@DynamoDBHashKey(attributeName="name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@DynamoDBRangeKey(attributeName = "subsidiary")
public String getSubsidiary() {
return subsidiary;
}
public void setSubsidiary(String subsidiary) {
this.subsidiary = subsidiary;
}
@DynamoDBIndexRangeKey(localSecondaryIndexName = "CeoIndex",attributeName = "ceo")
public String getCeo() {
return ceo;
}
public void setCeo(String ceo) {
this.ceo = ceo;
}
}
您可以在github上找到源代码。
翻译自: https://www.javacodegeeks.com/2016/09/map-dynamodb-items-objects-using-dynamodb-mapper.html