介绍mybatis中${}和#{}的用法差异

动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理。下面让我们先来熟悉下mybatis里#{}与${}的用法:

在动态sql解析过程,#{}与${}的效果是不一样的:

#{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。
如以下sql语句
 

select * from user where name = #{name};

会被解析为:

select * from user where name = ?;

可以看到 #{} 被解析为一个参数占位符 ?.

  • ${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换

如以下sql语句:

select * from user where name = ${name};

当我们传递参数“aaa”时,sql会解析为:

select * from user where name = "aaa";

综上所得, ${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。

#{}与${}的区别可以简单总结如下:

#{}将传入的参数当成一个字符串,会给传入的参数加一个双引号
${}将传入的参数直接显示生成在sql中,不会添加引号
#{}能够很大程度上防止sql注入,${}无法防止sql注入
${}在预编译之前已经被变量替换了,这会存在sql注入的风险。

${}一般用于传输数据库的表名、字段名等
能用#{}的地方尽量别用${}
 

上一篇:rtmp协议学习笔记


下一篇:揭开Wayland的面纱(二):Wayland应运而生