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

Streamについて

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

no image

SQL基礎 条件式はunionよりもcaseで

複雑な条件式があったときにcase式を使うことでパフォーマンスを向上させることができます。 ※一般にunionを使うよりも高速なことが多い。 例1 ある条件により別の列を使いたいとき、 [crayon …

no image

Javaでの文字コード判定、変換

Javaにて文字コード判定の処理を書きます。 Contents1 通常の文字コードの判定、変換2 ファイルの文字コード判定、変換2.1 juniversalchardet2.1.1 ダウンロード2.1 …

no image

サブクエリの使い方

以前も少し学習しましたが、今回からはサブクエリの扱い方です。特に異なった行の比較(年度計算など)に関して行われる自己結合をつかったものが非常に強力です。 例によってここを学習しています。 下記のような …

no image

JSPでのインクルード

JSPで社内アプリを作る機会があったので、メモ。 基本的なこともまだわかっていないんですが、とりあえずでてきたものから紹介してきます。 インクルードから。 ヘッダー、フッターみたいな別々に分けたりする …

アーカイブ