Чем отличается Statement от PreparedStatement
Statement и PreparedStatement — это два интерфейса для выполнения SQL-запросов, различающиеся по способу компиляции запроса и уровню безопасности.
| Критерий | Statement | PreparedStatement |
|---|---|---|
| Параметры | Нет (значения вставляются в строку SQL) | Да (параметры подставляются через ?) |
| Компиляция | Каждый раз заново | Однократно, план кэшируется СУБД |
| SQL Injection | Уязвим | Защищён |
| Повторное использование | Неэффективно | Эффективно при повторных вызовах |
| Когда использовать | DDL, одноразовые запросы | DML, параметризованные запросы |
Перед выполнением СУБД разбирает каждый запрос, оптимизирует его и создает план (query plan) выполнения. Если один и тот же запрос выполняется несколько раз, СУБД может кэшировать план и не производить этапов разборки и оптимизации повторно.
PreparedStatement выгодно отличается от Statement тем, что при повторном использовании с одним или несколькими наборами параметров позволяет получить преимущества заранее прекомпилированного и кэшированного запроса, помогая при этом избежать SQL Injection.
На собеседовании: два ключевых отличия: (1) PreparedStatement защищает от SQL Injection, (2) запрос компилируется один раз и переиспользуется. Правило: всегда используйте PreparedStatement, кроме случаев DDL без параметров.