2015-03-21 3 views
0

у меня есть Java-программа, выполняющая SQL UPDATE для таблицы:Заявление об обновлении Java Sql. Работа с Null в кавычках

String qry = "UPDATE [Artists] SET [Website] = '" + artist.getWebsite() + "' WHERE [ID] = " + artist.getID() + "'"; 

Если artist.getWebsite() равно нулю она вставив строку «нуль» из-за кавычки, когда я хотите просто оставить его как SQL NULL. Но мне нужны кавычки, так как большую часть времени artist.getWebsite() возвращает строку. Что такое самый простой способ справиться с этим?

+1

Пожалуйста, смотрите в 'PreparedStatement's. Ваш код уязвим для инъекций SQL. –

ответ

2

не делают. Используйте. Строка. Конкатенация. Для. Построить. SQL. Заявления. Есть несколько причин для этого, не в последнюю очередь это одна:

enter image description here

... и обнуляет являются одна из этих причин. Подробнее: http://bobby-tables.com Это также действительно легко запутаться при этом (например, в вашем примере есть, например, ').

На данный момент проигнорируем null: Что, если значение, которое вы помещаете в строку, содержит '? Теперь у вас сломанная строка SQL.

Вместо этого используйте PreparedStatement:

PreparedStatement ps = conn.prepareStatement(
    "UPDATE [Artists] SET [Website] = ? WHERE [ID] = ?" 
); 
ps.setString(1, artist.getWebsite()); 
ps.setInt(2), artist.getID()); 

Обратите внимание, что нет никаких кавычек вокруг ? где мы собираемся поставить строку; PreparedStatement обрабатывает правильное цитирование и экранирование содержимого для вас.

Я думаю setString позволяет установить null с, но я не сделал JDBC материал в то время. Для столбцов, отличных от String, вы должны использовать setNull; Вы может нужна ветвь, если setString не рад это сделать, например .:

PreparedStatement ps = conn.prepareStatement(
    "UPDATE [Artists] SET [Website] = ? WHERE [ID] = ?" 
); 
String web = artist.getWebsite(); 
if (web == null) { 
    ps.setNull(1, JDBCType.NVARCHAR); 
} else { 
    ps.setString(1, web); 
} 
ps.setInt(2), artist.getID()); 

... но дать setString идти первым.

+0

Хорошо, спасибо. Посмотрите в PreparedStatements – edezzie

0

Если вы используете JDBC, вы всегда должны пытаться использовать подготовленные инструкции, а не просто конкатенировать инструкцию вручную. В частности, использование метода setNull() в подготовленном операторе вставляет SQL NULL в запрос.

Использование подготовленных операторов также помогает защитить ваше приложение от атак SQL-инъекций.

Пожалуйста, обратитесь к следующей ссылке: http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

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