在mybatis中,${param}這樣格式的參數會直接參與sql編譯,從而不能避免注入攻擊。但涉及到動態表名和列名時,只能使用${param}這樣的參數格式,因此,這樣的參數須要程序開發者在代碼中手工進行處理來防止注入。sql
#{param} 表明param是屬性值,map裏面的key或者是你的pojo對象裏面的屬性, mybatis會自動在它的外面加上引號,表如今sql語句是這樣的 where column = 'param' ;mybatis
${param} 則是把param做爲字符串拼接到sql語句中, 好比 order by topicId ,spa
語句這樣寫: order by #{param} , mybatis 就會翻譯成 order by 'topicId' (這樣就會報錯)翻譯
語句這樣寫 ... order by ${param} , mybatis 就會翻譯成 order by topicId對象
#:將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,若是傳入的值是111,那麼解析成sql時的值爲order by "111", 若是傳入的值是id,則解析成的sql爲order by "id". 開發
$:將傳入的數據直接顯示生成在sql中。如:order by $user_id$,若是傳入的值是111,那麼解析成sql時的值爲order by user_id, 若是傳入的值是id,則解析成的sql爲order by id字符串