#{}和${}的不同

#{}${}的不同

這兩種寫法的效果是一摸一樣的,但是,它們也有不相同的地方。

處理方式不同

${}相當於字符串的拼接。

#{}相當於在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,這個是從視頻中學到的,防止踩坑,在此記錄)

解決方式:

  1. 在全局配置中,設置對null值的處理
<settings>
	<setting name='jdbcTypeForNull'  value='NULL'/>
</setting>
  1. #{}中添加選項
#{參數, jdbcType=NULL}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章