演習: データの更新
データの更新とトランザクション で使った Spring Initializr のプロジェクトで取り組みます。各問題のコードは com.example パッケージの Main クラスの main メソッドに書き、main には throws SQLException を付けます。
Directoryjdbc-practice/
Directorysrc/main/java/com/example/
- …
bookstore データベースに接続します。INSERT・UPDATE・DELETE は実行するたびに DB の中身が変わるため、各問題は一度実行して結果を確かめます。
9-A. 書籍を 1 冊追加する
Section titled “9-A. 書籍を 1 冊追加する”books テーブルに書籍を 1 冊追加してください。isbn・title・author_id・category_id・price・published_at・stock をプレースホルダで設定し、executeUpdate で実行して、影響行数を出力します。id は AUTO_INCREMENT なので指定しません。author_id と category_id は、既存の値(どちらも 1 でよい)を指定します。
出力例:
追加した行数: 1ヒント
SQL は INSERT INTO books (isbn, title, author_id, category_id, price, published_at, stock) VALUES (?, ?, ?, ?, ?, ?, ?) です。stmt.setString と stmt.setInt で 7 つの値を設定し、int rows = stmt.executeUpdate(); の戻り値が影響行数です。INSERT が成功すれば 1 が返ります。本文 INSERT と同じ構造です。isbn は重複しない 13 桁の値にします。
9-B. 書籍の価格を更新する
Section titled “9-B. 書籍の価格を更新する”id = 1 の書籍(こころ)の価格を 500 に更新してください。UPDATE をプレースホルダで書き、executeUpdate の影響行数を出力します。
出力例:
更新した行数: 1更新後、JDBC と検索 の SELECT で id = 1 の価格が 500 に変わったことを確認してください。
ヒント
SQL は UPDATE books SET price = ? WHERE id = ? です。stmt.setInt(1, 500) で価格、stmt.setInt(2, 1) で id を設定します。id = 1 の行が 1 つ更新されるので、影響行数は 1 です。
9-C. 在庫を 1 減らす
Section titled “9-C. 在庫を 1 減らす”id = 2 の書籍(吾輩は猫である)の在庫を 1 減らしてください。現在の在庫を読み取ってから引くのではなく、UPDATE の中で stock = stock - 1 と書きます。影響行数を出力します。
出力例:
更新した行数: 1ヒント
SQL は UPDATE books SET stock = stock - 1 WHERE id = ? です。stock - 1 は SQL の中で計算されるため、現在の在庫を Java 側で取得する必要はありません。stmt.setInt(1, 2) で id を設定します。
9-D. 存在しない書籍を更新する
Section titled “9-D. 存在しない書籍を更新する”id = 999 の書籍の価格を更新する UPDATE を実行してください。id = 999 の書籍は存在しません。影響行数を確認し、0 のときは 対象の書籍が見つかりません と出力してください。
出力例:
対象の書籍が見つかりませんヒント
SQL は 9-B と同じ UPDATE books SET price = ? WHERE id = ? で、id に 999 を渡します。該当する行がないため executeUpdate の影響行数は 0 です。if (rows == 0) で「見つからない」と判断します。影響行数を見れば、更新が実際に行われたかが分かります。
9-E. 書籍を削除する
Section titled “9-E. 書籍を削除する”9-A で追加した書籍を、その isbn を指定して削除してください。DELETE をプレースホルダで書き、executeUpdate の影響行数を出力します。
出力例:
削除した行数: 1ヒント
SQL は DELETE FROM books WHERE isbn = ? です。9-A で指定した isbn を stmt.setString(1, ...) に渡します。該当する行が 1 つ削除されるので、影響行数は 1 です。9-A で追加したばかりの書籍は、ほかのテーブルから参照されていないため削除できます。
9-F. 存在しない書籍を削除する
Section titled “9-F. 存在しない書籍を削除する”id = 999 の書籍を削除する DELETE を実行してください。該当する書籍は存在しません。影響行数を確認し、削除された件数を 削除した行数: ◯ の形式で出力してください。
出力例:
削除した行数: 0ヒント
SQL は DELETE FROM books WHERE id = ? で、id に 999 を渡します。該当する行がないため影響行数は 0 です。DELETE も UPDATE と同じく、影響行数で「実際に削除されたか」を判断できます。