MyBatisでO/Rマッピング [プログラミング]
前置き
MyBatisは他のO/Rマッピングフレームワークとは違って、SQLとオブジェクトをマッピングする。
SQLをXMLファイルで別途定義できるので、実装が分担しやすく管理が容易になる。
以前のCRUD図作成アプリも、
この特性を利用して動作している。
今回は、手順が多い。が、ほとんどが事前準備で、実際はMapperインタフェースと、それに紐づけるXMLファイルがメイン。
本来であれば、Spring FrameworkなどのDIフレームワークと組み合わせて使用するのが一般的。
DIすると、SQLにMapperインタフェースを直接紐づけることができ、かなり便利になる。
今回実装するのは、以前のSQLを、
TableViewで表示するだけの簡単なプログラムで、SELECT文のみ使用する。
もう少し実務寄りな実装は、MyBatis公式で
確認すると良い。という元も子もない事を言っちゃう。
ポイント
- MariaDBでCREATE TABLE時にCHARSETを指定する
- @Mapperを付与したマッパーインタフェースを実装する
- 取得ボタンはデータクラスのListで結果を取得する
- 集計ボタンはMapのListで結果を取得する
- 集計ボタンはSeq列を表示しない
- NULLからデータのマッピングはできないので代替値を取得する
- SqlSessionはCloseするまでトランザクションが終了しない
実装
pom.xmlにMyBatisと、JDBC(今回は、Maria DB)を追加する。pom.xml
mybatis-config.xmlを作成し、接続情報とマッピング情報を定義する。
mybatis-config.xml
FXDemo.fxml
FXDemo.kt
mybatis-config.xml
データ準備
構成
実行結果
取得ボタン押下集計ボタン押下
CRUD図作成アプリを創る(5/5) [プログラミング]
前置き
さて、今回でいよいよ最終回。
前回までにメインの処理は完成しているので、後はGUIアプリに昇華させるだけ。
インプットに必要な情報を指定するだけのシンプルな作りにしている。
画面詳細
- SQLディレクトリを選択する
- ディレクトリ内のファイルのみ対象とする
- 定義ブックを選択する
- Excelブック(*.xlsx)のみ指定可能
- 機能一覧シートの定義が必要
- テーブル一覧シートの定義が必要
- CRUD図作成処理を実行する
- SQLディレクトリと定義ブックを両方選択していない場合は処理中断
- 出力ファイルはExcelブック(*.xlsx)のみ指定可能
- CRUD図作成処理を実行
- CRUD図の作成に成功
- メッセージを出力し処理終了
- コンソールに処理結果を出力
- CRUD図の作成に失敗
- メッセージを出力し処理終了
実装
CrudMaker.fxmlCrudMaker.kt
実行結果
GUIイメージ
CRUD図イメージ(作成直後)
CRUD図イメージ(レイアウト調整後)
CRUD図作成アプリを創る(4/5) [プログラミング]
前置き
前回までに取得してきた各種情報をベースに、CRUD図をExcelブックに書き込んでいくメソッドを実装する。
このメソッドの実装次第でCRUD図のレイアウトが決まる。
今回は、横軸に機能、縦軸にテーブルをプロットしてみた。
また、値のプロットしかしていないので、後で書式やレイアウトの調整は必要。
処理詳細
- 引数に機能一覧Mapとテーブル一覧MapとCRUD情報Map、出力ファイルを指定する
- ブックを作成
- シートを"crud_yy-MM-dd"で作成
- 1行目にヘッダ行を作成
- 機能毎の列INDEX用のMapを作成する(列INDEX用Map)
- CRUD情報MapをベースにキーSet(機能ID)を読み込む
- 列INDEX用Mapに機能IDとINDEXをセットする
- ヘッダ行に機能IDと機能名のセルを追加する
- テーブル一覧Mapを読み込む
- テーブル毎に1行作成する
- 1列目にテーブルIDとテーブル名のセルを作成する
- CRUD情報Mapを機能毎に読み込む
- CRUD情報にテーブルIDが含まれるか判定する
- 対応したSQL操作を追加する
- 列INDEX用Mapをベースに対象機能の列にCRUDセルを作成する
- 出力ファイルに作成したブック情報を書き込む
実装
CRUD図作成アプリを創る(3/5) [プログラミング]
前置き
今回は、前回までの処理で取得した機能ID毎のファイルリストをベースに、
機能毎のCRUD情報を取得するメソッドを実装する。
ポイントはテーブルIDやSQL操作の判定に正規表現を利用していること。
今回実装するメソッドでは、正規表現の基礎知識が必要になる。
自分は正規表現に関わる全ての知識を
【詳説 正規表現 第3版】
で得た。
正規表現は、LinuxのGrepや一般的なテキストエディタでも採用されている汎用性の高い技術で、自分の中では、ある程度扱えるようになった後は、人生がイージーモードに変わったレベル。
難易度が低い、使用可能シーンが多い、即効性が高い、など非常に費用対効果が高いのだが、意外と軽視されがちなので、競争優位性も高いという、非の打ち所がない技術なので、非常におすすめ。
処理詳細
- 引数にSQLファイル一覧Mapを指定する
- テーブルIDの正規表現を定義する(テーブルIDReg)
- SQL操作の正規表現を定義する(SQL操作Reg)
- 戻り値用のMapを作成する
- SQLファイル一覧Mapを1機能ずつ読み込む
- SQL操作毎にテーブルID用のSetを定義する
- 機能に対応するSQLファイルを読み込む
- 1行ずつ処理を実行していく
- SQL操作Regに合致する行を判定する
- テーブルIDRegに合致するテーブルIDを取得する
- 取得したテーブルIDを対応するSQL操作Setに追加する
- 各SQL操作SetでCRUD情報を初期化する
- 戻り値用Mapに機能IDとCRUD情報をセットする
- 戻り値用Mapを呼び出し元に返却する
実装
CRUD図作成アプリを創る(2/5) [プログラミング]
前置き
今回は機能・テーブル一覧ブックを読み込むメソッドと、機能IDのリストをベースに
SQLファイルの一覧を取得するメソッドを実装する。
ポイントは機能・テーブル一覧ブックを読み込む際にヘッダ行をスキップしている所くらい。
処理詳細
機能・テーブル一覧ブック読み込みメソッド
- 引数に定義ブックとシート名を指定する
- 戻り値用のMapを作成する
- 定義ブックから対象シートを取得する
- 対象シートを最終行まで1行ずつ読み込む
- ヘッダ行は読み飛ばす
- 戻り値用MapにIDと名称をセットする
- 戻り値用Mapを呼び出し元に返却する
SQLファイルの一覧取得メソッド
- 引数に機能一覧MapのキーSetとSQLディレクトリを指定する
- 戻り値用のMapを作成する
- SQLディレクトリからファイルリストを取得する(再帰読み込みなし)
- ファイルリストから1ファイルずつ読み込む
- 機能一覧キーSetから機能IDを読み込む
- ファイル名が機能IDから始まるかを判定する
- 見つかった場合は戻り値用Mapに機能IDとファイルをセットする
- 戻り値用Mapを呼び出し元に返却する
実装
CRUD図作成アプリを創る(1/5) [プログラミング]
前置き
前回のCRUD図を実務で作成するとなると、機能数やテーブル数が膨大になり、
開発スタート時から作成していない場合などは、とてもじゃないけど手作業で作成するのが困難になる。
そこで、今回から5回に分けて、CRUD図を自動生成するアプリケーションを作成していく。
前提条件
- 機能はIDと機能名で構成されていること
- テーブルはIDとテーブル名で構成されていること
- テーブルのIDは命名規約に従って付与されていること
- SQLファイルは機能IDで始まるファイルで管理されていること
- SQLはツールなどでフォーマットされていること(1行はムリ)
設計
- SQLファイル格納ディレクトリを選択する
- 再帰的なディレクトリの読み込みはしない
- 機能・テーブル一覧ブックを選択する
- Excelブック(*.xlsx)のみ選択可能とする
- 機能とテーブルの一覧の作成について
- Excelブックにシートを分けて定義する
- 機能は”機能一覧”というシートに定義する
- テーブルは”テーブル一覧”というシートに定義する
- それぞれの一覧は1列目にID、2列目に名称を定義する
- それぞれの一覧の1行目にヘッダを定義する
- CRUD作成処理
- SQLディレクトリが選択されていない場合は処理を中断する
- 機能・テーブル一覧ブックが選択されていない場合は処理を中断する
- ファイル保存ダイアログで出力ファイルを指定する
- Excelブック(*.xlsx)のみ指定可能とする
- キャンセルした場合は処理を中断する
- 機能一覧を読み込みMapを作成する
- 機能IDをKEYとする
- 機能名をVALUEとする
- テーブル一覧を読み込みMapを作成する
- テーブルIDをKEYとする
- テーブル名をVALUEとする
- 機能一覧MapをベースにSQLファイルのMapを作成する
- 機能IDをKEYとする
- SQLファイルをVALUEとする
- SQLファイルMapをベースに機能毎のCRUD情報のMapを作成する
- 機能IDをKEYとする
- CRUD情報をVALUEとする
- CRUD情報の定義は以下とする
- CRUDそれぞれに対応するSetを作成する
- CRUDのSetにはテーブルIDをセットする
- 各種情報をベースに出力ファイルにCRUD図を書き込む
- 出力結果をコンソールに出力する
Javaでパスワード付きのExcelファイルを開く [プログラミング]
前置き
前回
のプログラムではパスワード付きのExcelについては考慮されていなかった。
WorkbookFactory.create(java.io.File file, java.lang.String password)で、
ワークブック生成時の引数にパスワードを指定することで開くことができる。
ちなみに、パスワード付きじゃないExcelにパスワードを指定して生成しても普通に開けるっぽい。
実装
FXDemo.fxmlFXDemo.java
実行結果
Javaでファイルの暗号化と復号をしてみる [プログラミング]
前置き
共通鍵でファイル暗号化と復号を実装する。
仕様は下記の通り
- アプリケーション起動時に暗号キーを生成
- keygenファイルがある場合は同ファイルからキーを生成
- keygenファイルがない場合は新たにキーを生成してkeygenファイルに保存する
- ファイルを選択する
- 暗号化ボタンで選択ファイルを暗号化
- 選択ファイルと同じ場所にencディレクトリを作成する
- encディレクトリ内に暗号化ファイルを.datで保存する
- 復号ボタンで選択ファイルを復号
- 選択ファイルが暗号ファイルではない場合は何もしない
- 選択ファイルと同じ場所に復号ファイルを保存
- MD5ボタンでハッシュ値を生成
ポイント
セキュリティキーについて
KeyGenerator.generateKey()は生成する度に異なるキーが生成される。
前述のことから、そのまま実装するとアプリケーションの起動毎に異なるキーが生成されてしまい、
初回で暗号化したファイルを、2回目以降に起動したアプリケーションから復号を試みても、エラーが発生してしまう。
なので、同じ生成キーで暗号化と復号をしたい場合は、生成キーを保管する必要がある。
SecretKeyはシリアライズされているので、生成キーはファイル保存しておくことが可能。
今回は、keygenという名前のファイルでセキュリティキーを管理している。
ハッシュ値について
ハッシュ値は改ざん検知のために利用されることが非常にしばしばある。
MD5の他にもSHAなどのアルゴリズムが用意されており、ダウンロードサイトにファイルのハッシュ値が添えられていることがあり、
ダウンロード後にダウンロードファイルのハッシュ値を生成して、改ざんを検知するために利用されている。
今回は、暗号化と復号の前後でハッシュ値を生成して比較する事によって、同じファイルが復号できていることを確認できるようになっている。
また、ハッシュ値の非可逆性を利用して、パスワードのハッシュ値を生成し、認証処理に利用されることもある。
実装
FXDemo.fxmlFXDemo.java
実行結果
GSonを使いJSONのシリアライズとデシリアライズをするプログラムをJavaで創る [プログラミング]
やりたいこと
JSONでシリアライズとデシリアライズをしたい実装
pom.xmlJsonDemo.java
実行結果
Lombokを使いデータクラスをJavaで創る [プログラミング]
やりたいこと
Getter, Setterを作るのが面倒くさい。。。Kotlinみたいに、データクラスの作成で楽がしたい。
使い方と、余談
IntelliJとかだと、コード補完でgetXXXやsetXXXが出てこないので、プラグインのインストールが必要っぽい。
設定 > プラグイン > "lombok"で検索 > Lombokプラグインをインストール
他のIDEでも、プラグインが必要になると思う。多分。知らんけど。。。
クラスに@Dataアノテーションを付与すると、データクラスとなりフィールドの定義だけで Getter、Setterが勝手に作成される。(実装不要)
今からJVM言語の学習を始めるなら、JavaよりもKotlinがお勧め。
そもそもLombokも使う必要がないし、型推論や、データクラス定義の標準装備など、モダン言語は生産性が爆上がりw
Javaにもバージョンによっては型推論があるけど、どうせIDEにプラグインが必要になるだろうし、色々と面倒くさい。(未検証)
実装
pom.xmlLombokDemo.java