Как получить подготовленный оператор SQL на основе пользовательского ввода (сканер) - PullRequest
0 голосов
/ 10 мая 2019

У меня проблемы с созданием подготовленного оператора SELECT и выводом строк, которые удовлетворяют условию:

SELECT ReservationStartDate, ReservationEndDate FROM treservations WHERE ReservationStartDate< **?** AND ReservationEndDate> **?**

"?"пользовательский ввод - строка, например, 2019-07-09 и 2019-08-16

Я могу выбрать * с помощью следующего метода:

public static List<Reservation> getAllReservation(){
        List<Reservation> reservationsList = new ArrayList<>();
        String sql = "SELECT * FROM `treservations`";
        try{
            PreparedStatement ps = ConnectorDB.connection.prepareStatement(sql);
            ResultSet resultSet = ps.executeQuery();
            while (resultSet.next()){
                Reservation reservation = new Reservation();
                reservation.setReservationID(resultSet.getInt("ReservationID"));
                reservation.setCarID(resultSet.getInt("CarID"));
                reservation.setReservationStartDate(resultSet.getString("ReservationStartDate"));
                reservation.setReservationEndDate(resultSet.getString("ReservationEndDate"));
                reservation.setPesel(resultSet.getString("Pesel"));
                reservationsList.add(reservation);
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
        return reservationsList;
    }

и, например, вставить новые строки на основе ввода пользователяпо сканеру, например:

public static List<Reservation> getAllReservation(){
        List<Reservation> reservationsList = new ArrayList<>();
        String sql = "SELECT * FROM `treservations`";
        try{
            PreparedStatement ps = ConnectorDB.connection.prepareStatement(sql);
            ResultSet resultSet = ps.executeQuery();
            while (resultSet.next()){
                Reservation reservation = new Reservation();
                reservation.setReservationID(resultSet.getInt("ReservationID"));
                reservation.setCarID(resultSet.getInt("CarID"));
                reservation.setReservationStartDate(resultSet.getString("ReservationStartDate"));
                reservation.setReservationEndDate(resultSet.getString("ReservationEndDate"));
                reservation.setPesel(resultSet.getString("Pesel"));
                reservationsList.add(reservation);
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
        return reservationsList;
    }

Проблема состоит в том, как объединить эти два метода и иметь возможность ВЫБРАТЬ строки в БД (и чем распечатывать их) на основе ввода пользовательского сканера.

Мой образ мышления: 1. Мы создаем объект бронирования на основе ввода пользователя

    public static Reservation clientReservationMenuInput(){
        Scanner scanner = new Scanner(System.in);
        String regData = "\\d{4}-\\d{2}-\\d{2}";
        System.out.println("2 Reservation start date (YYYY-MM-DD) ");
        String ReservationStartDate;
        while (!(ReservationStartDate=scanner.next()).matches(regData)){
            System.out.printf("Date format not correct, Please try once again\n");
        }
        System.out.println("3 Reservation end date (YYYY-MM-DD) ");
        String ReservationEndDate;
        while (!(ReservationEndDate=scanner.next()).matches(regData)){
            System.out.printf("Date format not correct, Please try once again\n");
        }
        Reservation reservation = new Reservation();
        reservation.setReservationStartDate(ReservationStartDate);
        reservation.setReservationEndDate(ReservationEndDate);
        return reservation;
    }
Созданный объект является параметром checkDatesForReservation метода SQL, где два параметра "?"означает даты из пользовательского ввода Мне нужен цикл while, чтобы найти все строки В конце мне нужно вернуть List
    public static List<Reservation> checkDatesForReservation(Reservation reservation){
        List<Reservation> reservationList = new ArrayList<>();
        String sql2= "SELECT ReservationStartDate, ReservationEndDate FROM treservations WHERE ReservationStartDate=? AND ReservationEndDate= ?";
        try{
            PreparedStatement ps = ConnectorDB.connection.prepareStatement(sql2);
            ResultSet resultSet = ps.executeQuery();
            while (resultSet.next()){
                ps.setString(1,reservation.getReservationStartDate());
                ps.setString(2,reservation.getReservationEndDate());
                reservationList.add(reservation);
            }
        }catch (SQLException e){
            e.getStackTrace();
        }
        return reservationList;
    }

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Пожалуйста, обратитесь к Пример JDBC PreparedStatement - Выберите список записей

 public static List<Reservation> checkDatesForReservation(Reservation reservation){
        Reservation reservation = null;
        List<Reservation> reservationList = new ArrayList<>();
        String sql2= "SELECT ReservationStartDate, ReservationEndDate FROM treservations WHERE ReservationStartDate=? AND ReservationEndDate= ?";
        try{
            PreparedStatement ps = ConnectorDB.connection.prepareStatement(sql2);
            ps.setString(1,reservation.getReservationStartDate());
            ps.setString(2,reservation.getReservationEndDate());
            ResultSet resultSet = ps.executeQuery();
            while (resultSet.next()){
               reservation = new Reservation();
               reservation.setReservationStartDate(rs.getString("ReservationStartDate"));
               reservation.setReservationEndDate(rs.getString("ReservationEndDate"));
               reservationList.add(reservation);
            }
        }catch (SQLException e){
            e.getStackTrace();
        }
        return reservationList;
    }
0 голосов
/ 10 мая 2019

Вам необходимо установить параметры перед выполнением оператора.

        PreparedStatement ps = ConnectorDB.connection.prepareStatement(sql2);
        ps.setString(1,reservation.getReservationStartDate());
        ps.setString(2,reservation.getReservationEndDate());
        ResultSet resultSet = ps.executeQuery();
        while (resultSet.next()){
            reservationList.add(reservation);
        }
...