Как сохранить вывод команды MySQL в переменную java (JDB C) - PullRequest
0 голосов
/ 20 января 2020

Мне было интересно, как выполнить команду MySQL, которая проверяет, пуста ли таблица в моей базе данных, а затем впоследствии сохраняет логический результат в переменной java. Я пытаюсь использовать команды JDB C для этого. Это то, что у меня есть, но оно не работает должным образом:

@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. Кто-нибудь знает решение?

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Поскольку вы выполняете оператор выбора, вместо использования Statement.execute(..), вы должны использовать Statement.executeQuery(..) и выполнять итерацию по его набору результатов.

логическое возвращаемое значение из execute(..) указывает, является ли первое значение набором результатов или нет. Это не логический столбец из вашего запроса. Обычно вы должны использовать execute(..), только если вы не знаете, к какому типу операторов это относится, или если это оператор, который может давать несколько результатов (счетчик обновлений и наборы результатов).

Поэтому вместо этого используйте :

boolean exists;
try (ResultSet rs = statement.executeQuery("SELECT EXISTS (SELECT 1 FROM Persons)")) {
    exists = rs.next() && rs.getBoolean(1);
}
0 голосов
/ 20 января 2020

Ваш тест проверяет, существует ли таблица, вместо этого вы хотите увидеть, содержит ли таблица какие-либо строки. Для этого выберите количество строк в таблице и убедитесь, что оно больше 0. Предпочитайте PreparedStatement над Statement (это более эффективно и производительно), и вам нужно ResultSet для фактической итерации результата с сервера. Что-то вроде

@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.

...