${}和#{}都可以动态传递参数,例如参数city_name;
select * from table_name where city_name = ${city_name};或
select * from table_name where city_name = #{city_name};
模糊查询:select * from table_name where city_name like '%' || #{city_name};或
select * from table_name where city_name like '&{city_name}%';
Mybatis在对SQL语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现。#{}相当于?,而${}只是拼接字符串'+city_name+';那么我们在选择的时候到底用哪个呢?一句话,优先使用#{},实在不行就用${}。
首先这是为了性能考虑的,相同的预编译 sql 可以重复利用。其次,${ } 在预编译之前已经被变量替换了,这会存在 sql 注入问题。表名作为变量时,必须使用 ${ }
这是因为,表名是字符串,使用 sql 占位符替换字符串时会带上单引号 '',这会导致 sql 语法错误。