#{}與${}的區別
#{}
是預編譯的方式,相當於jdbc的占位符PrepareStatement,
一個#{}就是一個占位符
mybatis在為#{}設置值時,會加引號
${} 模糊查詢時不用
直接拼接的方式,不對數值做預編譯
mybatis在為${}設置值時,不加引號
存在sql注入的現象
只有在不支持占位符的時候才使用,比如需要列名的地方,同時獲取傳來的數據時要做校驗
例如:
查詢排序的處理
需要列名的地方,在原生jdbc開發中,不可以預編譯
因為預編譯會給值加上引號,需要列名的是直接進行拼接的
public List<Message> selectOrderBy(String column);
<include refid="BaseSql"/> order by #{column} desc 錯誤,沒排序
<include refid="BaseSql"/> order by ${column} desc
mybatis對原生sql不支持占位的地方,接收參數的話,用${}
${}是一個拼接sql的方式,存在SQL注入的現象
傳什么就拼什么