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注入攻击。
- 如果列名或者关键字也需要动态参数传入,那么#{}无法在这种场景下使用,因此只能使用${}。
本文介绍了MyBatis中#{}和${}两种传参形式。#{}会将其转换为问号占位符,再用参数值替换占位符;${}则是进行字符串拼接。通常不建议用${}传值,因其无法抵御SQL注入攻击,但列名或关键字需动态传入时,只能用${}。

被折叠的 条评论
为什么被折叠?



