数据库查询和Java

时间:2018-09-02 10:25:57

标签: java mysql database

我正在研究一个有关创建简单Web应用程序的项目。 我正在创建有关酒店的网络应用程序,但是关于房间预订的问题。 我有3种房间,我想当某人预订房间时,另一个人不能在同一时期预订同一房间。 问题在于这种控制。 我已经编写了这段代码:

回答后更新代码

 Statement  st =  con.createStatement();
        Statement stmt = con.createStatement();
        out.println("connection successfull");
        int total = 0;
        ResultSet rs3 = stmt.executeQuery( "SELECT COUNT(*) as total FROM reservation WHERE idRoom = '" + idRoom + 
                "' AND ('" + arrivaldate + "' >= arrivaldate AND '" + arrivaldate + "' <= departuredate) OR ('" + departuredate + "' >= arrivaldate "
                + "AND '" + departuredate + "' <= departuredate)");
        rs3.next(); // You'll ever have only one row
        total = rs3.getInt("total");


       /* String query = "SELECT COUNT(*) FROM reservation WHERE idRoom = '" + idRoom + 
                "' AND ('" + arrivaldate + "' >= arrivaldate AND '" + arrivaldate + "' <= departuredate) OR ('" + departuredate + "' >= arrivaldate "
                        + "AND '" + departuredate + "' <= departuredate)" ;

        */

       // ResultSet rs2  = stmt.executeQuery(check);
        out.println("<h1> Stringa check eseguito </h1>");


        if( total  > 0) { // THIS DOESN't WORK OF COURSE    
            response.sendRedirect("home.jsp");
        }
        else {
         st.executeUpdate("insert into reservation (login,email,typeroom,idRoom,arrivaldate,departuredate)values ('"+login+"','"+email+"','"+typeroom+"','"+idRoom+"','"+arrivaldate+"','"+departuredate+"')");
        }

但是它不能正常工作,因为它让我用相同的数据预订同一房间。 您认为我该怎么办?感谢您的关注。

1 个答案:

答案 0 :(得分:1)

首先,您完全忽略了总数:

while(rs3.next()){
   rs3.getInt("total");
}

应该是:

rs3.next(); // You'll ever have only one row
total = rs3.getInt("total");

第二,永远不要在查询中使用串联:

ResultSet rs3 = stmt.executeQuery( "SELECT COUNT(*) as total FROM reservation WHERE idRoom = '" + idRoom + 
                    "' AND ('" + arrivaldate + "' >= arrivaldate AND '" + arrivaldate + "' <= departuredate) OR ('" + departuredate + "' >= arrivaldate "
                    + "AND '" + departuredate + "' <= departuredate)");

始终使用PreparedStatements代替:

 PreparedStatement ps = stmt.prepareStatement( "SELECT COUNT(*) as total FROM reservation WHERE idRoom = ? AND (? >= arrivaldate AND ? <= departuredate) OR (? >= arrivaldate AND ? <= departuredate)");

int c = 0;
ps.setInt(++c, idRoom);
ps.setDate(++c, arrivaldate);
ps.setDate(++c, departuredate);
ps.setDate(++c, arrivaldate);
ps.setDate(++c, departuredate);

ResultSet rs = ps.executeQuery();
// And your usual code here