#{}与${}的区别
#{}
是预编译的方式,相当于jdbc的占位符PrepareStatement,
一个#{}就是一个占位符
mybatis在为#{}设置值时,会加引号
${} 模糊查询时不用
直接拼接的方式,不对数值做预编译
mybatis在为${}设置值时,不加引号
存在sql注入的现象
只有在不支持占位符的时候才使用,比如需要列名的地方,同时获取传来的数据时要做校验
例如:
查询排序的处理
需要列名的地方,在原生jdbc开发中,不可以预编译
因为预编译会给值加上引号,需要列名的是直接进行拼接的
public List<Message> selectOrderBy(String column);
<include refid="BaseSql"/> order by #{column} desc 错误,没排序
<include refid="BaseSql"/> order by ${column} desc
mybatis对原生sql不支持占位的地方,接收参数的话,用${}
${}是一个拼接sql的方式,存在SQL注入的现象
传什么就拼什么