java - SQL语句大概运行,没有错误,但断言失败

标签 java sql jdbc

所以我遇到了这个问题,我必须尝试预订航类的所有座位。

我用静态方法创建了一个 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/

相关文章:

java - 如何集成EvoSuite测试用例生成工具

java - 单独的 TCP/SSL 连接用于身份验证,而 UDP 连接用于主要流量?

mysql - SQL 操作数应包含 1 列

php - 我的数据库无法保存我的网站中通过php发送到数据库的电子邮件

java - NoClassDefFound错误: org/springframework/jdbc/core/RowMapper

java - 按钮没有响应 javaFx

java - 从 String 转换为 BigDecimal 以对货币进行数学计算

sql - Oracle:使用 SQL 或 PL/SQL 在动态 SQL 中查找错误的位置

java - SpringBoot loader.path 无法加载外部Jar

java - DISTRIBUTE 子句的 Netezza JDBC 元数据信息