第49夜 DynamoDBの高レベルAPIを試す

DynamoDBはSimpleDBとほぼ同様の使い勝手の低レベルAPIのほかに高レベルAPIが最初から用意されているのがポイントだ。

低レベルAPIについては前回紹介済みなのでそちらを参照。
http://d.hatena.ne.jp/shin/20120125/p1


高レベルAPIはEntityのマッピングがある。

構成は前回と同様。
テーブル名は「testdb」主キーは「id」という項目名で数値型。もうひとつが「名前」という文字列型。

マッピングクラス

マッピングするクラス。プロパティ名が項目名と同一の場合ゲッターに対してのアノテーション付与は必要ない。ただし、キーの設定だけは保存時などに必要。フィールドに対しては効果がないので注意。いまどきのフレームワークは大抵フィールドでも動くからね。

@DynamoDBTable(tableName="testdb")
public class TestDBEntity {
    int id;
    String 名前;

    @DynamoDBHashKey
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String get名前() {
        return 名前;
    }

    public void set名前(String 名前) {
        this.名前 = 名前;
    }
}

接続

接続までは前回と同じ。ただし、接続先は東京リージョンを指定してみた。

String access_key = "hogehoge";
String secret_keykey = "hugahuga";

BasicAWSCredentials ac = new BasicAWSCredentials(access_key, secret_keykey);
AmazonDynamoDBClient client = new AmazonDynamoDBClient(ac);

//リージョン指定
client.setEndpoint("dynamodb.ap-northeast-1.amazonaws.com");

ID指定で検索

非常にシンプル。

TestDBEntity e = mapper.load(TestDBEntity.class, 100);
System.out.println(e.getId() + "=" + e.get名前());

条件指定検索

この場合は条件なしにしているので全件取得しているけど、scanに対して検索条件の指定が可能だ。

DynamoDBMapper mapper = new DynamoDBMapper(client);

DynamoDBScanExpression scan = new DynamoDBScanExpression();
List<TestDBEntity> result = mapper.scan(TestDBEntity.class, scan);

for(TestDBEntity row : result){
    System.out.println(row.getId() + "=" + row.get名前());
}

新規追加、または更新

同じキーがあれば上書き、なければ新規追加する。

TestDBEntity e = new TestDBEntity();
e.setId(100);
e.set名前("なまえ");
mapper.save(e);

削除

キーしか見ていないようなのでnewしてキーを設定後deleteメソッド呼び出すだけ。EntityをいったんDBから取得とかする必要なし。

TestDBEntity e = new TestDBEntity();
e.setId(100);
mapper.delete(e);


といったことが標準のSDKだけでできるのでDynamoDBは非常に手軽に触ることが出来るのがわかると思う。

ほかにもSimpleDBと同様に楽観的排他制御は出来るので大抵のソーシャルアプリ等では問題なく使えるだろう。

ほしい性能のDBを具体的な数字を提示して即座に用意、容量無制限。使い方もシンプル。すばらしい。