Как получить размер результата из SQL-запроса и проверить размер - PullRequest
0 голосов
/ 29 марта 2012

Привет, я пытаюсь написать кусок кода для простого метода проверки как часть MVC.

В настоящее время SQL не написан как подготовленное утверждение, поэтому очевидно, что он подвергается рискуВнедрение SQL, поэтому любая помощь в написании SQL как подготовленного оператора будет очень полезной.

Метод, который используется в модели User.

public boolean getInfo() {

    try {
        DBAccess dbAccess = new DBAccess();

        String sql = "SELECT username, password FROM owner WHERE username = '" + this.username
                + "'AND password = '" + this.password + "';";

        dbAccess.close();dbAccess.executeQuery(sql);
        dbAccess.close();


        return true;
    } catch (Exception e) {
        return false;
    }
}

Я хочу получить размернабора результатов, сгенерированного SQL-запросом, и если его размер равен 1, верните true, иначе это false.

Если вам нужна дополнительная информация об остальной части MVC, просто отправьте сообщение, и я получу егоздесь.

Ответы [ 4 ]

1 голос
/ 29 марта 2012

Просто верните результат ResultSet#next(), предполагая, что на username есть ограничение UNIQUE.Он возвращает false, если нет следующей записи.

Вот конкретный пример, слегка переписанный, чтобы исправить потенциальную дыру в SQL-инъекциях, утечку ресурсов и проблемы с безопасностью потоков, как показано в коде.Кроме того, измененный SQL-запрос должен заставить MD5-хэшировать пароли перед сохранением в БД (вы не хотите хранить текстовые пароли в БД).

public boolean exist(String username, String password) throws SQLException {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    boolean exist = false;

    try {
        connection = database.getConnection();
        statement = connection.prepareStatement("SELECT id FROM owner WHERE username = ? AND password = MD5(?)");
        statement.setString(1, username);
        statement.setString(2, password);
        resultSet = statement.executeQuery();
        exist = resultSet.next();
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
        if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }

    return exist;
}
1 голос
/ 29 марта 2012

Не зная деталей вашего класса DBAccess, мы не можем сказать вам, как это сделать. Я предполагаю, что он возвращает список (но это предположение, не более того). Если это так, вы можете проверить размер списка через list.size() или посмотреть, вернул ли он хотя бы 1 результат с !list.isEmpty(). Конечно, если это не список, это не сработает.

И вам определенно нужно переключиться на подготовленные заявления. Например, см. этот пост SO .

Примечание: если этот метод возвращает логическое значение, указывающее, существует ли пользователь, его не следует вызывать getInfo()! Нечто подобное userExists() будет иметь больше смысла.

1 голос
/ 29 марта 2012

Скорее выберите поля username и password, вы можете выбрать их количество, а затем сослаться на это значение.

Итак, ваш SQL-запрос будет:

SELECT count(*) FROM owner WHERE username = '" + this.username
            + "'AND password = '" + this.password + "';

Это вернет количество совпавших записей, где, если число больше 0 или равно единице, проверить их.

0 голосов
/ 29 марта 2012

Если у вас есть вопрос о том, как предотвратить инъекцию sql, и если вы хотите начать намочить ноги с помощью библиотеки "ORM like", вы можете использовать myibatis для создания готовых операторов.Myibatis - это картограф данных, из которого вы можете создать относительно простой ORM.Когда вы станете более смелым, вы можете перейти в спящий режим или JPA.

http://www.mybatis.org/

...