AWS学习第四篇之 DynamoDB笔记

一、结构分析

 1. 结构

表–>项目–>属性。(属性可以嵌套 )

 2. 主键和索引

用主键标识每一个项目,使用二级索引。

 3. 例子(People表)

{ 的方法的发得分地方大幅度的 {
“PersonID”:101, 的方法 “PersonID”:”102”,
“LastName”:”Smith”, “LastName”:”Jones”,
“FirstName”: “Fred”, “FirstName”:”Mary”
“Phone”:”555-1234”

|—————属性————-|
} 的方法发得分地法 方大幅度的 }
|—————项目——————|
|————————————————-表——————————-|

二、主键

 1.分两种类型

分区键,分区键和排序键

 2. 分区键

2.1. 决定了此项目存放到的分区(DynamoDB内部的物理存储)
2.2. 只有分区键的表,任何两个项目不能有相同的键值(散列函数的输入)

 3. 分区键和排序键

3.1. 具有此复合函数的表,可以有相同的分区键,但是必须有不同的排序键。

三、二级索引

 1. DynamoDB分两种索引

2.1. Global secordary index,一种与表中不同的分区键和排序键。
2.2. 本地二级索引。一种分区键相同但是排序键不同的索引。

 2. 数量限制

最多给一个表定义5个全局二级索引和5个本地二级所索引。

 3. 索引的基表

四、DynameoDB流

 1. 作用

流用于捕获表中的修改事件

 2. 触发条件

2.1. 向表中添加新项目。
2.2. 更新了项目。
2.3. 从表中删除项目。

五、数据类型

 1. 标量类型

如:数字,字符串,二进制,布尔,null

 2. 文档类型

如:列表和映射

   2.1. 列表

用[…] 表示。如:favoriteThings:[“cookies”,“coffee”,3.1415]
元素的数据类型没有限制。

   2.2. 映射

用{…}表示。

{
一个day:”Monday”,
一个UnreadEmails:42,
一个ItemsOnMyDesk:[
一个一个“coffee cup”,
一个一个“Telephone”,
一个一个的{
一个一个一个pens:{Quantity:3},
一个一个一个pens:{Quantity:2},
一个一个一个pens:{Quantity:1}
一个一个的}
一个]
}

 3. 集类型

如字符串和数字集,二进制集。

 4. 注意

4.1. 文档类型支持嵌套,最多32层。
4.2. DynamoDB不支持空串和空集,但是支持空列表和映射。

六、编程接口

 1. 接口分类

低级接口,文档接口和对象持久化接口。

 2. 低级接口

官方文档链接
示例:Music表中歌曲的GetItem请求,并输出歌曲发行年份。
com.amazonaws.services.dynamodbv2.AmazonDynamoDB类实现了DynamoDB低级别接口。

public class MusicLowLevelDemo {

    public static void main(String[] args) {
        // 通过客户端生成器来创建客户端
        AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
        // S表示字符串,N表示数字
        HashMap key = new HashMap();
        key.put("Artist", new AttributeValue().withS("No One You Know"));
        key.put("SongTitle", new AttributeValue().withS("Call Me Today"));

        // 创建get请求
        GetItemRequest request = new GetItemRequest()
            .withTableName("Music")
            .withKey(key);

        try {
            // 客户端对象来执行请求
            GetItemResult result = client.getItem(request);
            if (result && result.getItem() != null) {
                // 获取结果
                AttributeValue year = result.getItem().get("Year");
                System.out.println("The song was released in " + year.getN());
            } else {
                System.out.println("No matching song was found");
            }
        } catch (Exception e) {
            System.err.println("Unable to retrieve data: ");
            System.err.println(e.getMessage());
        }
    }
}
 3. 文档接口

官方文档链接
示例:创建一个表示Music表的Table对象,然后要求该对象使用GetItem检索歌曲。该程序随后输出歌曲发行年份。
com.amazonaws.services.dynamodbv2.document.DynamoDB类实现了DynamoDB文档接口
注意:该类是低级别客户端(AmazonDynamoDB)的包装类型。

public class MusicDocumentDemo {

