区别
使用#{}的时候会先进行SQL语句的编译,然后再给SQL语句的占位符?传值(如果是字符串的话,会带上‘’),底层使用的是PreparedStatement,可以避免SQL注入。
${}是先进行字符串的拼接,然后再进行SQL语句的编译,有SQL注入的风险,底层使用Statement。
平常的时候建议使用#{},除非有特殊的要求。
使用${}的情况
- 需要将SQL语句的关键字放到SQL语句中
- 表名拼接,如果使用#{}进行拼接的话会在表名的拼接处出现’’,表名拼接出错。
- 批量删除使用in进行匹配的情况,如果使用的是#{},里面拼接到in的括号()中的会带上’’,依旧会出错,只能使用${}。
- 使用模糊查询的时候,like ‘模糊匹配的字符串’,后面跟着的那个字符串本身是自带’’的,如果使用#{}的话,占位符?会被自动包裹在字符串里面,相当于占位符没了,会报错,得使用${}。
- (
其实这个可以用concat函数,拼接#{}里的内容,比较安全。) - 还有一种方式是like “%”#{}”%”
- 一种鸡肋的方式是concat(‘%’, ‘${}’, ‘%’),这种方式相当鸡肋,而且不安全
- (
参考资料: