2012-03-28 3 views
0

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

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

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

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 возвращающие иначе это ложь.

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

ответ

1

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

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

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; 
} 
+0

Спасибо за ответ, хотя где он будет проверять, установлен ли результирующий набор 1 или 0? Я вижу, что он проверит размер набора результатов с resultSet.next(); или я должен вызвать этот метод в сервлетах и ​​выполнить там оператор if? – Jimmy

+0

'ResultSet # next()' возвращает 'false', если нет одной записи. – BalusC

1

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

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

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

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

+0

Ничего себе, это намного проще, чем я думал. Считает ли счет (*) ОТ владельца WHERE имя пользователя не обязательно в «"? – Jimmy

+0

Да, извините, не скопировал предыдущую «перед рукой». Таким образом, ваша строка SQL будет: String sql = «SELECT count (*) FROM owner WHERE username = '" + this.username + "' AND password = '" + это.пароль + "';"; –

1

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

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

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

0

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

http://www.mybatis.org/

Смежные вопросы