所以我遇到了这个问题,我必须尝试预订航类的所有座位。
我用静态方法创建了一个 Helper 类,用于单元测试目的。当我运行测试时,我的 bookAll() 方法与“isAllBooked()”方法一样运行。但 isAllBooked 方法返回 false。
经过调查,结果发现数据库根本没有被最初的 bookAll() 语句触及。但没有错误。可能是什么原因造成的?
HelperClass.java
public static void bookAll(String plane_no) {
conn = getConnection("", "");
try {
conn.prepareStatement(""
+ "UPDATE SEAT"
+ "SET reserved='1337',booked='1337',booking_time='1337'"
+ "WHERE plane_no='" + plane_no + "';"
);
conn.commit();
} catch (SQLException ex) {
System.out.println("[HELPER CLASS] SQL ERROR: " + ex.getMessage());
}
closeConnection(conn);
}
public static boolean isAllBooked(String plane_no) {
conn = getConnection("", "");
try {
ResultSet rs =
conn.prepareStatement(
"SELECT booked FROM SEAT WHERE plane_no='"
+ plane_no + "'")
.executeQuery();
while(rs.next()) {
int i = rs.getInt("BOOKED");
if(rs.wasNull()) {
closeConnection(conn);
return false;
}
}
} catch (SQLException ex) {
System.out.println("[HELPER CLASS] SQL ERROR: " + ex.getMessage());
}
closeConnection(conn);
return true;
}
HelperClassTest.java
@Test
public void testBookAll() {
System.out.println("bookAll");
String plane_no = "CR9";
HelperClass.bookAll(plane_no);
boolean expResult = true;
boolean result = HelperClass.isAllBooked(plane_no);
assertEquals(expResult,result);
}
最佳答案
你永远不会执行该语句:
conn.prepareStatement(""
+ "UPDATE SEAT"
+ "SET reserved='1337',booked='1337',booking_time='1337'"
+ "WHERE plane_no='" + plane_no + "';"
);
conn.commit();
您忽略了 prepareStatement
的返回值,因此您实际上并未对数据库执行任何操作。
您应该使用带参数的固定 SQL 创建一个 PreparedStatement
,针对该 PreparedStatement
指定参数值,然后调用 PreparedStatement.executeUpdate()
.
所以类似:
public static void bookAll(String planeNo) {
String sql = "UPDATE SEAT "
+ "SET (reserved, booked, booking_time) "
+ "VALUES ('1337', '1337', '1337') "
+ "WHERE plane_no=?";
try (Connection conn = getConnection("", "");
PreparedStatement st = conn.prepareStatement(sql)) {
st.setString(1, planeNo);
st.executeUpdate();
conn.commit();
} catch (SQLException ex) {
System.out.println("[HELPER CLASS] SQL ERROR: " + ex.getMessage());
}
}
请注意,这还:
- 使用本地变量进行连接,而不是实例变量。您应该为每个操作使用单独的
连接
,即使它实际上是池化的 - 使用符合 Java 编码约定的变量名称
- 使用 try-with-resources 语句来确保即使出现错误也能关闭所有内容
就我个人而言,我不会使用这种类型的异常处理 - 我会让异常向上传播,可能将其作为未经检查的异常重新抛出 - 但那是另一回事。
关于java - SQL语句大概运行,没有错误,但断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23339433/