Junior
Kuo skiriasi PreparedStatement nuo Statement?
sobes.tech AI
Atsakymas iš AI
Statement naudojamas vykdyti statinius SQL užklausas. Jis kompiliuojamas kiekvieną kartą vykdant.
PreparedStatement naudojamas vykdyti parametrizuotas SQL užklausas. Užklausa yra kompiliuojama vieną kartą kuriant PreparedStatement objektą ir gali būti vykdoma daug kartų su skirtingomis parametrų reikšmėmis.
Pagrindiniai skirtumai:
| Savybė | Statement | PreparedStatement |
|---|---|---|
| Našumas | Kiekvieno vykdymo metu kompiliuojamas. | Vieną kartą kompiliuojamas. Daugkartinis naudojimas yra efektyvesnis. |
| Saugumas | Pažeidžiamas SQL injekcijoms dėl stringų sujungimo. | Apsaugo nuo SQL injekcijų automatiškai apdorodamas parametrus. |
| Parametrai | Nepalaiko parametrizuotų užklausų. | Palaiko parametrizuotas užklausas (?). |
| ** Skaitymas** | Mažiau skaitomas dirbant su dideliu duomenų kiekiu. | Lengviau skaitomas dirbant su parametrais. |
Statement naudojimo pavyzdys:
// Statement pavyzdys (pažeidžiamas SQL injekcijoms)
String user = "admin";
String pass = "' OR '1'='1"; // SQL injekcijos pavyzdys
String query = "SELECT * FROM users WHERE username = '" + user + "' AND password = '" + pass + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
PreparedStatement naudojimo pavyzdys:
// PreparedStatement pavyzdys (apsaugotas nuo SQL injekcijų)
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();