《Mybatis学习-7》 # 和 $ 的区别

85 阅读1分钟

在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时候的默认处理