MyBatis的#{}和${}区别

${}是对sql和参数值进行直接的字符串拼接,而#{}则解析为PreparedStatement的占位符?

#{}能够避免sql注入

扩展/原理

  1. mybatis对于${} 和 #{} 解析的源码。
  2. mybatis 解析#{} 会对传入String类型的参数加上双引号""
    1. 如果参数自己就有呢
    2. 加的逻辑是什么
    3. 这就导致若使用 order by 则需要使用 ${},因为使用 #{} 则会变为 order by "字段名"
  3. PreparedStatement 避免SQL注入的原理
  4. ${} 的使用场景
    1. 上面 order by 的场景
    2. 根据入参动态表名和字段名的场景(此时的表名和字段名一般只是根据入参判断,不会使用入参拼接,避免SQL注入)
  5. mysql 的库名、表名、字段名能够使用引文单/双引号吗? 不能

可参考/待整理

  1. mybatis 绑定参数不带引号(${}与#{}的区别) https://blog.csdn.net/qq_36669407/article/details/104947391
  2. mybatis的单引号 https://www.cnblogs.com/cashew/p/11465448.html
  3. mybatis中传递参数时,会加上单引号 https://blog.csdn.net/zhongjh1/article/details/52840124
  4. Mybatis中单双引号引发的惨案 https://blog.csdn.net/qqHJQS/article/details/100530001
  5. mybatis中#{}和${}的区别 https://www.cnblogs.com/davidwang456/p/4929426.html\
  6. 防止SQL注入的五种方法 https://www.cnblogs.com/baizhanshi/p/6002898.html
  7. 参数化查询为什么能够防止SQL注入 https://blog.csdn.net/luxuheng/article/details/22095671
  8. 关于PreparedStatement原理的理解 https://www.cnblogs.com/stefanking/articles/5082983.html
  9. PreparedStatement的预编译原理 https://www.cnblogs.com/JaxYoun/p/15363197.html
  10. MyBatis源码研究之$和# https://blog.csdn.net/lqzkcx3/article/details/78144319
  11. 吐血整理Mybatis源码的解析方式 https://blog.csdn.net/qq_39513430/article/details/104503554
  12. 关于Mybatis的$和#的细节,源码解析 https://blog.csdn.net/lz710117239/article/details/76218172
  13. mybatis中#和$的区别是什么 https://www.php.cn/faq/416843.html
  14. Mybatis 中$与#的区别 https://www.cnblogs.com/hellokitty1/p/6007801.html
  15. 面试题:Mybatis中 $ 和 # 的区别? https://blog.csdn.net/qq_40925189/article/details/115839007
  16. navicat for mysql 建表中文引号问题 https://blog.csdn.net/whitesun123/article/details/86139941
posted @ 2022-04-05 23:48  YangDanMua  阅读(70)  评论(0编辑  收藏  举报