简单说#{}是经过预编译的,是安全的。
而${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。
1、#{} 这种取值是编译好SQL语句再取值(预编译)
例如:select * from stu where name = #{name or age = 17}
编译过程:1、第一步:select * from stu where name = "?"
2、第二步:将#{}里的值代入到?
3、第三步:编译语句
编译后结果:selct * from stu where name = "name or age = 17"
可以防止sql注入。
2、${} 这种是取值以后再去编译SQL语句(没有预编译)
例如:select * from stu where name = ${name or age = 17}
编译过程:1、第一步:直接将${}里的值代入到语句中
3、第二步:编译
编译后结果:selct * from stu where name = name or age = 17
无法防止sql注入,会查询到不必要的条件。
一般我们使用#{}不使用${}就是为了防止sql注入,而${}则使用在order by语句的后面,Mybatis不会对这个参数进行任何的处理,直接生成sql语句。