0


#{}和${}的区别

#{}和${}的区别
数据库数据

图片:
在这里插入图片描述

一、先说#{}
例:mapper.xml如下
select * from payment where name = #{name};

1、#{}是一个占位符,相当于JDBC中的一个?,会对一些敏感的字符进行过滤
2、#{}底层采用的是PreparedStatement,会预编译(主要是里面的setString方法,对一些特殊的字符,例如’'单引号,会在值后面加上一个\右斜线进行转义,让值无效),因此不会产生sql注入
例:
请求:
http://localhost:8001/payment/get?name=‘小明’
debug运行查看

在这里插入图片描述

value = {char[4]@9719} [‘, 小, 明, ‘] 0 = ‘’’ 39 1 = ‘小’ 23567 2 = ‘明’ 26126 3 = ‘’’ 39
结果:
{“code”:444,“message”:“查询数据失败,name:‘小明’”,“data”:null}
3、#{}不会产生字符串拼接,
4、#{}在使用时会根据传递进来的值来选择是否加上双引号(例:#{name} 传入sql中就是"小明"),因此我们在传递参数时一般都是直接传递,不用加双引号
例:
http://localhost:8001/payment/get?name=小明
5、在传递参数时#{}中可以传递任意值
例:
select * from payment where name = #{name}; select * from payment where name = #{随便写};

得出的结果都是:
{“code”:200,“message”:“查询数据成功,serverPort:8001”,“data”:{“id”:1,“serial”:“xm”,“name”:“小明”}}
注意在dao层改一下
Payment getPaymentByName2(@Param(“随便写”) String name);
6、#{}的应用场景是为sql语句中where字句传递条件值

二、再说

     1 
    
   
     、 
    
   
  
    {} 1、 
   
  
1、{}匹配的是真是传递的值,传递后会与sql语句进行字符拼接

2、${}会与其他sql进行字符串拼接,不能预防sql注入
例:mapper.xml如下
select * from payment where name = ${name};

请求:
http://localhost:8001/payment/get?name=小明
报错:

SQL: select * from payment where name = 小明;

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘小明’

in ‘where clause’

3、

     不会主动加 
    
   
     " 
    
   
     " 
    
   
     双引号,需要我们手动加入例:请求: 
    
   
     h 
    
   
     t 
    
   
     t 
    
   
     p 
    
   
     : 
    
   
     / 
    
   
     / 
    
   
     l 
    
   
     o 
    
   
     c 
    
   
     a 
    
   
     l 
    
   
     h 
    
   
     o 
    
   
     s 
    
   
     t 
    
   
     : 
    
   
     8001 
    
   
     / 
    
   
     p 
    
   
     a 
    
   
     y 
    
   
     m 
    
   
     e 
    
   
     n 
    
   
     t 
    
   
     / 
    
   
     g 
    
   
     e 
    
   
     t 
    
   
     ? 
    
   
     n 
    
   
     a 
    
   
     m 
    
   
     e 
    
   
     = 
    
   
     " 
    
   
     小明 
    
   
     " 
    
   
     结果: 
    
    
    
      " 
     
    
      c 
     
    
      o 
     
    
      d 
     
    
      e 
     
    
      " 
     
    
      : 
     
    
      200 
     
    
      , 
     
    
      " 
     
    
      m 
     
    
      e 
     
    
      s 
     
    
      s 
     
    
      a 
     
    
      g 
     
    
      e 
     
    
      " 
     
    
      : 
     
    
      " 
     
    
      查询数据成功 
     
    
      , 
     
    
      s 
     
    
      e 
     
    
      r 
     
    
      v 
     
    
      e 
     
    
      r 
     
    
      P 
     
    
      o 
     
    
      r 
     
    
      t 
     
    
      : 
     
    
      8001 
     
    
      " 
     
    
      , 
     
    
      " 
     
    
      d 
     
    
      a 
     
    
      t 
     
    
      a 
     
    
      " 
     
    
      : 
     
     
     
       " 
      
     
       i 
      
     
       d 
      
     
       " 
      
     
       : 
      
     
       1 
      
     
       , 
      
     
       " 
      
     
       s 
      
     
       e 
      
     
       r 
      
     
       i 
      
     
       a 
      
     
       l 
      
     
       " 
      
     
       : 
      
     
       " 
      
     
       x 
      
     
       m 
      
     
       " 
      
     
       , 
      
     
       " 
      
     
       n 
      
     
       a 
      
     
       m 
      
     
       e 
      
     
       " 
      
     
       : 
      
     
       " 
      
     
       小明 
      
     
       " 
      
     
    
   
     4 
    
   
     、 
    
   
  
    {}不会主动加""双引号,需要我们手动加入 例: 请求: http://localhost:8001/payment/get?name="小明" 结果: {"code":200,"message":"查询数据成功,serverPort:8001","data":{"id":1,"serial":"xm","name":"小明"}} 4、 
   
  
不会主动加""双引号,需要我们手动加入例:请求:http://localhost:8001/payment/get?name="小明"结果:"code":200,"message":"查询数据成功,serverPort:8001","data":"id":1,"serial":"xm","name":"小明"4、{}作为普通传值,不能进行字符过滤

5、${}的应用场景是为了传递一些需要参与SQL语句语法生成的值
例:
select * from ${table};

请求:
http://localhost:8001/payment/get?table=payment
结果:

{“code”:200,“message”:“查询数据成功,serverPort:8001”, “data”:[ {“id”:1,“serial”:“xm”,“name”:“小明”}, {“id”:2,“serial”:“xh”,“name”:“小红”}, {“id”:3,“serial”:“zs”,“name”:“张三”}, {“id”:4,“serial”:“ls”,“name”:“李四”}, {“id”:5,“serial”:“ww”,“name”:“王五”}, {“id”:6,“serial”:“zl”,“name”:“赵六”}, {“id”:7,“serial”:“tq”,“name”:“田七”}, {“id”:8,“serial”:“wf”,“name”:“王妃”}]}

三、最后统一总结一下(感觉自己写的乱糟糟的o(╥﹏╥)o)
1、#{}是一个占位符,KaTeX parse error: Expected 'EOF', got '#' at position 12: {}只是普通传值 2、#̲{}在使用时,会根据传递进来的…{}则不会,我们需要手动加
3、在传递一个参数时,我们在#{}中可以写任意值
4、#{}针对SQL注入进行了字符过滤,KaTeX parse error: Expected 'EOF', got '#' at position 26: …值,并没有考虑到这些问题 5、#̲{}的应用场景是为给SQL语句…{}的应用场景是为了传递一些需要参与SQL语句语法生成的值

标签: mysql 数据库 sql

本文转载自: https://blog.csdn.net/gulanga5/article/details/127693983
版权归原作者 孤独斗士 所有, 如有侵权,请联系我们删除。

“#{}和${}的区别”的评论:

还没有评论