なぜ、今、Javaなのか。
だって、Javaって、すごく嫌われてるから。こんなに嫌われてると、そばに居てあげたくなるじゃないですか。
ということで、あらためて、JPAのおさらいをしてみましょう。
JPA、知っていますか?JavaのObject-Relation-Mapper、簡単にデータベースに接続する規格、仕組みですね。
ここでは、Githubに載せたサンプルコードの解説をすることでJPAの使い方をおさらいしてみます。
使うもの
JPAは規格で、その規格に則って作られているアプリケーションはいくつかあります。今回はEclipseLinkを使います。
また、DBには簡単に使えてサンプルコードに同梱できるH2を使います。EclipseLink自体はたくさんのDBに対応しているので、他のDBを使いたい方は読み替えて下さい。
あと、J2EEアプリケーションサーバはは使いません。ただのJava(J2SE)で動かします。そのほうがテスト性がいいですからね。
開発環境にはEclipseを使います。
まとめると、使うものは、
- EclipseLink
- H2
- Java
- Eclipse
です。EclipseLinkとH2はサンプルに同梱されているので、セットアップの必要はありません。
サンプルを動かしてみる。
Githubにサンプルを置きました。
動かしたい場合は、Eclipseで落として、プロジェクトとしてインポートして下さい。インポート手順はこちらを参考にしてください。
サンプルの説明
必要なJar
最小限でEclipseLinkを動かすために必要なJarファイルは、ここにある、
eclipselink.jarとjavax.persistence_2.1.0.v201304241213.jarです。サンプルではH2を使うので、h2-1.4.178.jarも入れてあります。
設定ファイル(persistence.xml)
DBへの接続情報をXMLで記述します。
動作環境により設定すべきはL9〜L12のDBへの接続情報のみです。あとはそのまま使えます。
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:file:./db/myH2.db" />
<property name="javax.persistence.jdbc.user" value="test" />
<property name="javax.persistence.jdbc.password" value="test" />
persistence.xmlは、ClassPathが通ったフォルダやJarファイル内のMETA-INFフォルダに配置する必要があります。
これだけで設定完了。簡単ですね。
ソース
MyEntityクラスが、DBのテーブルとマッピングされるクラスです。@Entityをクラスのアノテーションに付与すれば、DBとマッピングされます。簡単。
MainクラスでDBへのinsertとselectを行っています。
insertは簡単。オブジェクトを作って、入れるだけです。
System.out.println("insert start");
em.getTransaction().begin();
MyEntity myEntity = new MyEntity();
myEntity.setText("This is a Test text");
myEntity.setCreatedAt(new Date());
em.persist(myEntity);
em.getTransaction().commit();
System.out.println("insert end generated id = " + myEntity.getId());
これだけで、insertがされます。
ところで、不思議な事にDDL、create文は発行てないのに、insertができちゃいますよね!?そうなのです。EclipseLinkが自動で作ってくれるのです!強力!JPA!
対してselect文は少し複雑です。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb.createQuery(MyEntity.class);
Root<MyEntity> r = cq.from(MyEntity.class);
List<MyEntity> myEntities = em.createQuery(cq.select(r)).getResultList();
for (MyEntity myEntity : myEntities) {
System.out.println(myEntity.getId() + ":" + myEntity.getText() + ":" + new SimpleDateFormat("mm ss").format(myEntity.getCreatedAt()));
}
ここではCriteriaという仕組みでSelect文を発行しています。タイプセーフに行うためにはCriteriaを使うのが良いです。勿論、生のSQLも発行できますが、それは別の機会に。
どうだ!嫌われても強力だ!Java!JPA!
え?ActiveRecordだともっとシンプルにパワフル?まぁまぁ。Javaの最大の強みは静的型付けです。いいじゃない!お硬くても!貞操を守りぬくのですよ!
今回の寄り添いはここまで。