1. #{}形式
Mybatis会将SQL语句中的#{}转换为问号占位符。
例如,现在有如下sql语句,根据员工Id查询员工信息。
select emp_id, emp_name, emp_salary
from t_emp where emp_id = #{empId}
那么,Mybatis会先用占位符来代替#{},也就是将上述sql语句转为:
select emp_id, emp_name, emp_salary
from t_emp where emp_id = ?
之后,直接用参数id的值将占位符?替换掉,得到最终执行的sql语句。
2. ${}形式
${}形式传参,底层Mybatis做的是字符串拼接操作。
例如,现在有如下sql语句,根据员工Id查询员工信息。
select emp_id, emp_name, emp_salary
from t_emp where emp_id = #{empId}
Mybatis会把sql语句中不含参数的字符串与参数字符串拼接,相当于:
'select emp_id, emp_name, emp_salary
from t_emp where emp_id = ' + '参数'
得到最终执行的sql语句。
3. 总结
- 通常不会采用${}的方式传值,因为其无法抵御sql注入攻击。
- 如果列名或者关键字也需要动态参数传入,那么#{}无法在这种场景下使用,因此只能使用${}。