如何将MySQL命令的输出存储到java变量(JDBC)中

如何将MySQL命令的输出存储到java变量(JDBC)中,java,mysql,jdbc,Java,Mysql,Jdbc,我想知道如何发出MySQL命令,检查数据库中的表是否为空,然后将布尔结果存储到java变量中。我正在尝试使用JDBC命令来实现这一点。 到目前为止,这是我所拥有的,但它不能正常工作: @Override public boolean isEmpty(Connection connection) { Statement statement = null; ResultSet resultSet = null; Boolean var = true; try {

我想知道如何发出MySQL命令,检查数据库中的表是否为空,然后将布尔结果存储到java变量中。我正在尝试使用JDBC命令来实现这一点。 到目前为止,这是我所拥有的,但它不能正常工作:

@Override
public boolean isEmpty(Connection connection) {
    Statement statement = null;
    ResultSet resultSet = null;
    Boolean var = true;

    try {
        statement = connection.createStatement();

        System.out.println(statement.execute("SELECT EXISTS (SELECT 1 FROM Persons) AS OUTPUT"));

        if(statement.execute("SELECT EXISTS (SELECT 1 FROM Persons)")) {
            var = false;
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    return var;
}

当我使用一个全新的、未填充的mySQL表运行程序时,函数返回true。有人知道解决办法吗

测试检查表是否存在,而不是检查表是否包含任何行。为此,请从表中选择行数,并验证其是否大于
0
。优先于
语句
(它更高效、更高效),您需要一个
结果集
来实际迭代来自服务器的结果。大概

@Override
public boolean isEmpty(Connection connection) {
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    boolean res = false; // no need for the wrapper type here.

    String sql = "SELECT COUNT(*) FROM Persons";
    try {
        statement = connection.prepareStatement(sql);

        System.out.println(sql);
        resultSet = statement.executeQuery();
        if (resultSet.next()) {
            res = resultSet.getInt(1) > 0;
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    return res;
}

var
更改为
res
,因为(从Java 10开始)
var
现在是Java中的一个关键字。

在执行select语句时,您应该使用并迭代其结果集,而不是使用

execute(…)
的布尔返回值指示第一个值是否为结果集。它不是查询中的布尔列。如果您不知道它是哪种类型的语句,或者它是一个可以生成多个结果(更新计数和结果集)的语句,通常只应使用
execute(…)

因此,请使用:

boolean exists;
try (ResultSet rs = statement.executeQuery("SELECT EXISTS (SELECT 1 FROM Persons)")) {
    exists = rs.next() && rs.getBoolean(1);
}
请阅读javadoc以获取更多信息。布尔返回值并不表示您认为它的作用。提示:
select
始终返回结果集(或引发异常)。