Mybatis中的#{}和${}有什么不同?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_36183608/article/details/55505493



Mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现。

#{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,即解析为一个参数占位符 ? 。 
${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。

例如在mybatis的xml文件中,需要根据用户名查询用户信息:

(1) 采用#{ } 
select * from Admin where username = #{username } 
解析为: 
select * from Admin where username = ?

(2)采用${ } ,假设传进来的参数的值为”Admin” 
select * from Admin where username = ${username } 
解析为: 
select * from Admin where username = 'Admin'

看似实现的效果是一样的,但是某些情况下,两者不能替换。

(1)当传进去的参数为表名时 
采用#{ } 
select * from #{table} where username = #{username } 
解析为: 
select * from ? where username = ?

采用${ } ,假设传入的表名为”t_admin”,用户名为”Admin” 
select * from ${table} where username = ${username } 
解析为: 
select * from 't_admin' where username = 'Admin' 
此时,sql语句编译时将出现错误,因为表名不能加单引号 
同理,order by 后的参数,也不能用${ }来传递

(2)当传进去的参数是sql语句时 
采用#{ } 
select * from Admin #{sql} 
解析为: 
select * from Admin ? 
此时的where条件是没有用的

而采用${ } ,假设传入的sql语句为”where username = ‘Admin’ ” 
select * from Admin ${sql} 
解析为: 
select * from Admin where username = 'Admin' 
则可以得到正确的结果

展开阅读全文

没有更多推荐了,返回首页