#{}速度快,能防止sql注入,是占位符方式,先预编译,然后填充参数,字符串格式,用户名=(___),参数只是下划线上的内容
 ${}是直接拼接到语句上,这种方式需要自己拼括号和参数,但是也可以拼接想执行的任何语句,也就是传说中的sql注入
 详情如下
在MyBatis中使用参数进行SQL拼装经常会使用到#{var}和${var}两种参数的设置方式。下面是两种方式的不用之处:
#{var}
- 使用预编译的方式将参数设置到SQL语句中(相当于占位符?)。
 - 使用原生JDBC中的prepareStatrment。
 - 在一定程度上防止SQL注入的风险(无法避免%的问题)。
 
${var}
- 不适用预编译模式。
 - 取出相应的值直接拼装到SQL语句当中。
 - 会有SQL注入的安全问题。
 - ${var} 的变量的替换阶段是在动态SQL解析阶段,而#{var}的变量的替换是在DBMS中。
 
#{var}取值是编译好SQL语句再取值。#{var}将传入的数据都当成一个字符串,对自动传入的数据加一个双引号。
 如:order by #{id},传入的值为abc,解析后的SQL为order by ‘abc’。
 
     
      
       
        
         
          v
         
         
          a
         
         
          r
         
        
        
         是
        
        
         取
        
        
         值
        
        
         以
        
        
         后
        
        
         再
        
        
         去
        
        
         编
        
        
         译
        
        
         S
        
        
         Q
        
        
         L
        
        
         语
        
        
         句
        
        
         。
        
       
       
        {var}是取值以后再去编译SQL语句。
       
      
     var是取值以后再去编译SQL语句。{var}将传入的数据直接显示生成在SQL中,参数不带引号。
 如:order by ${id},传入的值为abc,解析后的SQL为order by 'bc。
在原生JDBC不支持占位符的地方,就不能使用#{var}的形式去进行取值,会导致执行SQL的时候报错。比如数据库表名、排序方式等特殊情况, 都需要使用${var}的形式直接取值。
 SELECT xxx FROM ${tableName} WHERE id = #{id} order by ${columnName} ${order}










