动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。

在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现:

  • #{name}被解析为占位符,变量的替换是在 DBMS
  • '${name}'是简单的字符串替换,替换阶段是在动态 SQL 解析阶段。 有sql注入的风险。

参考https://segmentfault.com/a/1190000004617028