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

SQL問題

今までやったSQL問題などのまとめ。定期的にやる予定です・・ 自分用なのでテーブルデータとかあったりなかったりいい加減です(汗) SQLドリル 問題1 nameとageで構成されたテーブルがあるとして …

no image

自己結合に関して

以前もこのエントリーで学習しましたが、SQLの結合では自己結合という考え方があります。 下記のようなテーブルProductsがあるとします。 name | price ——&# …

no image

HAVING句の活用 発展編

今回からはまたまたHAVING句です。 下記のようなテーブル(teams)があり、全員が待機状態のチーム(全員がそろっている)を求めます。 member | team_id | status &#82 …

no image

リレーションを含んだテーブルでの副問い合わせ

本日はSQLネタです。 下記のようなテーブル構成があったときとします。 注文ヘッダと注文詳細は(1:N)とします。 ここで、product_id=5を含んだ注文ヘッダーレコードを取り出したいとします。 …

no image

浮動小数点に関して

金額計算なんかでfloatを使うと誤差が出るっていうのは基礎的な話ではありますが、背景知識を含めて理解しておこうと思ったのでメモります。 Contents1 float,doubleでの誤差2 金額の …

アーカイブ