Javaで編集・更新機能を作るには?選んだデータを書き換える仕組み|確認問題の回答例
Javaで編集・更新機能を作るには?選んだデータを書き換える仕組みの確認問題の回答例です。「どの行か」と「何に変えるか」を、フォームとSQLの両方で確認しましょう。
問題1:id=2とstatus=完了を送り、同じ行を更新する
| 項目 | 回答 |
|---|---|
| POSTで送る値 | idは文字列の”2″、statusは”完了” |
| 更新後のID | 2のまま |
| DBの行数 | 3件のまま |
| ID=1の状態 | 未着手のまま |
変わるのはID=2のstatusだけです。UPDATEは新しい行を追加しません。また、このSQLのSETにidやtitleは含まれていないため、IDもタスク名も変わりません。
問題2:1番目に新しい状態、2番目に対象のIDを設定する
stmt.setString(1, "完了");
stmt.setInt(2, 3);
第1引数は、SQL内の?を左から数えた番号です。最初はSET statusの?なので1、次はWHERE idの?なので2です。setIntの第2引数に、対象のIDである3を渡します。ID=3でも、?の番号は2のままです。
問題3:表示している文字だけでは、IDは送信されない
このformのactionにはクエリ文字列がなく、ほかにidを送るinputもないため、getParameter(“id”)はnullになります。画面に表示された「ID:2」は、送信するフォームの項目ではありません。GETのtask属性も次のPOSTへ引き継がれません。
ModelのconvertIdで整数に変換できず、IllegalArgumentExceptionがServletへ通知されます。Servletは400を返し、DAOの更新処理は呼びません。次のhiddenでIDを送る必要があります。
<input type="hidden" name="id" value="2">
実際のJSPは固定の2ではなく、取得したTaskのgetId()をvalueへ出力します。hiddenの値も変更できるため、サーバー側の確認は省略できません。
問題4:対象なしの0件と、SQL処理の失敗は別
行が削除されていれば、WHEREに一致する行がないのでexecuteUpdateは0を返します。Servletはcount == 0を確認し、404で終了します。更新成功のJSPへは進まず、行を新規登録することもありません。
一方、tasksテーブル自体がない場合は、DAOからSQLExceptionが通知されます。Servletがログへ記録して500を返します。対象が存在しない場合と、DB処理を実行できない場合を、どちらも0件として返さないことが重要です。