Mybatis中#{}与${}的区别
-
在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}。
-
.{ } 在预处理时,会把参数部分用一个占位符 ? 代替,而 ${} 则只是简单的字符串替换。
-
例:name的值为张三
select * from user where name = #{name}; select * from user where name = '${name}';
-
解析结果一样:
select * from user where name = '张三';
-
预编译中的处理是不一样:
select * from user where name = ?; -- #{}预处理 select * from user where name = '张三'; -- ${}预处理
-
因为 ${} 会导致 sql 注入的问题,开发中优先使用#{}。
-
例:表名称为user;--
select * from ${tableName} where name = '${name}';
-
则动态解析之后 sql 如下:
select * from user; -- where name = 张三; -- 后面的会被注释掉,语句就变成了查询所有
-
但是使用模糊查询时,常用 ${}进行拼接
-
例:查询名字里带有小明(value)的信息
SELECT * FROM USER WHERE username LIKE '%${value}%';
-
解析结果:
SELECT * FROM USER WHERE username LIKE '%小明%' ;
-
使用${}是字符串的拼接,记得加'${value}'
-
例:
SELECT * FROM USER WHERE username = '${value}';