空ResultSet仍然评估为true,JDBC

时间:2016-08-27 19:07:38

标签: java mysql jdbc resultset

我编写了一个简单的检查方法来检查MySQL数据库中是否存在给定字符串id的数据:

    public boolean checkForData(String etfSymbol){
    try (Connection conn = DriverManager.getConnection(DBURL, USERNAME, PASSWORD)) {
        if (conn != null) {
            PreparedStatement statement = conn.prepareStatement(CHECK_FOR_DATA);
            statement.setString(1, etfSymbol);
            ResultSet result = statement.executeQuery();
            if (!result.isBeforeFirst()){
                System.out.println("No data currently in database for this ETF");
                return false;
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    System.out.println("Data already exists in database for this ETF");
    return true;
}

查询:

    final String CHECK_FOR_DATA = "SELECT COUNT(*) FROM basic_etf_data WHERE etf_name = (?)"

我可以在MySQL工作台上确认表中没有数据存在于我请求的id(实际上根本没有数据)但条件评估为true。 这是ResultSet的调试输出:

first-half second-half

起初,“InvalidRowReason”让我相信它正在评估为真,因为索引实际上在第一个之前,但isBeforeFirst()的文档状态:

  

如果光标在第一行之前,则为true; false,如果光标位于任何其他位置,或结果集不包含任何行

然后我扩展了rowData,发现大小等于1:

row data

我不知道这是怎么回事,因为我可以确认表中没有行甚至任何数据。我错过了什么?

1 个答案:

答案 0 :(得分:3)

因为你在SQL中创建COUNT而COUNT总是结果(一行),在你的情况下为0.无论如何,我可能会把你的查询写成

SELECT * FROM basic_etf_data WHERE etf_name = ? LIMIT 1