#{}
和${}
的不同
这两种写法的效果是一摸一样的,但是,它们也有不相同的地方。
处理方式不同
${}
相当于字符串的拼接。
#{}
相当于在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}