$ {}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver。
#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值,比如ps.setInt(0, parameterValue),#{item.name}的取值方式为使用反射从参数对象中获取item对象的name属性值,相当于param.getItem().getName()。
Mybatis 中#和 $ 的区别?
#相当于对数据加上双引号,$ 相当于直接显示数据
1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成 sql 时的值为 order by “111”, 如果传入的值是 id,则解析成的 sql 为 order by “id”.
2. $ 将传入的数据直接显示生成在 sql 中。如:order by $ user_id $,如果传入的值是 111,那么解析成 sql 时的值为order by user_id, 如果传入的值是 id,则解析成的 sql 为 order by id.
3. #方式能够很大程度防止 sql 注入。
4. $ 方式无法防止 Sql 注入。
5.$ 方式一般用于传入数据库对象,例如传入表名.
6. 一般能用#的就别用$.