#{}和${}的不同

#{}${}的不同

这两种写法的效果是一摸一样的,但是,它们也有不相同的地方。

处理方式不同

${}相当于字符串的拼接。

#{}相当于在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}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章