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

外部結合 応用編2

引き続き結合についてです。 Contents1 1対Nの結合に関して2 完全外部結合3 差集合(class_aだけに存在するものとclass_bだけに存在するもの)3.1 class_aのみ3.2 c …

no image

Streamについて

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

no image

char→String変換

Javaでアルファベット小文字全て、大文字全てが入った配列を作成する場合、PHPのrangeのように一気に作る方法はありません。 まあ、コツコツ入力していけばいいのですが、それでは芸がないので、文字コ …

no image

jenkins構築

いままでjenkinsについての記事を書いていなかったので記録しておこうと思います。 Contents1 jenkins構築2 設定ファイル変更(ポート&URL変更)3 セキュリティ有効化 jenki …

no image

リフレクション

前回のエントリーでは動的にクラスを使いまわす方法について書いたのですが、同様にリフレクション(動的にインスタンスを生成する方法)という技術についても学びました。 社長いわく黒魔術みたいなものといってい …