更新、削除Javaアプリケーションの作成
いったん環境さえ整えば、更新や削除のコードを書くのは簡単です。
更新アプリケーションの作成
JPAInsertStandaloneクラスで挿入したレコードを更新するためのJavaアプリケーションを作成します。作成はいつも通り、[プロジェクト]-[JPASample01]で右クリックして[新規]-[Javaクラス]を選択し、画面が表示されたら[クラス名]に「JPAUpdateStandalone」、[パッケージ]に「jp.kawakubo」と入力します。
リスト7が更新用のJavaアプリケーションです。本来であれば容量(volume)が900mlで価格(price)が1050円であったが、間違えて入力したためそれを更新する、という仮定でコーディングしています。
001:package jp.kawakubo; 002: 003:import javax.persistence.EntityManager; 004:import javax.persistence.EntityManagerFactory; 005:import javax.persistence.EntityTransaction; 006:import javax.persistence.Persistence; 007: 008:public class JPAUpdateStandalone { 009: public static void main(String[] args) { 010: // Entityマネージャファクトリを生成する 011: EntityManagerFactory entityManagerFactory 012: = Persistence.createEntityManagerFactory("JPASample01PU"); 013: // Entityマネージャを生成する 014: EntityManager entityManager = entityManagerFactory.createEntityManager(); 015: 016: // Entityトランザクションを取得し、トランザクションを開始する 017: EntityTransaction entityTransaction = entityManager.getTransaction(); 018: entityTransaction.begin(); 019: // beginとcommitの間にCRUD操作を記述する 020: // findメソッドでmeigaraテーブルよりMeigaraオブジェクトを取得する 021: // 第2引数はIdアノテーションで指定したカラムの値 022: Meigara meigara = entityManager.find(Meigara.class, 9); 023: meigara.setVolume(0.9f); 024: meigara.setPrice(1050); 025: // トランザクションをコミットする 026: entityTransaction.commit(); 027: // Entityマネージャをクローズする 028: entityManager.close(); 029: 030: } 031:}
リスト7の通り、ほとんどJPAInsertStandaloneと同じです。違うのは22から24行目のみです。
22行目で主キーが9であるレコードからMeigaraオブジェクトを取得します。値の変更は通常のPOJOオブジェクト同様setterメソッドで値を設定するだけです。SQL文がコードに混じりこまず非常に分かりやすいコーディングになっています。
実行するにはJPAUpdateStandaloneを右クリックし[ファイルを実行]を選択すると実行されます。実行後のmeigaraテーブルの内容は図6の通りです。volumeが0.90に、priceが1050に更新されているのが確認できます。
削除アプリケーションの作成
削除アプリケーションの作成も更新アプリケーションとロジックはほとんど変わりません。リスト8はJPADeleteStandaloneという名前で作成した削除アプリケーションのうち、トランザクションのbeginからcommitの間のみ抜粋したものです。削除後のmeigaraテーブルの内容は図7の通りでidが9であるレコードがなくなっているのが確認できます。
001: // findメソッドでmeigaraテーブルよりMeigaraオブジェクトを取得する 002: Meigara meigara = entityManager.find(Meigara.class, 9); 003: entityManager.remove(meigara);
2行目で削除したいレコードのEntityクラスを第1引数に、その主キーを第2引数に設定しMeigaraオブジェクトを取得しています。削除するには取得したオブジェクトをEntityマネージャのremoveメソッドの引数に設定するだけです。
おさらい
JPAはO/Rマッパーの違いを隠ぺいするためのAPIです。
JPAを使ってO/Rマッピングを行うにはJPA関連のjarファイルとJDBCドライバのjarファイルが必要です。今回はマッパーとしてGlassFish内蔵のTopLink Essentialを、データベースとしてMySQLを使用しました。また、それらのjarファイルをライブラリに追加しました。
CRUD操作を行うためにはEntityマネージャのメソッドを使用します。
- 挿入の場合、Entityマネージャのpersistメソッドを使用する
- JPQLを使用する(後編で説明)
- 更新の場合、更新したいレコードに相当するEntityクラスとその主キーを、Entityマネージャのfindメソッドの引数に設定しEntityオブジェクトを取得する。取得したEntityオブジェクトの更新したいフィールドのsetterメソッドに更新したい値を設定する
- 削除の場合、削除したいレコードに相当するEntityクラスとその主キーを、Entityマネージャのfindメソッドの引数に設定しEntityオブジェクトを取得する。取得したEntityオブジェクトをEntityマネージャのremoveメソッド引数に設定する
今回は、1テーブルに対するCRUD操作を行うための実装方法を説明しました。実際のシステムではテーブルは複雑に関連しています。複数のテーブルのCRUD操作については後編で説明します。
サンプルコード
当記事のプロジェクトのフォルダ構成は図8の通りです。persistence.xmlとソースコード、およびデータベースリストア用のsqlファイルを「サンプルコード」としてページトップに置いています。ダウンロードし解凍してご利用ください。