Junior
Ποια είναι η διαφορά μεταξύ PreparedStatement και Statement;
sobes.tech AI
Απάντηση από AI
Το Statement χρησιμοποιείται για την εκτέλεση στατικών ερωτημάτων SQL. Συμπιέζεται κάθε φορά που εκτελείται.
Το PreparedStatement χρησιμοποιείται για την εκτέλεση παραμετροποιημένων ερωτημάτων SQL. Το ερώτημα συμπιέζεται μία φορά κατά τη δημιουργία του αντικειμένου PreparedStatement και μπορεί να εκτελεστεί πολλές φορές με διαφορετικές τιμές παραμέτρων.
Βασικές διαφορές:
| Χαρακτηριστικό | Statement | PreparedStatement |
|---|---|---|
| Απόδοση | Συμπιέζεται σε κάθε εκτέλεση. | Συμπιέζεται μία φορά. Είναι πιο αποδοτικό στην επανάχρηση. |
| Ασφάλεια | Ευάλωτο σε SQL injection μέσω συγχώνευσης συμβολοσειρών. | Προστατεύει από SQL injection μέσω αυτόματης διαφυγής παραμέτρων. |
| Παράμετροι | Δεν υποστηρίζει παραμετροποιημένα ερωτήματα. | Υποστηρίζει παραμετροποιημένα ερωτήματα (?). |
| Αναγνωσιμότητα | Μικρότερη αναγνωσιμότητα με πολλά δεδομένα. | Πιο αναγνώσιμο με παραμέτρους. |
Παράδειγμα χρήσης Statement:
// Παράδειγμα με Statement (ευάλωτο σε SQL injection)
String user = "admin";
String pass = "' OR '1'='1"; // Παράδειγμα SQL injection
String query = "SELECT * FROM users WHERE username = '" + user + "' AND password = '" + pass + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
Παράδειγμα χρήσης PreparedStatement:
// Παράδειγμα με PreparedStatement (προστατευμένο από SQL injection)
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();