2015-04-21 221 views
-1

我正在研究這個jsp項目,出於顧問告訴我們使用準備好的聲明,因爲它比sql語句安全。但他在mysql記錄插入狀態中提到它。
wHEN我使用select mysql選擇查詢我通常用於語句。但是,隨着新的想法,我更願意準備發言。兩者都工作得很好。
還有什麼是最好的事情。
當使用聲明..
什麼是最準確的;聲明VS準備好的聲明

try{      
    Resultset rs2 = dbCon.createStatement().executeQuery("select max(grn_id) from grn"); 
     if (rs2.first()) { 
         int grn_id = rs2.getInt(1); 
     } 
    catch(Exception e){ 
     e.printstacktrace(); 
    } 


當使用事先準備好的聲明..

Connection con = null; 
    PreparedStatement ps = null; 
    ResultSet rs = null; 
    String sql = "select * from item where name=?"; 

    try { 
     con = db.getConnection(); 
     ps = con.prepareStatement(sql); 
     ps.setString(1, name); 
     rs = ps.executeQuery(); 
     while (rs.next()) { 
          int grn_id = rs.getInt(1); 
     }catch(Exception e){ 
     e.printstacktrace(); 
    } 


謝謝。

+0

也不是「更準確」。他們都服從相同的語義。 – EJP

+0

@EJP但他們說準備好的聲明對安全性有好處。對? –

回答

1

您正在徵求意見。這總是很困難的: 這兩個陳述(在所示的上下文中!)和準備好的陳述都是安全的。根據您的DBMS及其設置,準備好的語句有1個好處: DBMS可以在內部回收預準備語句及其執行,從而節省查詢準備時間(即使每次都重新創建語句)。所以當名字是1或名字是2時,它會節省你的時間(在大多數情況下)。我們在這裏談論100秒到10秒。

當使用該語句時,只有在它完全相同(名稱= 1)時纔會重新使用,或者在SQL Server將其轉換爲「prepared」語句的情況下(參數替換由SQL Server內部執行:確定查詢計劃時花費的時間更少,但每次查詢可能花費您1/10000秒)。 Oracle與這些語句做了類似的事情。

該語句的執行效果比準備好的語句要好: 在某些情況下,數據分佈是這樣的,例如name = 1會給出1MLN結果,在這種情況下,優化器選擇使用索引掃描,但是name = 2給出了一個結果,其中索引查找會更好,並且優化器會選擇該計劃。 然而,在準備好的語句中,第一個選擇的計劃用於所有連續執行,因此範圍掃描也將用於查找name = 2,這比正常查找要快。

+0

謝謝你的精彩答案。 –