在MyBatis的映射配置文件中,动态传递参数有两种方式:
1 #{} 占位符
2 ${} 拼接符
区别
1 #{ }是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值;
${ }是字符串替换,在处理{ }是字符串替换, MyBatis在处理{ }时,它会将sql中的${ }替换为变量的值。
2 变量替换后,#{} 对应的变量自动加上单引号 ''
变量替换后,${} 对应的变量不会加上单引号 ''
3 #{}:动态解析 -> 预编译 -> 执行
${}:动态解析 -> 编译 -> 执行
4 #{} 能防止SQL注入
${} 不能防止SQL注入
为了防止SQL注入,一般使用#{}
但是,因为使用#{}替换的变量两边会加上单引号,所以参数为表名、字段名的时候不能用#{},要用${}。(例如:select * from ${tableName} ,还有……order by {column})