其他分享
首页 > 其他分享> > 介绍mybatis中${}和#{}的用法差异

介绍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 = ?;

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

如以下sql语句:

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

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

select * from user where name = "aaa";

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

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

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

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

标签:name,差异,用法,user,sql,mybatis,解析,select
来源: https://blog.csdn.net/wjm0519/article/details/123065958