- #{} 则是使用占位符的方式,底层采用的是PreparedStatement,会预编译,因此不会产生SQL注入问题;
- #{}不会产生字符串拼接,${}会产生字符串拼接,因此${}会出现SQL注入问题;
- 变量替换后,#{} 对应的变量对于String类型会自动加上单引号 ‘’,其他类型不加;
- 因为#{} 对应的变量对于String类型会自动加上单引号 ‘’,所以在操作变量为表名或者字段名时 只能采用${}因为表名或者字段名不需要加单引号‘’;
- 类似上条规则,在order by下也只有可以用${} 不可以加单引号;
- 表名处用#{}会直接报错;列名处用#{}会查询不到数据;order by后面用#{}排序不生效
- 使用
${}
时,要注意何时加或不加单引号,即${}
和'${}'
。一般字段类型为char或者varchar时需要加单引号; - 不论是单个参数,还是多个参数,一律都建议使用注解@Param(“”)
当 SQL 语句中的元数据(如表名或列名)是动态生成的时候,字符串替换将会非常有用。 举个例子,如果你想 select 一个表任意一列的数据时,可以参考下方优化后的代码: -
//不好的写法 @Select("select * from user where id = #{id}") User findById(@Param("id") long id); @Select("select * from user where name = #{name}") User findByName(@Param("name") String name); @Select("select * from user where email = #{email}") User findByEmail(@Param("email") String email); //(推荐)归纳统一的写法 结合${}和#{} @Select("select * from user where ${column} = #{value}") User findByColumn(@Param("column") String column, @Param("value") String value);
最全!!! MyBatis的#{}和${}的区别和使用场景
于 2023-07-18 18:11:34 首次发布