在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时候的默认处理
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/16877.html