019 例外と例外処理(トランザクションとロールバック) 033 解答例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class ReservationProgram {
    // データベース接続情報
    private static final String JDBC_URL = "jdbc:mysql://localhost:3306/reservation_db";
    private static final String USER = "username";
    private static final String PASSWORD = "password";

    // 予約を行うメソッド
    public void makeReservation(String facility, String dateTime) {
        try (Connection connection = DriverManager.getConnection(JDBC_URL, USER, PASSWORD)) {
            // トランザクションの開始
            connection.setAutoCommit(false);

            // 予約の重複チェック
            if (!isReservationAvailable(connection, facility, dateTime)) {
                // 予約が重複している場合、トランザクションをロールバック
                connection.rollback();
                System.out.println("予約が重複しています。");
                return;
            }

            // 予約をデータベースに登録
            insertReservation(connection, facility, dateTime);

            // トランザクションのコミット
            connection.commit();

            System.out.println("予約が完了しました。");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 予約の重複チェックを行うメソッド
    private boolean isReservationAvailable(Connection connection, String facility, String dateTime)
            throws SQLException {
        String sql = "SELECT COUNT(*) FROM reservations WHERE facility = ? AND date_time = ?";
        try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            preparedStatement.setString(1, facility);
            preparedStatement.setString(2, dateTime);

            // 予約がある場合は false を返す
            return preparedStatement.executeQuery().getInt(1) == 0;
        }
    }

    // 予約をデータベースに登録するメソッド
    private void insertReservation(Connection connection, String facility, String dateTime)
            throws SQLException {
        String sql = "INSERT INTO reservations (facility, date_time) VALUES (?, ?)";
        try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            preparedStatement.setString(1, facility);
            preparedStatement.setString(2, dateTime);

            preparedStatement.executeUpdate();
        }
    }

    public static void main(String[] args) {
        ReservationProgram reservationProgram = new ReservationProgram();
        reservationProgram.makeReservation("Conference Room A", "2023-01-01 14:00");
    }
}
  1. makeReservation メソッド内でトランザクションを開始し、予約の重複チェックを行います。
  2. isReservationAvailable メソッドで指定された施設と日時に既に予約があるかどうかを確認します。
  3. 予約が重複している場合、トランザクションをロールバックし、エラーメッセージを表示して処理を終了します。
  4. 予約が重複していない場合、insertReservation メソッドで新しい予約をデータベースに登録します。
  5. トランザクションのコミットを行い、予約が完了した旨のメッセージを表示します。

「019 例外と例外処理」問題集リスト