Amazon DynamoDb使用說明

學習參考資料鏈接
  1. [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'");
  1. [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
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

  1. 如上操作後即可使用IDEA對Amazon Db的操作;

  2. 相關的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,上面都是可以跑通的;

  3. [解決 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 賬戶憑證配置 ,上面都是有介紹的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章