2014-01-27 27 views
1

我讀過Give me Parameterized SQL or give me death很多次。PreparedStatement#setInt vs inline SQL有沒有優勢?

參數化SQL對字符串,日期和浮點數的優點非常明顯且無可爭議。

我的問題是:int s?

我問,因爲,通常情況下,如果我正在編寫查詢或更新,並且唯一的參數是int,我只需編寫內聯sql並將int作爲快捷鍵("select * from table where id = " + id)添加即可。

我的問題:僅對int s單獨使用參數化SQL有什麼好處?

與Java說明:

是否有任何優勢,這一點:

Connection conn; 
int id; 
String sql = "select * from table where id = ?"; 
try (PreparedStatement p_stmt = conn.prepareStatement(sql)) { 
    p_stmt.setInt(1, id); 
    ResultSet results = p_stmt.executeQuery(); 

    // ... 
} catch (SQLException e) { 
    // ... 
} 

在這個:

Connection conn; 
int id; 
String sql = "select * from table where id = " + id; 
try (Statement stmt = conn.createStatement()) { 
    ResultSet results = stmt.executeQuery(sql); 

    // ... 
} catch (SQLException e) { 
    // ... 
} 

回答

1

我要說最大的好處是一致性。如果您決定通過字符串連接構建的所有SQL都是「錯誤的」,那麼與例如「通過字符串連接構建的所有SQL都是錯誤的,除了將ints作爲參數進行處理之外的規則相比,驗證代碼是否」正確「更容易」。

另一種情況,說:向下行,你想介紹排序或分組的查詢,突然,你的行會變成這樣:

String sql = "select * from table where id = " + id + " order by somecolumn"; 

,希望你order想起以前的空間。而且你之後的每個人也都這樣做。

對於做事只有一種方式,特別是在大多數情況下這種方式是正確的。

+0

很好的答案。我同意,一致性很重要。 – ryvantage