skillup

技術ブログ

Database Java

JPAを使用する  JavaSE編

投稿日:

現在の開発ではデータベースへの接続ではJPAを使っています。このJPAがなかなか曲者でいろいろと詰まることがありましたので解説させていただきます。

JPAとは?

定義を検索するとネットでも様々な定義がでてきますね。ほとんどが厳密な理解を求めるので理解をするのが難しいですね。(汗)

厳密な理解でなくてもいいので「とりあえず使える」というレベルにまでいくために必要な理解を書かせていただきます。まとめると下記が要点です。

  • リレーショナルデータベースを扱うJavaSEおよびJavaEEのフレームワーク
  • Javaのテーブルをエンティティというクラスで扱う(1テーブル、1エンティティ)
  • エンティティを操作するためにエンティティマネージャーというクラスを使う
  • 設定ファイルをpersistence.xmlという設定ファイルで定義する

メリット

  • Javaのクラスをそのままテーブルとして使えるため、SQLを書かなくて良い(JPQLというSQLににたJava用のSQLがあり、かけないわけではありません。)
  • 上記のため、DBによる仕様の差異を吸収できる

などがあげられます。

デメリット

  • 学習コストが高い
    (ネットをみてもそれほど情報がでてるわけではないので大変です。)
  • 既存のDBを書き換えるときに特に不便
    (新規ならばいいですが、既存の場合、JPQLの限界などもあり、完全に移行するのが難しいと思います。)

ざっとこんな感じでしょうか。はまりポイントが結構あったりしてすすまなくなるときが怖いですね・・・

実サンプル

とりあえず1テーブルの簡単なときにどのように書くかを下記に記します。

構成ファイル&開発環境

Controller.java
ProductDB.java(これがいわゆるエンティティマネージャーになります。)
Product.java(これがエンティティです。)
Database :MySQL5.6
IDE:Netbeans8.0.2

DBの作成

まずMySQLでDBを定義しましょう。実はJPAからテーブルを作成することもできますが、こちらのほうがスムーズかと思います。

persistence.xmlの作成

ここでpersistence.xmlつまりDBとの接続情報を作成します。

Netbeansを使っていれば

プロジェクトフォルダで右クリック→新規ファイル→持続性ユニットを選びます。

ウィザードが開きますので

「データベース接続」で「データベースの新規接続」を選びます。(これ以外はディフォルトでいいと思います。)

ここでドライバをMySQLにし、設定情報を入力する画面になりますので

ホストやポートデータベース名、ユーザー名、パスワードをいれましょう。

この時点で「接続をテスト」のボタンで接続が確認できます。

persistence.xml ユーザー名/パスワードはroot/なしです。

エンティティの作成

プロジェクトフォルダで右クリック→新規ファイル→持続性→データベースからのエンティティクラス
でウィザードの通りに選んでいけば作成できます。
最初のうちは設定は全てディフォルトでいきましょう。

Product.java

エンティティマネージャーの作成

あとは実際にエンティティを操作するエンティティマネージャーにメソッドをかいてあげればOKです。

とりあえず新規作成と全件選択だけかいてあげましょう。

ProductDB.java

あとはContollerでProductDBをインスタンス生成し、createやgetAllを呼び出します。
特にcreateですが、引数がProductになっていることに注意しましょう。
エンティティをインスタンスしてその中に値をセットし、エンティティマネージャーの処理を走らせます。

自分は最初JavaEEから入りましたが、JavaEEだと

  • エンティティマネージェーのインスタンス生成は不要
  • トランザクションの処理自体不要

なんですが、JavaSEで使う場合にはこちらで書いてあげないといけません。ここがはまりポイントでしたね・・・

-Database, Java
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

JPQLでの算術関数

複雑なJPQLを書いていると、通常のレコードの取り出しだけではなく、合計(SUM)や算出(COUNT)などのいわゆる算術関数を使うことが一般的です。 JPQLでもこれらを通常通り扱うことができます。 …

no image

Glassfishの暴走に関して

JavaEEのアプリケーションサーバーではglassfishを使っているんですが、 メモリをかなり食うのと、頻繁に暴走してIDEからの処理を一切受け付けなくなることが多いです。 まだまだ全然対処法がわ …

no image

ApacheCommonsのライブラリ

先日のエントリーでBeanUtilsが非常に使えるという話をしたのですが、それ以外にもApacheCommonsのライブラリには使えるものがかなりあります。 かなりあります、というかなぜ今まで使ってな …

no image

Streamについて

Java8で導入されたStreamですが、名前はしっていたものの、使い方がわからず放置していました。 これを機に調べたのですが、コレクションフレームワークの拡張のようですね。 特徴としては以下のような …

no image

配列の参照の仕方

変数が存在しているにもかかわらず値が入っていないときは、プログラミングではNULLという表記をします。(ちなみに空白が入っているのとは違います。) これはプログラマにとってはほぼ常識的な内容なのですが …