Junior
Care este diferența dintre PreparedStatement și Statement?
sobes.tech AI
Răspuns de la AI
Statement este utilizat pentru executarea interogărilor SQL statice. Se compilează de fiecare dată când este executat.
PreparedStatement este utilizat pentru executarea interogărilor SQL parametrizate. Interogarea este compilată o singură dată la crearea obiectului PreparedStatement și poate fi executată de mai multe ori cu valori diferite ale parametrilor.
Diferențele principale:
| Caracteristică | Statement | PreparedStatement |
|---|---|---|
| Performanță | Se compilează de fiecare dată la execuție. | Se compilează o singură dată. Este mai eficient pentru reutilizare. |
| Securitate | Vulnerabil la injecții SQL prin concatenarea stringurilor. | Protejează împotriva injecțiilor SQL prin escaparea automată a parametrilor. |
| Parametri | Nu suportă interogări parametrizate. | Suportă interogări parametrizate (?). |
| ** lizibilitate** | Mai puțin lizibil cu cantități mari de date. | Mai lizibil când se folosesc parametri. |
Exemplu de utilizare a Statement:
// Exemplu cu Statement (vulnerabil la injecții SQL)
String user = "admin";
String pass = "' OR '1'='1"; // Exemplu de injecție SQL
String query = "SELECT * FROM users WHERE username = '" + user + "' AND password = '" + pass + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
Exemplu de utilizare a PreparedStatement:
// Exemplu cu PreparedStatement (protejat împotriva injecțiilor SQL)
String user = "admin";
String pass = "' OR '1'='1";
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, user);
pstmt.setString(2, pass);
ResultSet rs = pstmt.executeQuery();