Mybatis中#和$的区别及应用

(一)#和$的区别

  • #{}
  1. 可以进行预编译处理,会被当成?号,调用PreparedStatement的set方法来赋值;
  2. 可以防止sql注入;
  3. 传入的参数在sql中被看成一个字符串,会对传入的数据自动加引号,例如:
select id,name,age from user where id =#{id};

当参数id传入的值是“1”时,上述sql解析为:

select id,name,age from user where id =1’;
  • ${}
  1. 不会进行预编译处理,是普通的占位符;
  2. 不能防止sql注入;
  3. 传入的参数在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等。

原文地址:https://www.cnblogs.com/xmm2017/p/13943873.html