Parametryzacja

RC
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:5
0

Nie do końca rozumiem jak parametryzacja zapobiega takim sytuacjom: https://xkcd.com/327/

Czy jeśli wstawimy pana Drop TABLE do pstmt.setString(1, nazwa); to nie wyjdzie na to samo?

danek
  • Rejestracja:ponad 10 lat
  • Ostatnio:7 miesięcy
  • Lokalizacja:Poznań
  • Postów:797
0

A nie ma jakiejś walidacji parametrów pod spodem?


Spring? Ja tam wole mieć kontrole nad kodem ᕙ(ꔢ)ᕗ
Haste - mała biblioteka do testów z czasem.
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 3 godziny
  • Postów:3603
2

To nie jest pytanie z Javy, ale z SQLa i zależy od bazy danych i tego, jak procesowane są zapytania. Każdy SQL przed wykonaniem musi być skompilowany. W większości silników może zostać skompilowany do Query lub ParametrizedQuery.

Przykładowo dla Oracle'a jeśli chcesz znaleźć studenta o imieniu "SOME STRING" to możesz to zapisać na dwa sposoby:

Kopiuj
SELECT * FROM STUDENT WHERE FIRST_NAME = 'SOME STRING';
-- lub
SELECT * FROM STUDENT WHERE FIRST_NAME = :some_name;
-- a potem za :some_name podstawić 'SOME STRING'

Różnica w pierwszym przypadku jest taka, że Oracle kompiluje całe zapytanie z warunkiem FIRST_NAME = 'SOME STRING' włącznie.
W drugim przypadku skompilowane zapytanie zawiera parametry, tzn. wszystkie parametry które podasz już nie zostaną skompilowane - jedynie podstawione w odpowiednie miejsce.

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:12 minut
1
RAwtC napisał(a):

Nie do końca rozumiem jak parametryzacja zapobiega takim sytuacjom: https://xkcd.com/327/

Czy jeśli wstawimy pana Drop TABLE do pstmt.setString(1, nazwa); to nie wyjdzie na to samo?

Nie wyjdzie. bo PreparedStatement nie jest potem klejony do pojedynczego Stringa. PreparedStatement leci prosto do sterownika do bazki, który to dokładnie określa bazce co jest parametrem, a co składnią zapytania. Dodatkowym plusem PreparedStatement jest to, że bazka może sobie keszować plan wykonania (execution plan), bo przy każdym wywołaniu pstmt leci dokładnie takie samo zapytanie, np "SELECT * FROM users WHERE name = ?".


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.