mybatis #和$的区别
#
和$
的区别
#
是占位符,在DBMS才进行替换,在预编译时使用?
占位,能防止sql注入;
$
是拼接符,在动态sql解析阶段将会进行变量替换,有可能会引发sql注入,如:
select * from ${tableName} where name = #{name}
参数 tableName 为 user; delete user; --,那么动态解析之后,预编译之前,将变为
select * from user; delete user; -- where name = ?;
能用#
就不要用$
$
有可能引发sql注入问题,其次,相同的预编译能重复利用,而是用#
会比较容易遇到相同的预编译;
表名必须用$
因为使用#
替换字符串时,会带上单引号,但是表名不能待用单引号(反引号例外)
PS:sql 预编译指的是数据库驱动在发送 sql 语句和参数给 DBMS 之前对 sql 语句进行编译,这样 DBMS 执行 sql 时,就不需要重新编译。