    public static void main(String[] args) {
        // 通过客户端生成器来创建客户端
        AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
        // 通过客户端创建了DynamoDB的对象(包装类)
        DynamoDB docClient = new DynamoDB(client);

        // 通过对象获取表对象
        Table table = docClient.getTable("Music");

        // 获取结果
        GetItemOutcome outcome = table.getItemOutcome(
                "Artist", "No One You Know", 
                "SongTitle", "Call Me Today");
        int year = outcome.getItem().getInt("Year");
         // 打印
        System.out.println("The song was released in " + year);

    }
}
 4. 对象持久化接口

官方文档链接1.0
官方文档链接2.0
示例:对象持久化接口DynamoDBMapperMusicItem类表示Music表中的项目。
注意:该接口中不直接执行数据层面的操作,而是创建对象来表示DynamoDB表和索引中的项目,并且仅与这些对象进行交互。有点ORM的感觉

@DynamoDBTable(tableName="Music")
public class MusicItem {
    private String artist;
    private String songTitle;
    private String albumTitle;
    private int year;

    @DynamoDBHashKey(attributeName="Artist")
    public String getArtist() { return artist;}
    public void setArtist(String artist) {this.artist = artist;}

    @DynamoDBRangeKey(attributeName="SongTitle")
    public String getSongTitle() { return songTitle;}
    public void setSongTitle(String songTitle) {this.songTitle = songTitle;}

    @DynamoDBAttribute(attributeName = "AlbumTitle")
    public String getAlbumTitle() { return albumTitle;}
    public void setAlbumTitle(String albumTitle) {this.albumTitle = albumTitle;}

    @DynamoDBAttribute(attributeName = "Year")
    public int getYear() { return year; }
    public void setYear(int year) { this.year = year; }
}

这样就可以实例化MusicItem对象,并使用DynamoDBMapperload()方法检索歌曲。该程序随后输出歌曲发行年份。
注意:DynamoDBMapper是低级别客户端(AmazonDynamoDB)的包装类型。

public class MusicMapperDemo {

    public static void main(String[] args) {

        // 通过客户端生成器来创建客户端
        AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
        // 通过客户端来创建mapper对象,包装类型
        DynamoDBMapper mapper = new DynamoDBMapper(client);

        // 创建了表对象,注意不是通过表名来获取的
        MusicItem keySchema = new MusicItem();
        keySchema.setArtist("No One You Know");
        keySchema.setSongTitle("Call Me Today");

        try {
            // 检索
            MusicItem result = mapper.load(keySchema);
            if (result != null) {
                // 输出结果
                System.out.println(
                "The song was released in "+ result.getYear());
            } else {
                System.out.println("No matching song was found");
            }
        } catch (Exception e) {
            System.err.println("Unable to retrieve data: ");
            System.err.println(e.getMessage());
        }

    }

} 

七、本地安装DynamoDB单机版

 1. 解压jar包,在此处(有DynamoDBLocal.jar的地方)键入启动命令

java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb

jar包下载链接页面

 2. 创建maven项目,在pom.xml中添加
    
    <dependencies>
        <dependency>
            <groupId>com.amazonawsgroupId>
                <artifactId>DynamoDBLocalartifactId>
                <version>[1.11,2.0)version>
        dependency>
    dependencies>
    
    <repositories>
       <repository>
           <id>dynamodb-local-oregonid>
           <name>DynamoDB Local Release Repositoryname>
           <url>https://s3-us-west-2.amazonaws.com/dynamodb-local/releaseurl>
       repository>
    repositories>
 3.命令访问本地的DynamoDB

aws dynamodb list-tables –endpoint-url http://localhost:8000

 4. 使用API来访问

官方文档链接

