「30万円の臨時収入があったら欲しいもの…「薄型テレビ」がダントツ」という記事を見ていたら、大画面映写機の衝動買い意欲を催した。しかし、部屋を見回してみたところ、どこにもそのようなものを置く場所が無いことに気付いた。
現在、私の部屋の収容可能容積を最も消費しているのは書籍である。大型テレビを購入するかどうかに依らず、この状態を何らかの方法で解決することは今後生活していく上で重要な案件であると思い立ち、書籍の処分を行っていくことにした。
ワインコレクタのツールとして、購入・消費した履歴を残しておくワインラベルレコーダ
というものがあるらしい。将来的に、書籍に対するワインラベルレコーダのようなものをDBを利用して構築できればよいと考えた。
ただし、今現在解決すべき問題はあくまで収容可能容積の改善である。とりあえず処分する書籍の情報が永続化するツールを手っ取り早く作り、書籍を廃棄可能な状態にすることをゴールに定めた。
手早く作成するために、以下の方針をとる。
- 永続化は、NicoBrowserで経験済みの手段、すなわち、H2 DBを使用したインプロセスDBに、JPAとしてTopLink Essentialsを用いて永続化する。
- NetBeansのプロジェクト作成ウィザードに、DBアプリのものがあったので、それを利用する。
- 永続化データは必要最小限の、ISBNデータのみにする。
- ただし、可読性の改善として、書籍名も永続化する。これはAmazonからISBNをキーにして取得できるだろう。
- ISBNを入力する時間的コストを削減するため、ハードウェア(バーコードリーダ)を用いる。
以下の記述は、上記のうち2点目の、NetBeansのウィザードを用いたDBアプリ作成手順の記録である。このウィザードを用いれば、永続化データの入力・参照用のGUIが手軽に作成できる。
簡単に済むと思っていたが、このDBアプリ作成ウィザードは既に永続化するDBテーブルが存在することが前提のようであり、今回のようにDBも新規作成する場合が考えられていないようだった。
本来、このような場合はウィザードで「Javaアプリケーション」を選択すべきだろう。実際、Nicobrowserはそちらで作成した。しかし、DBアプリ作成ウィザードの方が永続化データとJTableのバインディングが手軽そうなので、今回はこのメリットを享受することを選んだ。
手順としては大きく「インプロセスDBの作成」「DBアプリ作成」の2つになる。
インプロセスDBの作成
インプロセスDB作成用のダミープロジェクトを作成する。「新規プロジェクト」から「Javaアプリケーション」を選択し、適当な名前を付けたプロジェクトを作成する。
ライブラリフォルダのコンテキストメニュー「新規」>「ライブラリの追加...」から、インプロセスDBとJPAを追加する(事前にライブラリの作成が必要)。今回はNicoBrowserで設定したものを使い回し、DBにH2、JPAにTopLink Essentialsを利用する。
「新規」>「エンティティークラス」を選択し、永続化するエンティティクラスを作成する。今回は"Book"という名前にした。この操作を行うことで、Book.javaファイルが生成される。
Book.javaを開き、以下の修正を行う。なお、今回永続化するのは「書籍バーコード(上段); upperCode」「書籍バーコード(下段); lowerCode」「書籍名; name」の3種で、書籍バーコード(上段)をプライマリキーとすることにした。
- ID自動生成を止めるために@GeneratedValue...の行をコメントアウト。
- IDの変数名をidからupperCodeに変更。これは変数名"id"を選択した状態でCtrl+Rキーを押すことで一括置換できる。
- その他の属性lowerCode, nameを追加。
- setter, getterを追加。これは、Ctrl+Insertキーを押した後「取得メソッド及び設定メソッド...」を選択することで自動生成できる。
- 元々存在していたsetId, getIdメソッドを削除。
以上の編集を行ったBook.javaは下記の通りとなる。
@Entity
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
@Id
// @GeneratedValue(strategy = GenerationType.AUTO)
private String upperCode;
private String lowerCode;
private String name;
public String getLowerCode() {
return lowerCode;
}
public void setLowerCode(String lowerCode) {
this.lowerCode = lowerCode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUpperCode() {
return upperCode;
}
public void setUpperCode(String upperCode) {
this.upperCode = upperCode;
}
(以下略)
エンティティクラスの生成と同様の手順で、「新規」>「持続性ユニット...」を選択し、持続性ユニットを生成する。設定した値は以下の通り。
持続性ユニット名 | デフォルトのまま(BookDBPU) |
持続性ライブラリ | 追加したJPAライブラリを指定 |
データベース接続 | 「データベースの新規接続...」を指定 |
ここで、「データベースの新規接続...」を選択すると、接続するDB情報の入力を求められる。これに対して、次のように入力する。
名前 | org.h2.Driver |
基本設定:ドライバ | org.h2.Driver |
基本設定:データベースのURL | jdbc:h2:db/BOOK |
基本設定:ユーザ名 | sa |
基本設定:パスワード | (未入力) |
詳細:スキーマを選択 | PUBLIC |
「データベースのURL」で、dbフォルダ以下にBOOKという名前のDBを作成することを指定している。
META-INFフォルダの下にpersistence.xmlが生成される。これを開き、「含めるエンティティークラス」にBookが含まれていることを確認する。含まれていなければ手動で追加する。
DBの実体を生成する。Main.javaを下記の通りとし、プロジェクトの実行を行うことで、dbフォルダとそのフォルダ以下にDBができる。
public class Main {
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("BookDBPU");
EntityManager manager = factory.createEntityManager();
manager.close();
factory.close();
}
}
このdbフォルダが、今回使用するDBである。このフォルダを適当な場所へ移動、リネームする。今回はフォルダ名をBOOKにリネームし、F:\data\DBディレクトリに置いた。
これでこのプロジェクトの役目は終わりであり、削除してしまって問題ない。
DBアプリ作成
「ファイル」>「新規プロジェクト...」を選択し、「Javaデスクトップアプリケーション」を選択する。
次のステップでは「データベースアプリケーション」を選択する。
DBの設定は、先のプロジェクトと同様に設定する。ただし、「データベース接続」設定での「データベースのURL」は絶対パスで指定する。今回は前述の通りF:\data\DB\BOOKディレクトリにBOOKデータベースをコピーしたのでjdbc:h2:F:\data\DB\BOOK\BOOKとなる。
ウィザードを進め、完了すればプロトタイプの完成である。このGUIから、DB永続化の実行と、永続化されたデータの参照が行える。
次回は、入力サポート機能を追加する。
最近のコメント