我有一個帶有簡單查詢的靜態方法,用于檢查 ID 是否已存在于資料庫中:
public static boolean isPersisted(Integer id) {
String sql = "select id from table where id = ?;
我知道它們可以防止 SQL 注入,并且我知道它們在回圈插入帶有 ID 串列的插入時提供了很大的好處(例如)但是,在這里使用準備好的陳述句是否有任何性能/記憶體好處?
uj5u.com熱心網友回復:
在這里使用準備好的陳述句對性能/記憶體有什么好處嗎?
當您必須使用不同的資料多次運行相同的陳述句時,準備好的陳述句要快得多。這是因為 SQL 只會驗證查詢一次,而如果您只使用一條陳述句,它將每次都驗證查詢。
可以在這篇文章中找到原因和發生的事情的詳細資訊
uj5u.com熱心網友回復:
如果查詢只執行一次,并且id是為應用程式本身干凈地生成的(例如作為簡單的計算結果),則準備好的陳述句沒有任何好處。
如果必須使用各種id值多次執行查詢,則使用準備好的查詢將獲得很高的性能增益,因為該查詢只會被 sql 引擎決議一次。
如果id引數來自用戶界面,則必須使用準備好的陳述句,除非您打算容易受到SQL Injection 的攻擊。長話短說,它曾經是一種針對編碼不當的 Web 應用程式的常見攻擊,并允許攻擊者執行任意 SQL 命令。
uj5u.com熱心網友回復:
基本上準備好的陳述句不易受到 SQL 注入的影響,并且在查詢回應時間方面更快。
我認為你正在尋找這樣的東西:
public static boolean isPersisted(Integer id) {
String sql = "select id from table where id = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, id);
uj5u.com熱心網友回復:
PreparedStatements 是預編譯的。這意味著已驗證、轉義和快取(有關PreparedStatement此問題中 a 的預編譯的更多詳細資訊,當我說 Prepared 陳述句是預編譯的時是什么意思?)
預編譯意味著所有作業只完成一次,避免了每次執行查詢時的所有成本。
但與往常一樣,如果使用得當,魔法就完成了。您可以創建一個PreparedStatementwithString連接,但要注意最終 String 中的任何更改都將導致新的預編譯(從而失去好處)。
SQL 注入也是如此。始終使用占位符?。如果你在 a 中連接字串PreparedStatement(沒有什么可以阻止你做這樣的事情),你很容易陷入 SQL 注入,例如:
connection.prepareStatement("Select * from MY_TABLE where email = '" userInputEmail "'")
切勿執行上述操作。是PreparedStatement,但可以被 SQL 注入。
因此,要從PreparedStatements正確使用它們中受益。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/354180.html
上一篇:將字串添加到掃描儀中
