JavaのWebアプリとデータベースはどうつながる?Servlet・Model・DAOの役割と処理の流れ|確認問題の回答例
JavaのWebアプリとデータベースはどうつながる?Servlet・Model・DAOの役割と処理の流れの確認問題の回答例です。入力値を渡す流れと、処理結果が戻る流れを分けて確認しましょう。
問題1:入力ルールとDB操作の担当
空白だけのタスク名を受け付けないルールはTaskModel、INSERT文の実行はTaskDaoです。TaskModelのregisterで入力を確認し、条件に合う場合だけDAOのinsertを呼びます。HTMLのrequiredだけでは空白だけの入力を防ぎきれず、ブラウザのチェックを経由しない送信もできるため、サーバー側でも確認します。
問題2:オブジェクトの作成だけでは保存されない
追加されません。Taskはタスク名を持つDTO、TaskDaoはDB操作を担当するオブジェクトであり、今回のコンストラクタはフィールドへ値をセットするだけです。
int count = dao.insert(task);
この呼び出しによりTaskDaoのinsertへ進み、その中のstmt.executeUpdate()でINSERT文を実行します。setStringも値を設定する処理なので、それだけでは行は追加されません。
問題3:今回の登録件数と、DB全体の行数は違う
2回目も「1件登録しました。」です。executeUpdateが返すのは、そのINSERTで追加した件数です。空のテーブルへ1件ずつ2回登録した結果、DB全体には2行ありますが、2回目の操作で追加した行は1行です。登録した行のIDも、戻り値の件数とは別です。
問題4:DBエラーを成功として扱わない
今回のコードでは、SQLExceptionはTaskDaoからTaskModelを経てTaskServletへ伝わり、TaskServletのcatchで受け止めます。ServletはHTTP 500と固定のエラーメッセージを用意し、JSPへforwardします。詳しい原因はサーバー側のログで確認します。
失敗したのに1を返すと、呼び出し元は「1件登録できた」と判断してしまいます。例外を件数に置き換えて成功を装わず、成功時の件数と失敗時の通知を分けます。