學習參考資料鏈接
-
[Server Endpoint][https://docs.aws.amazon.com/zh_cn/general/latest/gr/rande.html] 設置
比如我們的DynamoDb使用的區域是:
這裏我們選用的是Amazon DynamoDB用的Endpoint
這裏我使用的是dynamodb.us-west-2.amazonaws.com,協議選擇的HTTP,Https走不通目前AWS中工程師沒有給出具體理由;
見代碼:
static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration
("http://dynamodb.us-west-2.amazonaws.com", "us-west-2"))
.build();
static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
- [IAM的設置][https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/access_policies.html]
把生成的credentials 放在這個目錄(自己創建的)中:
【注】:若IDEA 版本必須是2018.3版以上的,
需要依賴的jar
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.431</version>
</dependency>
需要的plugin
-
如上操作後即可使用IDEA對Amazon Db的操作;
-
相關的CRUD 操作;
Amazon DynamoDB據我向AWS開發人員請教時瞭解到是沒有封裝類似於MongoDB的分頁操作的,具體的分頁操作可見[分頁鏈接][https://www.talentica.com/blogs/dynamo-db-pagination/] 估計你也不會看;
相關的DynamoDb SDK的文檔[鏈接1][https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/DynamoDB.html] [鏈接2][https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html][鏈接3][https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html] [鏈接4][[https://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/DynamoDBMapper.CRUDExample1.html] [鏈接5][https://www.programcreek.com/java-api-examples/?api=com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper]可做參考,
但是如上官方鏈接估計使用或多或少都是有問題的,具體的操作還得我提交的demo,上面都是可以跑通的;
-
[解決 PKIX:unable to find valid certification path to requested target][http://www.ibloger.net/article/3024.html]
【注】如何在控制檯創建表的時候,要注意如果使用排序健則用封裝好的DynamoDbMapper只能插入數據,查詢數據時跟AWS工程師調了半天也沒有查出數據,查詢的時候需要帶上主鍵和排序鍵 才能查出,若是用原生的API查詢出來是很苦逼的,代碼如下:
Table table = dynamoDB.getTable(tableName);
System.out.println("--- "+tableName+" ---");
Map<String, AttributeValue> key = new HashMap<String, AttributeValue>();
key.put("id", new AttributeValue().withN(120+""));//主鍵 withN:表示傳入的是數字
key.put("Title", new AttributeValue().withS("Book 120 Title"));//排序鍵 withS:表示傳入的字符串
GetItemRequest getItemRequest = new GetItemRequest()
.withTableName(tableName)
.withKey(key);
GetItemResult result = client.getItem(getItemRequest);
System.out.println(result.getItem());
那如果看你這張表是否有排序鍵呢?如下圖:
也可以:
重點是整理的如下Demo:
package com.tcl.amazondemo.DynamoDb;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.model.*;
import com.tcl.amazondemo.DynamoDb.Entity.Book;
import java.text.SimpleDateFormat;
import java.util.Arrays;
public class IotDynamoDb {
static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration
("http://dynamodb.us-west-2.amazonaws.com", "us-west-2"))
.build();
static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
public static void main(String[] args) throws InterruptedException {
/*創建表*/
String tableName = "SimpleD";
String primeKey = "ariti";
/*主鍵類型*/
ScalarAttributeType scalarAttributeType = ScalarAttributeType.S;
createTable(tableName,primeKey,scalarAttributeType);
/*批量插入*/
// insertBatchIntoDynamoDb();
// System.out.println("批量插入成功!");
/*插入一行記錄*/
// insertDynamoDb();
// System.out.println("插入成功!");
/*更新一行記錄*/
// updateDynamoDb();
/*批量刪除記錄*/
// deleteBatchDynamoDb();
/*刪除一條記錄*/
// deleteDynamoDb();
}
private static void createTable(String tableName, String primeKey,ScalarAttributeType scalarAttributeType) throws InterruptedException {
DynamoDB dynamoDB = new DynamoDB(client);
System.out.println("Attempting to create table; please wait...");
Table table = dynamoDB.createTable(tableName,
Arrays.asList(new KeySchemaElement(primeKey, KeyType.HASH) // Partition
// key
// new KeySchemaElement("Subject", KeyType.RANGE)
), // Sort key
Arrays.asList(new AttributeDefinition(primeKey, scalarAttributeType)
// new AttributeDefinition("Subject", ScalarAttributeType.S)
),
new ProvisionedThroughput(10L, 10L));
table.waitForActive();
System.out.println("Success. Table status: " + table.getDescription().getTableStatus());
}
private static void deleteDynamoDb() {
DynamoDBMapper mapper = new DynamoDBMapper(client);
Book book1 = mapper.load(Book.class, 111);
mapper.delete(book1);
System.out.println("刪除完成");
}
private static void deleteBatchDynamoDb() {
DynamoDBMapper mapper = new DynamoDBMapper(client);
Book book1 = mapper.load(Book.class, 110);
Book book2 = mapper.load(Book.class, 999);
System.out.println("Deleting two books from the ProductCatalog table.");
mapper.batchDelete(Arrays.asList(book1, book2));
System.out.println("批量刪除完成");
}
private static void updateDynamoDb() {
DynamoDBMapper mapper = new DynamoDBMapper(client);
Book itemRetrieved = mapper.load(Book.class, 999);
itemRetrieved.setISBN("3333333333");
mapper.save(itemRetrieved);
DynamoDBMapperConfig config = DynamoDBMapperConfig.builder()
.withConsistentReads(DynamoDBMapperConfig.ConsistentReads.CONSISTENT)
.build();
Book updatedItem = mapper.load(Book.class, 999, config);
System.out.println("Retrieved the previously updated item:");
System.out.println(updatedItem);
}
public static void insertBatchIntoDynamoDb(){
DynamoDBMapper mapper = new DynamoDBMapper(client);
Book book1 = new Book();
book1.setId(110);
book1.setInPublication(true);
book1.setISBN("1123");
book1.setTitle("GOOD");
book1.setProductCategory("1234");
book1.setPrice(100);
book1.setPageCount(10);
Book book2 = new Book();
book2.setId(111);
book2.setInPublication(false);
book2.setISBN("8888");
book2.setTitle("GOOD");
book2.setProductCategory("1234");
book2.setPrice(100);
book2.setPageCount(10);
System.out.println("Adding three books to ProductCatalog table.");
mapper.batchSave(Arrays.asList(book1, book2));
}
public static void insertDynamoDb(){
DynamoDBMapper mapper = new DynamoDBMapper(client);
Book book1 = new Book();
book1.setId(999);
book1.setInPublication(false);
book1.setISBN("777");
book1.setTitle("GOOD1");
book1.setProductCategory("1224");
book1.setPrice(1000);
book1.setPageCount(110);
System.out.println("Adding three books to ProductCatalog table.");
mapper.save(book1);
}
}
package com.tcl.amazondemo.DynamoDb.Entity;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
@DynamoDBTable(tableName = "iot_test_db")
public class Book {
private int id;
private String title;
private String ISBN;
private int price;
private int pageCount;
private String productCategory;
private boolean inPublication;
// Partition key
@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 getInPublication() {
return inPublication;
}
public void setInPublication(boolean inPublication) {
this.inPublication = inPublication;
}
@Override
public String toString() {
return "Book [ISBN=" + ISBN + ", price=" + price + ", product category=" + productCategory + ", id=" + id
+ ", title=" + title + "]";
}
}
【如果沒有時間如下概念可忽略】:
DynamoDB 是一種完全託管的 NoSQL 數據庫,支持文檔和鍵值兩種存儲模式;它擁有靈活的數據模型、可靠的性能以及自動的吞吐容量擴展功能,這使其成爲移動、Web、遊戲、廣告技術、物聯網和衆多其他應用程序的不二之選。
DynamoDB爲aws下一個NoSql數據庫,用於處理簡單key-value數據。DynamoDB也支持索引,目前一個表結構最多支持5個索引
新建一個文件夾:安裝AWS-SDK
npm install aws-sdk
設置AWS 憑證要使用 訪問 Amazon Web Services,您必須使用 AWS 賬戶憑證配置 ,上面都是有介紹的