內容源於
https://blog.csdn.net/weixin_34452850/article/details/88991943 和
https://blog.csdn.net/LoveInWar/article/details/89646085 總結
簡單來說 #{} 在預編譯時將參數 使用占位符 ? 代替,然后再實際執行時,會在value左右加入引號,以字符串的方式處理。這樣 就可以防止惡意的sql注入
select * from user where username = "10000 or 1 = 1";
而 ${} 只是簡單的字符串替換,這樣sql會變成
select * from user where username = 10000 or 1 = 1;
因為 1 = 1恆成立,那么不管username是否等於10000 ,都可以查詢到所有的數據。這樣sql就被惡意注入了。
Mybatis的預編譯會將編譯后的SQL緩存起來,再次遇到相同的SQL會直接使用不會再次編譯
預編譯階段可以對sql語句進行優化;
預編譯可以將多個操作步驟合並成一個步驟,一般而言,越復雜的sql,編譯程度也會復雜,難度大,耗時,費性
能,而預編譯可以合並這些操作,預編譯之后DBMS可以省去編譯直接運行sql。