您的位置:首页 > 数据库

Mybatis 中,#{ } 与 ${ } 的区别

2017-02-17 10:12 169 查看
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'


则可以得到正确的结果

其中部分原理参照了博客:

http://blog.csdn.net/pfnie/article/details/53230994
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mybatis sql 预编译