Mybatis 占位符 #{} 和 ${} 的区别
#{}
占位符
${}
占位符是字符串连接符
参数区别
- '#{}'占位符,参数的类型可以有3种,基本类型,自定义类型,map
- '${}'占位符,参数的类型可以有2种,自定义类型,map
动态列名、表名、排序名
#{}
不能用来设置 动态列名、动态表名、动态排序名${}
可以用来设置 动态列名、动态表名、动态排序名select ${column} from table Select * from ${table} select * from table order by ${column}
sql注入
#{}
可以防止sql主句#{}
相当于jdbc中的preparedstatement(预编译),数据库已经将sql指令编译过,那么查询的格式已经订好了,也就是我们说的我已经明白你要做什么了,你要是将不合法的参数传进去,会有合法性检查,用户只需要提供参数给我,参数不会当成指令部分来执行,也就是预编译已经把指令以及参数部分区分开,参数部分不允许传指令进来。
这样的好处查询速度提高,因为有了预编译缓存,方便维护,可读性增强,不会有很多单引号双引号,容易出错,防止大部分的sql注入,因为参数和sql指令部分数据库系统已经区分开。百度文库里面提到:传递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配${}
不可以防止sql主句${}
是直接使用里面的值进行拼接,也就是可以传递 参数+指令 进去
select * from student where name= ?
select * from student where name= 'Jame' or '1=1'
总结
能使用#{}的时候尽量使用#{},不使用${}