Javaで削除機能を作るには?選んだデータを削除する仕組み|確認問題の回答例
Javaで削除機能を作るには?選んだデータを削除する仕組みの確認問題の回答例です。画面から送ったIDが、SQLの条件と削除後のデータにどう対応するかを確認しましょう。
問題1:id=2を送り、ID=1とID=3が残る
| 項目 | 回答 |
|---|---|
| 送信するパラメータ | 名前はid、値は文字列の”2″ |
| DAOの戻り値 | 1。今回削除した行の件数。 |
| 残るID | 1と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失敗の例外は違う
| 状況 | DAO | Servlet |
|---|---|---|
| ID=2の行だけがすでにない | executeUpdateが0を返す | count == 0で404。削除成功画面へ進まない。 |
| tasksテーブル自体がない | SQLExceptionを通知する | catchでログに記録し500。詳細は画面に出さない。 |
確認画面を出したGETと、削除を実行するPOSTは別のリクエストです。その間にDBの状態は変わり得ます。確認時に存在したことだけで成功と判断せず、DELETEの実行結果を確認します。SQL失敗まで0件として返すと、障害と対象なしを区別できなくなります。