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

サロゲートキーに関して

テーブル設計に関してのメモ。 テーブルを作る時にid int not null auto_increment primary keyを自動的に作ることが多いと思いますが、サロゲートキーといい、グレーノ …

no image

SQL case式やウィンドウ関数の威力

プログラマには「プログラムは思った通りに動かない。書いた通りに動く。」「バグではない仕様です」なんて面白い格言がいろいろありますが、データベースの世界にも「WHERE句で条件分岐させるのは素人のやるこ …

no image

SQL基礎 case&groupbyの活用について

主に集計タイプの計算で大活躍するgroupbyについて。 主な用途は集計とカット。特にcase式と連動した集計はかなり使える 例 nameとageで構成されたテーブルがあるとして、年代ごとの人数を出し …

no image

MySQLのセキュアな設定

以前SSHの設定についていろいろ書いたんで今回はMySQLに関して。 Contents1 基本的な処方箋(MySQLに限らないかも)2 ホストのアクセスを制限する3 LOCAL INFILEコマンドを …

no image

テストのダミーデータ作成

データベースに大量のデータを作りたいときにいつもあああやhoge,aaaですとデータという感じがしないですし、抽出や集計ができません。 なるべく自然に近いデータが欲しいのですが、簡単に作れる方法があり …