Mybatis 占位符 #{} 和 ${} 的区别

#{} 占位符
${} 占位符是字符串连接符

参数区别

  1. '#{}'占位符,参数的类型可以有3种,基本类型,自定义类型,map
  2. '${}'占位符,参数的类型可以有2种,自定义类型,map

动态列名、表名、排序名

  1. #{} 不能用来设置 动态列名、动态表名、动态排序名
  2. ${} 可以用来设置 动态列名、动态表名、动态排序名

    select ${column} from table 
    Select * from ${table} 
    select * from table order by ${column}
    

sql注入

  1. #{} 可以防止sql主句

    #{}相当于jdbc中的preparedstatement(预编译),数据库已经将sql指令编译过,那么查询的格式已经订好了,也就是我们说的我已经明白你要做什么了,你要是将不合法的参数传进去,会有合法性检查,用户只需要提供参数给我,参数不会当成指令部分来执行,也就是预编译已经把指令以及参数部分区分开,参数部分不允许传指令进来
    这样的好处查询速度提高,因为有了预编译缓存,方便维护,可读性增强,不会有很多单引号双引号,容易出错,防止大部分的sql注入,因为参数和sql指令部分数据库系统已经区分开。百度文库里面提到:传递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配

  2. ${} 不可以防止sql主句

    ${}是直接使用里面的值进行拼接,也就是可以传递 参数+指令 进去
    select * from student where name= ?
    select * from student where name= 'Jame' or '1=1'

总结

能使用#{}的时候尽量使用#{},不使用${}