Инструкция 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 2

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 можно легко предотвратить (избегая других проблем, таких как упомянутые синтаксические ошибки).


Дальнейшие показания: