Javaで削除機能を作るには?選んだデータを削除する仕組み|確認問題の回答例

Javaで削除機能を作るには?選んだデータを削除する仕組みの確認問題の回答例です。画面から送ったIDが、SQLの条件と削除後のデータにどう対応するかを確認しましょう。

問題1:id=2を送り、ID=1とID=3が残る

項目回答
送信するパラメータ名前はid、値は文字列の”2″
DAOの戻り値1。今回削除した行の件数。
残るID1と3
削除後の件数2件

削除したIDが2だから、DAOの戻り値も2になるわけではありません。削除したのは1行なので1です。タスク名や状態を新しい値に書き換えるのではなく、ID=2の行全体がなくなります。ID=3は3のままです。

問題2:GETでの確認・キャンセルでは削除しない

確認画面を開くリンクはGET task-delete?id=2です。doGetはSELECTで対象を取得するだけで、削除しません。キャンセルも一覧へのGETなので、DBの3件はそのまま残ります。削除は、確認画面で「削除する」を押し、POSTしたときに実行します。

リンクを開くだけのGETで削除してしまうと、URLを開く操作や再アクセスでデータが失われます。表示・取得のGETと、変更を確定するPOSTを分けます。ただし、POSTや確認画面自体が権限確認・CSRF対策の代わりになるわけではありません。

問題3:?の番号は1、削除するIDは3

stmt.setInt(1, 3);

最初の1はSQL内の?を左から数えた番号です。2番目の引数に対象のID=3を渡します。WHEREを省いてDELETE FROM tasksだけにすると、全行が削除対象になります。PreparedStatementで実行しても、存在しない条件を自動で補うことはありません。

問題4:削除対象なしの0件と、SQL失敗の例外は違う

状況DAOServlet
ID=2の行だけがすでにないexecuteUpdateが0を返すcount == 0で404。削除成功画面へ進まない。
tasksテーブル自体がないSQLExceptionを通知するcatchでログに記録し500。詳細は画面に出さない。

確認画面を出したGETと、削除を実行するPOSTは別のリクエストです。その間にDBの状態は変わり得ます。確認時に存在したことだけで成功と判断せず、DELETEの実行結果を確認します。SQL失敗まで0件として返すと、障害と対象なしを区別できなくなります。

元の記事に戻る

Javaで削除機能を作るには?選んだデータを削除する仕組み