Mybatis中${}和#{}取值的区别
相同点:
- #:可以获取map中的值或者pojo对象属性的值;
- ${}:可以获取map中的值或者pojo对象属性的值;
区别:
-
#{}:是以预编译的形式,将参数设置到sql语句中,PreparedStatement;防止sql注入
-
$:取出的值直接拼装在sql语句中;会有安全问题;
-
效果实例
-
select * from tbl_employee where id=${id} and last_name=#{lastName}
-
Preparing: select * from tbl_employee where id=2 and last_name=?
-
使用注意事项:
-
虽然#{}可以防止sql注入,但是也不是说所有sql都必须要使用#{}来传递参数
-
#{}只支持原生jdbc的所有的参数替换,比如
-
select * from tbl_employee where id=${id} and last_name=#{lastName}
-
这里面的
id
位置和last_name
位置属于正常的额参数,但是如果想要动态修改tbl_employee
这个表名 #{} 就做不到
-
-
所以我们在大部分的情况下使用的是#{}取值
-
在原生jdbc不能修改并且需要拼接的时候使用${}
-
比如分表、排序。。。﹔按照年份分表拆分
-
select *from $iyearl_salary where XXX3 select * from tbl_employeeorder by $if_name} ${order}
-
#{}更丰富的用法
-
规定参数的一些规则:
-
javaType、jdbcType.mode(存储过程)、numericScale、resultMap、typeHandler、jdbcTypeName、expression(未来准备支持的功能)﹔
-
在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如Oracle(报错)
-
JdbcType OTHER:无效的类型,因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型,但是orcale不支持
-
jdbcType通常需要在某种特定的条件下被设置:
-
由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持,两种办法
-
1、传参的时候
-
#{email,jdbcType=OTHER};
-
2、jdbcTypeForNu1l=NULL(这个在mybatis-config.xml中的setting标签中配置)
-
<setting name="jdbcTypeForNull" value="NULL"/>|
-
-
-