為什麼要使用引數化查詢呢?引數化查詢寫起來看起來都麻煩,還不如用拼接sql語句來的方便快捷。當然,拼接sql語句執行查詢雖然看起來方便簡潔,其實不然。遠沒有引數化查詢來的安全和快捷。
今天剛好了解了一下關於Sql Server 引數化查詢和拼接sql語句來執行查詢的一點區別。
引數化查詢與拼接sql語句查詢相比主要有兩點好處:
1、防止sql注入
2、 提高效能(複用查詢計劃)
首先我們來談下引數化查詢是如何防止sql注入的這個問題吧。
防注入例子:
拼接sql語句:
("select * from user where name={0}",username) 或者 ("select * from user where name="+username)
當 name傳進來是一個'aa';Truncate Table user 的時候,這樣會導致直接清除整個表資料
"select * from user where name='aa';Truncate Table user
我們使用引數化的時候:
("select * from user where name=@username",new {username=username})
這時候即使我們傳進來的是'aa';Truncate Table user ,資料庫端也會把這些當做字串處理,執行的sql語句會變成
select * from user where name=''aa';Truncate Table user '
實際上把'aa';Truncate Table user 這個當做了name的值做查詢條件了
以上就是一個簡單的例子介紹關於引數化查詢如何防止sql注入。
再看到底是如何提高效能的呢?
複用查詢計劃:
select * from AU_User where Id=1 select * from AU_User where Id=2
Sql Server在執行一條查詢語句之前都對對它進行“編譯 ”並生成“查詢計劃”,上面兩條查詢語句生成的查詢計劃就是兩條不一樣的查詢計劃,在下面這張圖片當中我們可以去嘗試下執行這兩條sql語句
,結果顯而易見會生成兩條查詢計劃,Id後面所接的引數不一致。
然後我們再來看看使用引數化查詢
select * from AU_User where Id=@Id
這樣不管你傳的引數是多少,執行編譯生成的查詢計劃都是 select * from AU_User where Id=@Id,這樣可以實現查詢計劃的複用,並不需要同一個查詢去生成多個查詢計劃
完全可以節省其中生成查詢計劃的時間