Инструкция Java-to-sql, переменные в Insert into vs setString
В чем разница между этими двумя утверждениями, работают ли они одинаково или первое вообще работает? Могу ли я использовать переменные после "Insert into"?
stmt = conn.prepareStatement("INSERT INTO treatment(CPR,Treatment,ID,TreatedOn) "+
"VALUES("+Cpr+Id+date.toString());
Где id
, cpr
являются а string
,int
или другой переменной, в моем случае это string
,
PreparedStatement insertStatement;
insertStatement = connection.prepareStatement("INSERT INTO sep2.movies(title,length) "
+ "VALUES (?,?,?)");
insertStatement.setString(1, Title);
insertStatement.setInt(2, movie.getLength());
, где Title
- строка, а getLength
возвращает int
.
Какой из них я должен использовать ?
Я понимаю, что setString
делает, но должен ли я использовать его?
Также я вставляю только элементарные / не-объектные типы данных в Treatment
. Разве это имеет значение? (Я использую postgres , если это имеет значение)
2 ответа:
И другим важным аспектом использования переменных bind является то, что это улучшает производительность приложения. При использовании переменных привязки сервер базы данных кэширует и оптимизирует запрос, а также повышает производительность (с учетом времени и обработки) вашего приложения.
Например, Когда вы используете
insertStatement = connection.prepareStatement("INSERT INTO sep2.movies(title,length) " + "VALUES (?,?,?)"); insertStatement.setString(1, Title); insertStatement.setInt(2, movie.getLength());
Оператор кэшируется внутри сервера базы данных, и только параметры привязываются во время выполнения внутри базы данных. Это значительно повысит производительность.
Вы можете прочитать разработка приложений для повышения производительности и масштабируемости Белая книга Oracle http://www.oracle.com/technetwork/database/performance/designing-applications-for-performa-131870.pdf
Всегда рекомендуется, чтобы приложения, выполняющие команды SQL, нейтрализовали любые внешние значения, используемые в этих командах. В противном случае злоумышленник может включить входные данные, которые изменят запрос, что приведет к выполнению непреднамеренных команд или к раскрытию конфиденциальных данных.( инъекция SQL).
Первый пример (конкатенация строк) небезопасен, поскольку он уязвим для SQL-инъекции, поскольку вредоносные данные могут быть объединены в сам запрос (не говоря уже о том, что он может привести к синтаксическим ошибкам и т. д.).
Второй случай (где, например, Объект PreparedStatement#записи используются) правильно использует параметризованные запросы за счет использования в Java объект PreparedStatement класс, связывать переменные и соответствующие
setString
способы. Таким образом, инъекцию SQL можно легко предотвратить (избегая других проблем, таких как упомянутые синтаксические ошибки).
Дальнейшие показания: