#{}
与${}
的区别
#{}
是预编译处理,${}
是字符串替换Mybatis在处理#{}时,会将sql中的#{}替换为?号, 调用PreparedStatement的set方法来赋值;
Mybatis在处理 时 , 就 是 把 {}时,就是把 时,就是把{}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
再通俗的说,使用${}
mybatis会把参数加上双引号,而${}
你给啥,sql语句中就是啥,如下示例:
select * from table where name = #{name} name->小明
## 结果:select * from table where name = "小明"
select * from table where name = ${name} name->小明
## 结果:select * from table where name = 小明
问题
最近有个功能需要从sqlserver中去数据,有个脚本很简单如下:
select * from table where id in(...)
id已经创建索引了,考虑到数据传输,我每次设置的集合大小为100个,因为这是再简单不过的语句了,直接上线给别人使用,但是别人的反馈是,使用50个id需要40多秒!!! 这就有点吓人了,幸好此场景只是在半夜定时的去使用,慢一点不会对第二天有影响,但是白天想要测试的时候就懵了。当然了40多s就别提是否影响别人使用了,基本上就已经崩溃了好不好!!!
这就有点吓人了,幸好此场景只是在半夜定时的去使用,慢一点不会对第二天有影响,但是白天想要测试的时候就懵了。当然了40多s就别提是否影响别人使用了,基本上就已经崩溃了好不好!!!
下面简化了一下,对应的xml代码如下:
<select id="selectTbdIdByLbdIdList" resultType="xxx.xxx.xxMapper">
SELECT id ,tid FROM table where id IN
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</select>
debug 模式下的输出如下:
| ==> Preparing: SELECT id ,tid FROM table where id IN ( ?,?,?,?,?,?...)
| ==> Parameters: 123(String),234(String),345(String),456(String),
| <== Total: ....
我把sql整理出来放在sqlserver客户端去执行
SELECT id ,tid FROM table where id IN ( "123","234","345"...);
刚开始执行报错了,后面把双引号改成单引号就行了,即
SELECT id ,tid FROM table where id IN ( '123'