#{}${}两种占位符都是去实现动态sql的一种方式,通过这种方式可以把参数传递到xml里面,在执行操作之前,mybatis会对这两个占位符进行动态的解析。

#占位符等同于jdbc里面一个?占位符,它相当于向preparaeStatement里面的预处理语句设置参数,而这个sql语句是预编译的。

sql语句中有占位符的话如果出现特殊字符会自动进行转义,所以#占位符可以防止sql注入

1
2
3
4
String sql = "update student set age=? where id=?";
PreparedStatement stmt = conn.preparaeStatement(sql);
stmt.setInt(1, 18);
stmt.setInt(2, 101);

$占位符相当于直接把参数拼接到了原始sql语句里面,mybatis不会对他进行任何的特殊处理

1
select id, name from ${table} where id=${id};

所以$#的区别是,$是动态参数,#是占位符,动态参数无法防止sql注入,所以尽可能的去使用#占位符。