LoginSignup
53
59

More than 5 years have passed since last update.

毛嫌いされる今だからこそ、Java! --- JPA編 ----

Last updated at Posted at 2014-05-23

なぜ、今、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への接続情報のみです。あとはそのまま使えます。

persistence.xml(抜粋)
<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は簡単。オブジェクトを作って、入れるだけです。

Mainクラス(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文は少し複雑です。

Mainクラス(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の最大の強みは静的型付けです。いいじゃない!お硬くても!貞操を守りぬくのですよ!

今回の寄り添いはここまで。

53
59
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
53
59