1. #{} 将传入的数据当成是一个字符串,会在替换的时候加上引号。
select * from user where id = #{id};
select * from user where id = "user-123456789";
解析后的结果会自动带上引号。
同时在某些情况下,就不能使用 #{}
比如 order by,之后只能跟 ${}
2. ${} 会将传入的数据直接放入sql 中
select * from user where id = ${user};
select * from user where id = user-123456789;
虽然是没有引号,但是语句可以执行。
此方式不能防止注入,比如:
select * from user where id = user-123456789 or 1=1;
同时,order by 之后就必须使用 ${}
order by age
3. ${}一般用于传入数据库对象,例如传入表名。能用 #{} 的地方就不要使用 ${}
4. mybatis 中进行动态解析的时候,会将 #{} 解析为 占位符?,会将 ${} 直接进行替换。
#{} 的参数替换是发生在 DBMS(数据库管理系统) 中,而 ${} 则发生在动态解析过程中。