Javaで編集・更新機能を作るには?選んだデータを書き換える仕組み|確認問題の回答例

Javaで編集・更新機能を作るには?選んだデータを書き換える仕組みの確認問題の回答例です。「どの行か」と「何に変えるか」を、フォームとSQLの両方で確認しましょう。

問題1:id=2とstatus=完了を送り、同じ行を更新する

項目回答
POSTで送る値idは文字列の”2″、statusは”完了”
更新後のID2のまま
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件として返さないことが重要です。

元の記事に戻る

Javaで編集・更新機能を作るには?選んだデータを書き換える仕組み