// =============创建表=============
// (向表中添加数据可以读取json文件来填充,SDK中自带了jackson。)
public class MoviesCreateTable {
    public static void main(String[] args) throws Exception {
        // 通过客户端生成器创建客户端
        AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
            .build();
        // 通过客户端创建对象
        DynamoDB dynamoDB = new DynamoDB(client);

        // 声明表名
        String tableName = "Movies";

        try {
            // 打印操作
            System.out.println("Attempting to create table; please wait...");

            Table table = dynamoDB.createTable(tableName,
                // 声明分区键和排序键
                Arrays.asList(new KeySchemaElement("year", KeyType.HASH),                                                      
                    new KeySchemaElement("title", KeyType.RANGE)), 

                    // 声明数值的类型,S-->字符串 N-->数字
                Arrays.asList(new AttributeDefinition("year", ScalarAttributeType.N),
                    new AttributeDefinition("title", ScalarAttributeType.S)),
                new ProvisionedThroughput(10L, 10L));

            //创建
            table.waitForActive();

            //不抛异常则打印操作成功
            System.out.println("Success.  Table status: " + table.getDescription().getTableStatus());

        }
        catch (Exception e) {
            System.err.println("Unable to create table: ");
            System.err.println(e.getMessage());
        }

    }
}
 5. 将本地代码修改为DynamoDB服务
   5.1. 删除引入包

import com.amazonaws.client.builder.AwsClientBuilder ;

   5.2. 修改创建响应region的客户端

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
这样白字.withRegion(Regions.US_WEST_2)
这样白字.build();

八、附上部分表的JSON

官方示例json下载链接

{
        "year": 2013,
        "title": "Rush",
        "info": {
            "directors": ["Ron Howard"],
            "release_date": "2013-09-02T00:00:00Z",
            "rating": 8.3,
            "genres": [
                "Action",
                "Biography",
                "Drama",
                "Sport"
            ],
            "image_url": "http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg",
            "plot": "A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.",
            "rank": 2,
            "running_time_secs": 7380,
            "actors": [
                "Daniel Bruhl",
                "Chris Hemsworth",
                "Olivia Wilde"
            ]
        }
    },
    {
        "year": 2013,
        "title": "Prisoners",
        "info": {
            "directors": ["Denis Villeneuve"],
            "release_date": "2013-08-30T00:00:00Z",
            "rating": 8.2,
            "genres": [
                "Crime",
                "Drama",
                "Thriller"
            ],
            "image_url": "http://ia.media-imdb.com/images/M/MV5BMTg0NTIzMjQ1NV5BMl5BanBnXkFtZTcwNDc3MzM5OQ@@._V1_SX400_.jpg",
            "plot": "When Keller Dover's daughter and her friend go missing, he takes matters into his own hands as the police pursue multiple leads and the pressure mounts. But just how far will this desperate father go to protect his family?",
            "rank": 3,
            "running_time_secs": 9180,
            "actors": [
                "Hugh Jackman",
                "Jake Gyllenhaal",
                "Viola Davis"
            ]
        }
    },
    {
        "year": 2013,
        "title": "The Hunger Games: Catching Fire",
        "info": {
            "directors": ["Francis Lawrence"],
            "release_date": "2013-11-11T00:00:00Z",
            "genres": [
                "Action",
                "Adventure",
                "Sci-Fi",
                "Thriller"
            ],
            "image_url": "http://ia.media-imdb.com/images/M/MV5BMTAyMjQ3OTAxMzNeQTJeQWpwZ15BbWU4MDU0NzA1MzAx._V1_SX400_.jpg",
            "plot": "Katniss Everdeen and Peeta Mellark become targets of the Capitol after their victory in the 74th Hunger Games sparks a rebellion in the Districts of Panem.",
            "rank": 4,
            "running_time_secs": 8760,
            "actors": [
                "Jennifer Lawrence",
                "Josh Hutcherson",
                "Liam Hemsworth"
            ]
        }
    },
    {
        "year": 2013,
        "title": "Thor: The Dark World",
        "info": {
            "directors": ["Alan Taylor"],
            "release_date": "2013-10-30T00:00:00Z",
            "genres": [
                "Action",
                "Adventure",
                "Fantasy"
            ],
            "image_url": "http://ia.media-imdb.com/images/M/MV5BMTQyNzAwOTUxOF5BMl5BanBnXkFtZTcwMTE0OTc5OQ@@._V1_SX400_.jpg",
            "plot": "Faced with an enemy that even Odin and Asgard cannot withstand, Thor must embark on his most perilous and personal journey yet, one that will reunite him with Jane Foster and force him to sacrifice everything to save us all.",
            "rank": 5,
            "actors": [
                "Chris Hemsworth",
                "Natalie Portman",
                "Tom Hiddleston"
            ]
        }
    }

你可能感兴趣的:(aws)