package com.askey.hyman.aws.verchk.helper;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.*;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* DynamoDB的测试类:
* 测试查询和扫描
* Created by hyman on 2017/5/25.
*/
public class DynamoDBMapperQueryScanExample {
//获取客户端
private static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
public static void main(String[] args) {
//获取mapper映射
DynamoDBMapper mapper = new DynamoDBMapper(client);
// GetBook(mapper,101);
String forumName = "Amazon DynamoDB";
String threadSubject = "DynamoDB Thread 1";
// FindRepliesInLast15Days(mapper,forumName,threadSubject);
// FindRepliesPostedWithinTimePeriod(mapper, forumName, threadSubject);
// FindBooksPricedLessThanSpecifiedValue(mapper, "20");
int numberOfThreads = 16;
FindBicyclesOfSpecificTypeWithMultipleThreads(mapper, numberOfThreads, "Road");
}
/**
*
* @param mapper
* @param numberOfThreads
* @param bicycleType
*/
private static void FindBicyclesOfSpecificTypeWithMultipleThreads(DynamoDBMapper mapper, int numberOfThreads, String bicycleType) {
System.out.println("FindBicyclesOfSpecificTypeWithMultipleThreads: Scan ProductCatalog With Multiple Threads.");
Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":val1", new AttributeValue().withS("Bicycle"));
eav.put(":val2", new AttributeValue().withS(bicycleType));
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
.withFilterExpression("ProductCategory = :val1 and BicycleType = :val2").withExpressionAttributeValues(eav);
List<Bicycle> scanResult = mapper.parallelScan(Bicycle.class, scanExpression, numberOfThreads);
for (Bicycle bicycle : scanResult) {
System.out.println(bicycle);
}
}
/**
*条件扫描:
* ("Price < :val1 and ProductCategory = :val2")//条件扫描表达式
* @param mapper
* @param value
*/
private static void FindBooksPricedLessThanSpecifiedValue(DynamoDBMapper mapper, String value) {
System.out.println("FindBooksPricedLessThanSpecifiedValue: Scan ProductCatalog.");
Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":val1", new AttributeValue().withN(value));
eav.put(":val2", new AttributeValue().withS("Book"));
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
.withFilterExpression("Price < :val1 and ProductCategory = :val2")//条件表达式
.withExpressionAttributeValues(eav);
List<Book> scanResult = mapper.scan(Book.class, scanExpression);
for (Book book : scanResult) {
System.out.println(book);
}
}
/**
*条件查询在两个时间段之间的数据
* @param mapper
* @param forumName
* @param threadSubject
*/
private static void FindRepliesPostedWithinTimePeriod(DynamoDBMapper mapper, String forumName, String threadSubject) {
String partitionKey = forumName + "#" + threadSubject;
System.out.println(
"FindRepliesPostedWithinTimePeriod: Find replies for thread Message = 'DynamoDB Thread 2' posted within a period.");
long startDateMilli = (new Date()).getTime() - (14L * 24L * 60L * 60L * 1000L); // Two
// weeks
// ago.
long endDateMilli = (new Date()).getTime() - (7L * 24L * 60L * 60L * 1000L); // One
// week
// ago.
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String startDate = dateFormatter.format(startDateMilli);
String endDate = dateFormatter.format(endDateMilli);
Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":val1", new AttributeValue().withS(partitionKey));
eav.put(":val2", new AttributeValue().withS(startDate));
eav.put(":val3", new AttributeValue().withS(endDate));
DynamoDBQueryExpression<Reply> queryExpression = new DynamoDBQueryExpression<Reply>()
.withKeyConditionExpression("Id = :val1 and ReplyDateTime between :val2 and :val3")//查询表达式
.withExpressionAttributeValues(eav);
List<Reply> betweenReplies = mapper.query(Reply.class, queryExpression);
for (Reply reply : betweenReplies) {
System.out.format("Id=%s, Message=%s, PostedBy=%s %n, PostedDateTime=%s %n", reply.getId(),
reply.getMessage(), reply.getPostedBy(), reply.getReplyDateTime());
}
}
/**
*条件查询:15天以内的信息
* @param mapper 映射器
* @param forumName
* @param threadSubject
*/
private static void FindRepliesInLast15Days(DynamoDBMapper mapper, String forumName, String threadSubject) {
System.out.println("FindRepliesInLast15Days: Replies within last 15 days.");
String partitionKey = forumName + "#" + threadSubject;
long twoWeeksAgoMili = (new Date()).getTime() - (15L*24L*60L*60L*1000L);
Date twoWeeksAgo = new Date();
twoWeeksAgo.setTime(twoWeeksAgoMili);
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd 'T' HH:mm:ss.SSS'Z'");
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String twoWeeksAgoStr = dateFormatter.format(twoWeeksAgo);
Map<String,AttributeValue> eav = new HashMap<>();
eav.put(":val1",new AttributeValue().withS(partitionKey));
eav.put(":val2",new AttributeValue().withS(twoWeeksAgoStr.toString()));
DynamoDBQueryExpression<Reply> queryExpression = new DynamoDBQueryExpression<Reply>()
.withKeyConditionExpression("Id = :val1 and ReplyDateTime > :val2")//查询表达式
.withExpressionAttributeValues(eav);
List<Reply> latestReplies = mapper.query(Reply.class, queryExpression);
for (Reply reply : latestReplies) {
System.out.format("Id=%s, Message=%s, PostedBy=%s %n, ReplyDateTime=%s %n", reply.getId(),
reply.getMessage(), reply.getPostedBy(), reply.getReplyDateTime());
}
}
/**
* 根据id=101 查找Book信息
* @param mapper
* @param i
*/
private static void GetBook(DynamoDBMapper mapper, int i) {
System.out.println("GetBook: Get book Id = '101' ");
System.out.println("Book table has no sort Key. you can do GetItem,but no Query");
Book book = mapper.load(Book.class,i);
System.out.format("Id = %s Title = %s, ISBN = %s %n", book.getId(), book.getTitle(), book.getISBN());
}
/**
* book 实体类
*/
@DynamoDBTable(tableName = "Book")
public static class Book {
private int id;//编号
private String title;//名称
private String ISBN;
private int price;
private int pageCount;
private String productCategory;
private boolean inPublication;
@DynamoDBHashKey(attributeName = "Id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@DynamoDBAttribute(attributeName = "Title")
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@DynamoDBAttribute(attributeName = "ISBN")
public String getISBN() {
return ISBN;
}
public void setISBN(String ISBN) {
this.ISBN = ISBN;
}
@DynamoDBAttribute(attributeName = "Price")
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@DynamoDBAttribute(attributeName = "PageCount")
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
@DynamoDBAttribute(attributeName = "ProductCategory")
public String getProductCategory() {
return productCategory;
}
public void setProductCategory(String productCategory) {
this.productCategory = productCategory;
}
@DynamoDBAttribute(attributeName = "InPublication")
public boolean isInPublication() {
return inPublication;
}
public void setInPublication(boolean inPublication) {
this.inPublication = inPublication;
}
@Override
public String toString() {
return "Boook{" +
"id=" + id +
", title='" + title + '\'' +
", ISBN='" + ISBN + '\'' +
", price=" + price +
", pageCount=" + pageCount +
", productCategory='" + productCategory + '\'' +
", inPublication=" + inPublication +
'}';
}
public Book() {
}
}
/**
* Bicycle实体类
*/
@DynamoDBTable(tableName = "ProductCatalog")
public static class Bicycle {
private int id;
private String title;
private String description;
private String brand;
private int price;
private List<String> color;
private String productCategory;
private String bicycleType;
public String getBicycleType() {
return bicycleType;
}
public void setBicycleType(String bicycleType) {
this.bicycleType = bicycleType;
}
@DynamoDBHashKey(attributeName = "Id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@DynamoDBAttribute(attributeName = "Title")
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@DynamoDBAttribute(attributeName = "Description")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@DynamoDBAttribute(attributeName = "Brand")
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
@DynamoDBAttribute(attributeName = "Price")
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@DynamoDBAttribute(attributeName = "Color")
public List<String> getColor() {
return color;
}
public void setColor(List<String> color) {
this.color = color;
}
@DynamoDBAttribute(attributeName = "ProductCategory")
public String getProductCategory() {
return productCategory;
}
public void setProductCategory(String productCategory) {
this.productCategory = productCategory;
}
@Override
public String toString() {
return "Bicycle{" +
"id=" + id +
", title='" + title + '\'' +
", description='" + description + '\'' +
", brand='" + brand + '\'' +
", price=" + price +
", color=" + color +
", productCategory='" + productCategory + '\'' +
", bicycleType='" + bicycleType + '\'' +
'}';
}
}
/**
* reply实体
*/
@DynamoDBTable(tableName = "Reply")
public static class Reply {
private String id;
private String replyDateTime;
private String message;
private String postedBy;
@DynamoDBHashKey(attributeName = "Id")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@DynamoDBRangeKey(attributeName = "ReplyDateTime")
public String getReplyDateTime() {
return replyDateTime;
}
public void setReplyDateTime(String replyDateTime) {
this.replyDateTime = replyDateTime;
}
@DynamoDBAttribute(attributeName = "Message")
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@DynamoDBAttribute(attributeName = "PostedBy")
public String getPostedBy() {
return postedBy;
}
public void setPostedBy(String postedBy) {
this.postedBy = postedBy;
}
@Override
public String toString() {
return "Reply{" +
"id='" + id + '\'' +
", replyDateTime='" + replyDateTime + '\'' +
", message='" + message + '\'' +
", postedBy='" + postedBy + '\'' +
'}';
}
}
/**
* Thread 实体类
*/
@DynamoDBTable(tableName = "Thread")
public static class Thread {
private String forumName;
private String subject;
private String message;
private String lastPostedDateTime;
private String lastPostedBy;
private Set<String> tags;
private int answered;
private int views;
private int replies;
@DynamoDBHashKey(attributeName = "ForumName")
public String getForumName() {
return forumName;
}
public void setForumName(String forumName) {
this.forumName = forumName;
}
@DynamoDBRangeKey(attributeName = "Subject")
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
@DynamoDBAttribute(attributeName = "Message")
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@DynamoDBAttribute(attributeName = "LastPostDateTime")
public String getLastPostedDateTime() {
return lastPostedDateTime;
}
public void setLastPostedDateTime(String lastPostedDateTime) {
this.lastPostedDateTime = lastPostedDateTime;
}
@DynamoDBAttribute(attributeName = "LastPostedBy")
public String getLastPostedBy() {
return lastPostedBy;
}
public void setLastPostedBy(String lastPostedBy) {
this.lastPostedBy = lastPostedBy;
}
@DynamoDBAttribute(attributeName = "Tags")
public Set<String> getTags() {
return tags;
}
public void setTags(Set<String> tags) {
this.tags = tags;
}
@DynamoDBAttribute(attributeName = "Answered")
public int getAnswered() {
return answered;
}
public void setAnswered(int answered) {
this.answered = answered;
}
@DynamoDBAttribute(attributeName = "Views")
public int getViews() {
return views;
}
public void setViews(int views) {
this.views = views;
}
@DynamoDBAttribute(attributeName = "Replies")
public int getReplies() {
return replies;
}
public void setReplies(int replies) {
this.replies = replies;
}
@Override
public String toString() {
return "Thread{" +
"forumName='" + forumName + '\'' +
", subject='" + subject + '\'' +
", message='" + message + '\'' +
", lastPostedDateTime='" + lastPostedDateTime + '\'' +
", lastPostedBy='" + lastPostedBy + '\'' +
", tags=" + tags +
", answered=" + answered +
", views=" + views +
", replies=" + replies +
'}';
}
}
/**
* Forum 实体类
*/
@DynamoDBTable(tableName = "Forum")
public static class Forum{
private String name;
private String category;
private int threads;
@DynamoDBHashKey(attributeName = "Name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@DynamoDBAttribute(attributeName = "Category")
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
@DynamoDBAttribute(attributeName = "Threads")
public int getThreads() {
return threads;
}
public void setThreads(int threads) {
this.threads = threads;
}
@Override
public String toString() {
return "Forum{" +
"name='" + name + '\'' +
", category='" + category + '\'' +
", threads=" + threads +
'}';
}
}
}
DynamoDBMapper查询扫描表数据
最新推荐文章于 2024-05-28 09:59:27 发布