Java 面试题: Mybatis中的 ${ } 和 #{ } 的区别 ?
一,显示不同
#{ } 这种方式会将传入的数据自动加上双引号,如 name = #{uname} ,实际上传入的值是 zhangsan ,那么sql 经过 编译就会变成 name=“zhangsan” 。
${ } 这种方式将传入的数据直接显示在sql (类型拼接在对应的位置上),如 name = ${uname} ,实际上传入的值是 zhangsan ,那么sql经过编译就是变成 name = zhangsan 。
二,安全
#{ } 这是方式是可以防止sql注入的,因为这种方式的sql是预编译的 (PreparedStatement),它其实是把传入参数转义成字符串。
${ } 这种方式是无法防止sql注入的,因为它是直接将传入的数据拼接在sql对应的位置上,也就是没有经过预编译(Statement)。
附:
#{ } 这种方式是先编译再取值,底层应该用的PreparedStatement。
${ } 这种方式是先取值再编译,底层应该用的Statement 。
1),能用# { } 就坚决不用 ${ } ,因为# { } 能很有效的防止sql 注入。
2),$ { } 方式一般用于传入数据库对象,例如传入表名.