【第十二回】DBの登録・更新

Javaウェブアプリ開発

はじめに

DreamHanksの松下です。

前回は勤務時間登録画面の描画と、一覧の複数あるデータをサーバーに送る方法について解説しました。

今回は受け取った一覧のデータを使って、DBの勤務時間管理TBLを登録/更新処理を解説いたします。

連載記事まとめ

 

ソースコード

コントローラ

今回のメインテーマである更新・登録処理はほとんどがサービスクラスで行われます。
コントローラはビジネスロジック(サービスクラス)のメソッドを呼ぶだけで、具体的な処理は切り離すものだからです。

今回も上から順に
・ヴァリデーションチェック
・更新/登録処理メソッド呼び出し
・出社/退社時間を生成するメソッド呼び出し
・複数のアトリビュート
・勤務時間選択画面のJSPをリターン

という風に構成されます。

 

サービス

サービスの大まかな流れは下記のようなフローになります。

①メンバーIDで対象の選択月の勤務時間管理Listを取得する
②今月か先月かを選択する
③勤務時間管理List分更新処理
④今月の場合は勤務時間管理List以降で実行日(システム日付)までのレコードを登録
先月の場合は勤務時間管理List以降で月末日までのレコードを登録

◆④についてもう少し詳しく説明
①で取得できた勤務時間管理List分は更新
それ以降の扱いは今月はシステム日付まで、先月は月末までを登録するということです。

①で取得できた勤務時間管理Listというのは、もうすでに登録されているレコードなので
そこに関しては更新を行う。

それ以降というのはレコード自体がないので登録を行う。
しかし、今月は実行日以降のレコードを登録する必要がない(未来の話になるから)ので、実行日まで
先月は過去の話なので、登録画面でレコードに何も入力されてなかったとしても
その入力がないことを勤務時間管理テーブルに登録します。

なかなか文章で説明すると複雑な内容なのでややこしいですが、
ご質問等ありましたら、「Q&A」掲示板で承ります。

メソッドの共通部品化をしよう!

今回の登録、更新メソッドは下記のようにメソッドの中でサービス内でしかメソッド呼び出しのできない、privateメソッドを呼び出しています。

上記のイメージのように3つのprivateメソッドを呼び出して、処理しています。
このようにメソッドをツリー構造に作ることによって、可読性が上がり何をしているメソッドなのかわかりやすくなります。

 

さらに他にもメリットがあります。
メソッドを最小限の処理で作ることで、上記のイメージのように他のメソッドからも呼び出し可能になります。

これは2度同じロジックを書く手間が省けますし、ソースコードを共通化することによって
バグが生じたときに1か所を修正するだけで済みます。

 

良いコードを書くコツ
処理を最小限にして、共通部品化する。
常にロジックが共通化できるのではないかと考えながらコーディングをしてください。

 

 

共通部品化のコツ

updateOrInsertWorktimeメソッドで下記のようにmemberIdをInteger.parseInt()をして
Integer型に変えてかgetWorktimeByMemberIdの引数に渡しています。

 

memberIdはWorktimeオブジェクトでIntegerで定義されています。
もし、getWorktimeByMemberId内でStringで受け取り、それをInteger.parseInt()をするようなメソッドを作ってしまったら、他の型に対応できなくなってしまいます。

もし元のInteger型だったとしても、いちいちString型にpathingしなくてはいけなくなります。

よって元々の定義されているInteger型で受け取るほうが共通部品化として効率が良くなります。

 

1桁月の対応方法

メンバー管理IDで勤務時間管理のオブジェクトを取得するときに、対象月をLike検索します。

DBでは[01,02,03,04,05,06,07,08,09,10,11,12]というような情報が格納されています。

しかし画面で受け取った「worktimeRegistForm.getMonth()」は1桁月の場合は「9」というように格納されています。

この状態で9月を検索した場合、検索に引っ掛かりません。

そこで下記のようにString.formatをします。

「%d」は10進整数を表します。
「%02d」は最低2桁で出力し、2桁目を0埋めしたい場合の書式設定です。

 

登録・更新処理

登録・更新処理ともに、画面入力された一覧のレコードをListのオブジェクトを引数として渡されています。

updateList.get(loopCount).getStartTime()のようにListなので、getメソッドを使い、何レコード目(何日目)かを指定し、どのエンティティかを指定するgetメソッドを使うことによって
対象のレコードの対象のカラムデータに接近できます。

Worktimeのオブジェクトにsetterで詰めなおし、登録か更新かを行います。

 

最後に

次回はセッションを使いログイン情報をサーバーで保持する方法を解説いたします。

セッションを使うことによって、一度ログインした場合その情報を一定期間サーバーで保留をするので、画面にhiddenで渡す必要がなくなります。

お読みいただきありがとうございました。

 

 

コメント