Mybatis學習第三彈
今天正好學到#{}和${}取值,想到之前面試的時候面試官問 Mybatis 裡面的佔位符是什麼,自己傻傻地說了一個 % ,希望你看完以後不要再犯跟我一樣的錯誤了
1、#{} 是Mybatia 中的佔位符,它是以預編譯(PrepareStatement)的形式,將引數用特定值(“?”)設定到SQL語句中,同時能有效的防止SQL注入;
2、${} 是Mybatis中的拼接符,採用直接將取出的值拼裝到SQL語句中的方式,這種方式會有SQL注入的風險;
在大多數情況下,我們都應該採用#{}的方式來取值,但是在原始JDBC不支援佔位符的時候,我們就需要採用${}的方式取值,比如取分表表名、排序欄位,按照年份分表拆分:
select * from ${year}_salary where xxx
select * from tbl_employee order by ${f_name} ${order}
此外,#{}還具有更豐富的用法,比如規定傳入引數的一些規則;這些規則包括:javaType mode(儲存過程) numericScale resultMap typeHandler jdbcTypeName expression(未來支援)
例如jdbc在某些特定情況下需要被設定,當資料為 null 時,有些資料庫可能無法識別Mybatis 對 null 的預設處理,比如 oracle 資料庫;由於 Mybatis 預設對所有的 null 都對映為原生 jdbc 的 OTHER 型別,但 oracle 並不支援這種型別,所以此時需要通過明確指定 jdbcType=null 或修改 Mybatis 全域性配置檔案 jdbcTypeForNull=null(在使用多個數據庫廠商的產品時不推薦使用此方法,單一使用 oracle 時推薦使用此方法)來讓 oracle 能識別 null 值。
關注微信公眾號:Javall咖啡屋 每天更新各種技術學習心得體會