#{}
和${}
的不同
這兩種寫法的效果是一摸一樣的,但是,它們也有不相同的地方。
處理方式不同
${}
相當於字符串的拼接。
#{}
相當於在sql語句中使用?
佔位符,然後給這個佔位符設置值。
丨從安全角度將,${}
有被SQL注入的風險,而#{}
不會被注入。使用#{}
時,默認會使用預編譯的語句(PreparedStatement)丨
${}
可以出現在SQL語句任何地方
由於${}
是字符串拼接,則它可以出現在sql語句的任何地方;但是#{}
只能出現在佔位符?
出現的地方。
舉例:${}
可以動態的設置表名或者列名
@Select("select * from user where ${column} = #{value}")
User findByColumn(@Param("column") String column, @Param("value") String value);
#{}
可以添加選項
可以選擇的參數如下:
- javaType
- jdbcType
- mode
- numericScale
- resultMap
- typeHandler
- jdbcTypeName
jdbcType
引用官方文檔:
JDBC 要求,如果一個列允許使用 null 值,並且會使用值爲 null 的參數,就必須要指定 JDBC 類型(jdbcType)。
Mybatis對null的默認處理是將它映射爲OTHER類型,但是有些數據庫不支持這個類型(例Oracle),所以,默認情況下,null類型會是Oracle數據庫報錯。(沒用過Oracle,這個是從視頻中學到的,防止踩坑,在此記錄)
解決方式:
- 在全局配置中,設置對
null
值的處理
<settings>
<setting name='jdbcTypeForNull' value='NULL'/>
</setting>
- 在
#{}
中添加選項
#{參數, jdbcType=NULL}