一、一句话总结
#{} 是编译好SQL语句再进行取值和赋值
${} 是先进行取值赋值后再编译生成sql语句
二、两者比较
- #{}这种方式很大程度上能够防止sql注入,原因见下面例子
- ${}方式无法防止sql注入
- 一般能用#{}的就不要用${}
- MyBatis排序时使用order by 动态参数时需要注意,用${}而不是#{}
- 可以用${}传一个固定不变的字符串,不会转义
三、简单例子
例如这样一个常见的sql语句:
select from user where id=#{id}
预编译后,会动态解析成一个参数标记符?:
①先编译sql语句:select * from user where id=?
②再取值并赋值:select * from user where id=1;
select from user where id=${id}
使用${}在动态解析时候,会直接传入参数字符串
①取值之后直接生成完整的sql语句:select * from user where id=1;