Amazon SimpleDBのJava版データマッパーを作り始めました。
MavenのオレオレリポジトリをS3に作ってありますんで、ちょっと試してみたい方はpom.xmlに以下を追加してください。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<repositories>
<repository>
<id>dateofrock</id>
<url>https://s3-ap-northeast-1.amazonaws.com/dateofrock-repository/maven/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.dateofrock.aws</groupId>
<artifactId>simpledb-mapper</artifactId>
<version>0.6-SNAPSHOT</version>
</dependency>
</dependencies>
なにそれ?
HibernateとかS2JDBCとか世の中に沢山あるORM的なもので、データストアをSimpleDBに特化させたものです。APIはJPAに準拠しているわけでも何でもなく、オレオレAPIです。
たとえば、
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package model;
import java.util.Date;
import java.util.Set;
import com.dateofrock.simpledbmapper.SimpleDBAttribute;
import com.dateofrock.simpledbmapper.SimpleDBBlob;
import com.dateofrock.simpledbmapper.SimpleDBEntity;
import com.dateofrock.simpledbmapper.SimpleDBItemName;
import com.dateofrock.simpledbmapper.SimpleDBVersionAttribute;
/**
* テスト用モデル
*/
@SimpleDBEntity(
domainName = "SimpleDBMapper-Book-Testing",
s3BucketName = "simpledbmapper-book-testing",
s3KeyPrefix = "simpledb-blob/")
public class Book {
@SimpleDBItemName
public Long id;
@SimpleDBAttribute(attributeName = "title")
public String title;
@SimpleDBAttribute(attributeName = "isbn")
public String isbn;
@SimpleDBAttribute(attributeName = "authors")
public Set<String> authors;
@SimpleDBAttribute(attributeName = "publishedAt")
public Date publishedAt;
@SimpleDBAttribute(attributeName = "price")
public Integer price;
@SimpleDBAttribute(attributeName = "height")
public Float height;
@SimpleDBAttribute(attributeName = "width")
public Float width;
@SimpleDBAttribute(attributeName = "available")
public boolean available;
@SimpleDBBlob(attributeName = "review", contentType = "text/plain")
public String review;
@SimpleDBBlob(attributeName = "coverImage", contentType = "image/jpeg")
public byte[] coverImage;
@SimpleDBVersionAttribute
public Long version;
}
があったとして、こんなかんじです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Book book = new Book();
book.id = 123L;
book.title = "スベらないプレゼン";
book.authors = new HashSet<String>();
book.authors.add("恥 忍");
book.authors.add("恥 晒");
book.price = 480;
book.publishedAt = toDate("2015-3-10 00:00:00");
book.isbn = "0987654321";
book.width = 18.2f;
book.height = 23.0f;
book.available = false;
book.review = readUTF8String("/book2.review.txt"); //大きなテキストなど
book.coverImage = readBytes("/book2.cover.jpg"); //JPEG画像など
AWSCredentials cred = new BasicAWSCredentials(accessKey, secretKey);;
AmazonSimpleDB sdb = new AmazonSimpleDBClient(cred);
sdb.setEndpoint("sdb.ap-northeast-1.amazonaws.com"); //東京リージョン
AmazonS3 s3 = new AmazonS3Client(cred);
SimpleDBMapper mapper = new SimpleDBMapper(sdb, s3);
mapper.save(book);
book.title = "スベりまくるプレゼン";
mapper.save(book);
mapper.delete(book);
なぜそんなものを作ったのか?
Ruby版のSDKには、SimpleDBをデータストアにしたActiveRecordがあるんです。
これは結構ステキですね〜。
そして、最近発表になったDynamoDBでは、なんとJava版SDK内にデータマッパーを持っています。
これもかなりステキですね〜。
そんな中で、AWSの(把握しきれないくらい)数あるサービスの中でも、とりわけシンプルシリーズ(SimpleDB/S3/SQS/SNS/SES)大好き人間からみると、どうもSimpleDBのAPIが全然シンプルじゃないww
かといって、JavaのSimpleDBラッパーが世の中にあるのかなぁ?と探してみると、確かに
JDBC や
JPA のインターフェースに乗せたすごいものがありますけど、ちょっとそれはオーバースペック(というか、そういうインターフェースに無理矢理マッチさせている感が苦手…)なので、恥を忍んで書いた次第です。APIは
DynamoDBのデータマッパー を
パクって 参考にしました。
追伸
ちなみにJavaを書いたのは結構久しぶりだったので、アノテーションってどうやって定義するの?とか、そういうレベルでした(←JavaSE5から取り残されている人)
でも、リフレクションAPIをいじりだしたら異常にメンドクサイのは確かなんだけど、何だろう?この開放感はww
基本的に自分のために作っているライブラリで、まだまだ機能不足やら不具合があります。正直テストもマトモに書いていませんので、ご利用はAt your own riskでおねげーします。
さらに追伸
すでにこういうスバラシイものがありました。もっと早く気がつけば良かったよ…