Sobes.tech
Junior

Фарқи байни PreparedStatement ва Statement чист?

sobes.tech AI

Ҷавоб аз AI

Statement барои иҷрои дархостҳои статикӣ SQL истифода мешавад. Он ҳар бор дар вақти иҷро компилируется. PreparedStatement барои иҷрои дархостҳои параметрӣ SQL истифода мешавад. Дархост як бор дар вақти сохтани объект PreparedStatement компилируется ва метавонад бо арзишҳои гуногуни параметрҳо такрор ба такрор иҷро шавад.

Фарқиятҳои асосӣ:

Хусусият Statement PreparedStatement
Камарзишӣ Ҳар бор дар вақти иҷро компилируется. Як бор компилируется. Барои такрор истифода кардан самараноктар аст.
Бехатарӣ Заҳр дар SQL injection тавассути пайваст кардани сатрҳо. Меҳвар ба SQL injection тавассути автоматии escape кардани параметрҳо.
Параметрҳо Пайваст кардани дархостҳои параметрӣ нест. Пайваст кардани дархостҳои параметрӣ (?).
Фаҳмидан Камтар фаҳмо дар кор бо миқдори зиёди маълумот. Беҳтар фаҳмо дар кор бо параметрҳо.

Масалан истифодаи 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();