在mybatis中,sql使用 #{} 和 ${} 都是可以获取map中的值或者pojo对象属性中的值。那么接下来就说明一下他们的区别。
mapper.xml中sql
select * from employee where id = ${id} and name = #{name}
使用log4j将语句输出到控制台:
select * from employee where id = 2 and name = ?
区别:
#{}:是以预编译的形式,将参数设置到sql语句中的;能够防止sql注入;
${}:取出的值直接拼装在sql语句中;会有安全问题;
使用:
大多数情况下,我们都应该使用#{};
但是当原生jdbc不支持占位符的地方我们就应该使用${}来取值
比如:(不止以下两种...)
(1)分表:查找某一年的工资,比如2018_salary,2019_salary这种,我们需要将年份直接拼接在sql语句中
select * from ${year}_salary ;
(2)排序
select * from employee order by ${字段} ${排序方式}
#{}:更丰富的用法
能够规定参数的一些规则:
比如:javaType,jdbcType,mode,resultMap,jdbcTypeName等
稍微记录一下jdbcType的用法,其他几个我好像没咋用到....
jdbcType通常需要在某种特定的条件下被设置:
在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如ORACLE(会报错)
因为在全局配置文件中 :jdbcTypeForNull =OTHER ;导致mybatis对所有的null都映射的是原生jdbc的OTHER类型。但是oracle并不支持这种类型,所以会导致报错。有两种方法解决:
(1)设置全局配置文件:
jdbcTypeForNull = NULL;修改他的默认处理
(2)规定参数的规则
#{name , jdbcType=NULL};只会影响当前sql数据为null时候的默认处理