【MyBatis占位符】Mybatis中的#{}和${}区别
共同点
#,$都是去实现动态SQL的一种方式,通过这种方式我们可以把参数传递到xml中,在执行前mybatis会对占位符进行动态解析。
占位符#{}
#
等同于jdbc里面的 ?
占位符,相当于向 PreparedStatement
(了解 PreparedStateMent )中设置属性值,而 PreparedStatement
是预编译的,它规定了SQL语句的一个结构,并且在设置参数的时候,如果有特殊的字符会自动进行转义,所以#
占位符可以防止SQL注入。
String sql = "update people set firstname=? , lastname=? where id=?";
PreparedStatement preparedStatement =connection.prepareStatement(sql);
preparedStatement.setString(1, "Gary");
preparedStatement.setString(2, "Larson");
preparedStatement.setLong (3, 123);
int rowsAffected = preparedStatement.executeUpdate();
例如,如果你的参数是 “John”,你的 SQL 是 “SELECT * FROM users WHERE name = #{name}
”,那么生成的 SQL 也将是 “SELECT * FROM users WHERE name = 'John'
”
占位符${}
$
的方式相当于直接把参数拼接到 SQL中,Mybatis不会对它进行任何特殊的处理。所以不能够防止SQL注入。但是$
占位符更多的是动态参数,#
其实是用来做占位符的。$
更适合动态传递表名,动态设置排序字段等。例如,如果你的参数是 “John”,你的 SQL 是 “SELECT * FROM users WHERE name = '${name}'
”,那么生成的 SQL 将是 “SELECT * FROM users WHERE name = 'John'
”