#{}与${}的区别是实战中经常遇到的问题,当然也是面试常考的问题
#{}
1、#{}用来传入参数,sql在解析的时候会加上" ",当成字符串来解析 ,如这里 role_id = “roleid”;
2、#{}能够很大程度上防止sql注入,mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值,提高系统的安全性。
${}
1、用${}传入数据直接显示在生成的sql中,如上面的语句,用role_id = r o l e I d , j d b c T y p e = I N T E G E R , 那 么 s q l 在 解 析 的 时 候 值 为 r o l e i d = r o l e i d , 执 行 时 会 报 错 ; 2 、 {roleId,jdbcType=INTEGER},那么sql在解析的时候值为role_id = roleid,执行时会报错; 2、 roleId,jdbcType=INTEGER,那么sql在解析的时候值为roleid=roleid,执行时会报错;2、{}方式无法防止sql注入;
两者使用上的区别
1、$一般用入传入数据库对象(属性),比如数据库表名;
2、#一般用来传输属性对应的变量值
3、能用#{}时尽量用#{};
使用举例
1、
<select id="findUserByTableName" resultType="User">
<!--SELECT * from #{tableName1} 运行会报错,编译后sql语句中含有引号,sql语句错误-->
SELECT * from ${tableName1}
</select>
2、mybaties排序时使用order by 动态参数时需要注意,使用${}而不用#{},原因如下
- #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”.
- $将传入的数据直接显示生成在sql中。如:order by u s e r i d user_id userid,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.