Как проверить базу данных из Java, если существует строка с заданными критериями? - PullRequest
3 голосов
/ 05 августа 2011

У меня есть таблица VIDEO (VideoID int Primary Key, Address Varchar(100)), и я хочу найти таблицу, чтобы увидеть, есть ли видео с данным адресом.Но я не уверен, что этот код работает хорошо, и может ли это быть лучше сделано.Вот мой код:

public boolean checkIfVideoExist(String address) throws SQLException {
    int count = 0;
    Statement stmt = connection.createStatement();
    ResultSet rset = stmt
            .executeQuery("SELECT Count(VideoID) from VIDEO WHERE Address='"
                    + address + "'");
    if (rset.next())
        count = rset.getInt(1);
    if (count == 0)
        return false;
    else
        return true;
}

Ответы [ 4 ]

3 голосов
/ 05 августа 2011

Убедитесь, что у вас установлен индекс для столбца ADDRESS. Тогда ваш запрос должен выполняться быстро.

Лучше использовать подготовленный оператор для передачи значения адреса в запрос. И вы должны закрыть набор результатов и оператор.

А

if (count == 0)
  return false;
else
  return true;

выглядит немного странно.

public boolean checkIfVideoExist(String address) throws SQLException {
  int count = 0;
  PreparedStatement stmt = null;
  ResultSet rset = null;
  try {
    stmt = connection.prepareStatement(
        "SELECT Count(VideoID) from VIDEO WHERE Address=?");
    stmt.setString(1, address);
    rset = stmt.executeQuery();
    if (rset.next())
      count = rset.getInt(1);
    return count > 0;
  } finally {
    if(rset != null) {
      try {
        rset.close();
      } catch(SQLException e) {
        e.printStackTrace();
      }
    }        
    if(stmt != null) {
      try {
        stmt.close();
      } catch(SQLException e) {
        e.printStackTrace();
      }
    }        
  }    
}
3 голосов
/ 05 августа 2011

Код в порядке, за исключением того, как вы встраиваете строки в свой запрос.Если адрес содержит символ кавычки, запрос станет недействительным.И это только малая часть проблемы.Такое действие открывает дверь для атак с использованием SQL-инъекций, где злоумышленники могут вводить адрес, который полностью меняет смысл запроса.

Всегда использовать подготовленные операторы для привязки параметров:

PreparedStatement stmt = connection.prepareStatement("SELECT Count(VideoID) from VIDEO WHERE Address=?");
stmt.setString(1, address); // proper escaping is done for you by the JDBC driver
ResultSet rset = stmt.executeQuery();

Кроме того, вы должны использовать блоки finally, чтобы закрыть наборы результатов и операторы.

2 голосов
/ 05 августа 2011

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

Кроме того, все выглядит хорошо.

0 голосов
/ 05 августа 2011
ResultSet rset = stmt.executeQuery("SELECT * from VIDEO WHERE Address='" + address + "'");
return rset.next();

тогда есть хотя бы одна подходящая запись, и все готово. Нет необходимости в статистической функции count () ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...