如何根据用户输入(扫描器)获取 SQL 准备好的语句
How to get SQL prepared statement based on user input (scanner)
我很难创建准备好的语句 SELECT 并打印出满足条件的行:
SELECT ReservationStartDate, ReservationEndDate FROM treservations WHERE ReservationStartDate< **?** AND ReservationEndDate> **?**
“?”用户输入 - 字符串,例如 2019-07-09 和 2019-08-16
我可以 SELECT* 使用以下方法:
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;
}
问题是如何结合这两种方法并能够根据用户扫描仪输入 SELECT 数据库中的行(然后将它们打印出来)。
我的思路:
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 循环来查找所有行
- 最后我需要 return 一个列表
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;
}
执行语句前需要设置参数
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);
}
请参考JDBC PreparedStatement example – Select list of the records
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;
}
我很难创建准备好的语句 SELECT 并打印出满足条件的行:
SELECT ReservationStartDate, ReservationEndDate FROM treservations WHERE ReservationStartDate< **?** AND ReservationEndDate> **?**
“?”用户输入 - 字符串,例如 2019-07-09 和 2019-08-16
我可以 SELECT* 使用以下方法:
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;
}
问题是如何结合这两种方法并能够根据用户扫描仪输入 SELECT 数据库中的行(然后将它们打印出来)。
我的思路: 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 循环来查找所有行
- 最后我需要 return 一个列表
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;
}
执行语句前需要设置参数
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);
}
请参考JDBC PreparedStatement example – Select list of the records
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;
}