一、问题出现场景
- 在使用 Mybatis ,设置映射文件中 SQL 语句的时候,对于传入参数的接收方式有不同的方式:${ } 与 # { }
- 在进行 SQL 拼接的时候,发现对于传递进来的同一个对象,当查询使用的 SQL 语句不同时候,对这两者的选择也不同
二、问题思考
- 首先,两者都是接收参数的选择
- 那么顺理成章的就想到,两者应该会有各自适合的情景,也可能两者是新旧方法
- 因此考虑队两者进行一些总结,包括两者的共同点,以及各自的应用场景,使用频率,各自优缺点等
三、两者比较
1. 相同点
- 两者都是对于映射文件中 SQL 传入参数接收的选择
- 二者都能够接收到传递过来的数据
2.差异
- 以简单的一个 sql 语句为例: select * from user where uid=? (假设传递过来的参数就 id 值为 1)
- 对于 #{ }:
- sql 写法 :select * from user where uid= #{ id }
- 实际 sql :select * from user where uid= ’ 1 ’
- 对于 ${ }:
- sql 写法:select * from user where uid= ${ id }
- 实际 sql:select * from user where uid= 1
- 可以明显看到,最直接的差异在于使用 #{ } 时候,会对参数加单引号的处理,而 ${ } 则是直接进行拼接
3.各自特点
- 使用 #{ } 方式可以很大程度上防止sql注入
- 但是如果 sql 语句为查询某个表,例如 order by,又例如必须模糊查询中 ,本身就已经带了 ’ ',此时再带引号会引起报错等情况下,应该选择使用 ${ }
4. 总结
- 通常情况下,应该尽量选择使用 #{ } ,以避免可能出现的 sql 注入的情况发生