mybatis中的#{}和$()的理解
1.#{}和${}的編譯時期不同,#{}是利用prepareStatement先進行預編譯,在引數位置形成一個佔位符?,之後再將引數傳入到佔位符進行執行sql。而${}是利用statement物件來執行sql。引數是直接替換掉${}的符號。
2.PreparedStatement是java.sql包下面的一個介面,PreparedStatement用於執行動態sql,通過呼叫connection.preparedStatement(sql)方法可以獲得PreparedStatment物件,多次執行sql速度較快,因為PreparedStatment先對sql進行預編譯一次,後面不同的引數值直接傳入即可,無需在次預編譯。
3.Statment通常用於執行靜態sql,通過呼叫connection.createStatement()方法獲取Statment物件,執行單次sql速遞較快,因為Statment不會進行預編譯,直接將引數替換後編譯。
4.#{}裡面的值都會被當做字串替換,而${}裡面的值是傳入是什麼值就是什麼值,不會強制轉成字串替換,這就是#{}可以防止sql注入的原因,而${}不能防止sql注入的原因。
5.在簡單的明瞭的說明下為什麼#{}可以防止sql注入:因為PreparedStatement執行sql時引數裡有敏感字元如 or '1=1',資料庫也會作為一個引數一個欄位的屬性值來處理,而不會作為一個SQL指令,如此,就起到了SQL注入的作用了!而Statement執行sql時會將or '1=1'作為一個sql指令來執行,這就會導致使用者sql注入刪除資料庫的情況了,最重要的還是sql是否進行了預編譯。
6.最後說下就是order by後面尾隨的值如果是傳入的引數,最好用的是${}來表示。