#{}和${}有什么区别:
-
#{}是预编译处理,MyBatis 在处理#{}时,它会将 sql 中的#{}替换为?,然后调用 PreparedStatement 的 set 方法来赋值;
-
${}是字符串替换,MyBatis 在处理${}时,它会将 sql 中的${}替换为变量的值。
select * from user where id=#{id} 当传入的 id 是 23 是,相当于执行了:
String sql = "select * from user where id=?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "23");
调用 preparedStatement 的 setString 方法传入参数可以防止 sql 注入,安全性更高。
${} 的场景是直接在 SQL 语句中直接插入一个不转义的字符串, 比如 ORDER BY 子句,这时候你可以:
ORDER BY ${columnName}
这样,MyBatis 就不会修改或转义该字符串了。
当 SQL 语句中的列名是动态生成的时候,字符串替换将会非常有用,比如使用 MyBatis 实现下面三条语句:
select * from user where id = #{id}
select * from user where name = #{name}
select * from user where email = #{email}
可以通过 ${} 使用一行 Sql 就实现:
select * from user where ${column} = #{value}
接口传递值时,只需要把列名也传递进来即可:
userMapper.findByColumn("id", 1L);
userMapper.findByColumn("name", "kid");
userMapper.findByColumn("email", "xxx@1234.com");