Java #{} 和 ${} 的含义及区别





#{ }

表示一个占位符,向占位符输入参数,MyBatis 会自动进行 Java 类型和 jdbc 类型的转换,且不需要考虑参数的类型,以预编译的方式传入,可以有效的防止 SQL 注入,提高系统安全性。例如:传入字符串,MyBatis 最终拼接好的 SQL 就是参数两边加单引号。



${ }

表示 SQL 的拼接,通过 ${ } 接收参数,将参数的内容不加任何修饰拼接在 SQL 中,以字符串替换方式 ${ } 替换成变量的值,可能存在 SQL 注入的安全隐患。在用于传入数据库对象,例如传入表名和列名,还有排序时使用 order by 动态参数时可以使用 ${ } 。



  • 注:
    一般能用 # 的就别用 $ ,若不得不使用 “ ${xxx} ” 这样的参数,要手工地做好过滤工作,以防止 SQL 注入攻击。





含义:
	#{}:为占位符
	
	${}:为拼接符


区别:

  用法:
  		#{}:为参数占位符?,即 SQL 预编译

        ${}为字符串替换, 即字符串拼接



 	执行流程:
  		#{}:动态解析 --> 预编译 --> 运行

  	    ${}: 动态解析 -->  编译  --> 运行



  变量替换:
  		#{}:变量替换是在 DBMS (数据库管理系统)中,会对对应的变量自动加上''

  	    ${}:变量替换实在 DBMS 外,不会对对应的变量加上''



  sql注入:
  		#{}:可以防止 SQL 注入

 	   ${}:不可以防止 SQL 注入

  


  
使用技巧:
	  不论是单个参数还是多个参数,一律建议使用 @param("")
	
	   能用 #{ } 的地方尽量使用 #{ },减少 ${ }
	
	   表名作为参数时,必须使用 ${ }
	
	     order by 时,必须使用 ${ }
	
	     使用 ${} 时要注意何时加或不加单引号











Note:
欢迎点赞,留言,转载请在文章页面明显位置给出原文链接
知者,感谢您在茫茫人海中阅读了我的文章
没有个性 哪来的签名!
详情请关注点我
持续更新中

扫一扫 有惊喜!
© 2020 11 - Guyu.com | 【版权所有 侵权必究】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值