Обучение и трудоустройство Java-программистов от Junior до Senior

PreparedStatement. В запросе "? = ?"

 
 
 
Сообщения:77
Доброго времени суток. Есть условная задача - нужно сделать гибкий запрос в методе, который может подставлять вместо ? = ? искомое поле и его новое значение. Например, запрос выглядит так:

UPDATE_NAME_FROM_ID = "UPDATE users SET ?=? WHERE id=?";  


метод:

updateNameMethod("email", "[email protected]", 10);


И само тело метода:

private static void updateNameMethod(String columnName, String name, int id){
		try {
			statmentUpdateName = connection.prepareStatement(UPDATE_NAME_FROM_ID);
			statmentUpdateName.setString(1, columnName);
			statmentUpdateName.setString(2, name);
			statmentUpdateName.setInt(3, id);
			statmentUpdateName.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}	


При попытке подставить значения, вместо ?, ругается компилятор:

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''email'='[email protected]' WHERE id=10' at line 1


Не могу понять, где что надо экранировать, работает ли одновременная подмена параметров таким способом, и на что конкретно ругается система. Не могу найти свой косяк в синтаксисе. Можно сделать по другому, например сформировать эту строку уже в самом методе "вручную", но это как-то по варварски, при условии, что должно работать форматирование строки, через подстановку параметров вместо знаков "?".

private static void updateNameMethod(String columnName, String name, int id)
		try {
			//statmentUpdateName = connection.prepareStatement("UPDATE users SET " + columnName + "='" + name + "' WHERE id=" + id);	
			statmentUpdateName.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


Сидел два часа, пробовал разные варианты, не вышло. Хелп =)

Помогли тебе, помоги другому.
 
 
Сообщения:16
может потому, что он email в кавычки оборачивает? как вариант можно его отдельно добавить в строку, без "?". Названия полей таблиц вроде не должны содержать экранируемых символов
 
 
Сообщения:9570
Это параметризированный запрос - значит можно запрос написать и параметры слать отдельно. Названия же колонок и таблиц не являются параметрами, соответственно их нельзя заменять на ?. Единственный способ динамически генерировать такие запросы - это конкатенация. И тут конечно нужно быть осторожным чтоб не допустить SQL Injection.
 
 
Сообщения:77
Староверъ:
Это параметризированный запрос - значит можно запрос написать и параметры слать отдельно. Названия же колонок и таблиц не являются параметрами, соответственно их нельзя заменять на ?. Единственный способ динамически генерировать такие запросы - это конкатенация. И тут конечно нужно быть осторожным чтоб не допустить SQL Injection.


То бишь что я и сделал во втором варианте с составной строкой? Я так понимаю, что ситуация когда гибко меняется (подставляется) еще и название поля - это излишество и в природе скорее не встретится в таком виде "все в одном запросе"?

Помогли тебе, помоги другому.
 
 
Сообщения:9570
Бывает все же встречается (хоть и не часто) когда мы делаем какую-то форму для фильтрации по колонкам. Но в таком случае поля должны быть жестко определены, пользователи не должны иметь возможности ввести любое название поля. Для создания такого запроса можно конкатенировать как ты и делаешь, либо использовать какую-то надстройку над JDBC типа JOOQ.
Изменен:28 июн 2017 20:06
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет