Mybatis中的 ${ } 和 #{ }的区别
动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。
#{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:
select * from menu where menu_name = ?;
${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句:
select * from menu where menu_name = menu1;
这个时候数据库将会把menu1当做一个字段而导致查询失败。
综上所得, ${ } 变量的替换阶段是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS 中。
另外,由于#{}是通过传递参数的方式传参的,因此能够很大程度防止sql注入。不过如果涉及到排序或者动态查询的时候必须使用#{};
浙公网安备 33010602011771号