Mybatis中#和$的区别及应用
(一)#和$的区别
- #{}
- 可以进行预编译处理,会被当成?号,调用PreparedStatement的set方法来赋值;
- 可以防止sql注入;
- 传入的参数在sql中被看成一个字符串,会对传入的数据自动加引号,例如:
select id,name,age from user where id =#{id};
当参数id传入的值是“1”时,上述sql解析为:
select id,name,age from user where id =‘1’;
- ${}
- 不会进行预编译处理,是普通的占位符;
- 不能防止sql注入;
- 传入的参数在sql中直接替换成变量的值,例如:
select id,name,age from user where id =${id};
当参数id传入的值是“1”时,上述sql解析为:
select id,name,age from user where id =1;
(二)何时使用#{},何时使用${}?
大多数情况下还是经常使用#,一般能用#{}
的就不用${}
。
既然#{}
有预编译功能,能防止sql 注入,那为什么还要使用${}
呢?请看下面sql语句能用#{}传递参数吗?
SELECT * FROM #{tableName};
假如tableName传入的值是user,那么解析后的sql是这样的:
SELECT * FROM 'user';
到mysql控制台试一下,会报1064
错误,这种情况下就必须使用${}
,还是上面的语句使用$传参:
SELECT * FROM ${tableName};
解析后的sql可以正常执行:
SELECT * FROM user;
凡是sql中不能添加引号的值动态传参时都必须使用${}
,像order by,group by等。