#{} 与 ${}
对比内容 | ${} | #{} |
---|---|---|
含义 | 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换 | 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 |
解析结果 | 不会当做字符串处理,是什么就是什么 | 能够把string类型的在拼接的时候自动加上引号,其他数据类型不加引号 |
${name} | name = zb | #{name} name = “zb” |
SQL 注入 | 很大程度上防止sql注入 | |
预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译 | ||
SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作 | ||
特殊场景 | 排序 order by ${} | Order by “id” 语法错误 |
表名动态生成 | select * from {table_YYYY-MM-dd} | Select * from “table” 语法错误 |
in 查询条件 | in ${} = in 1,2,3 可行 | in #{} = in “1,2,3” 不可行,只对第一个字符起作用,需要转为 foreach 集合遍历 |