MyBatis的#{}和${}区别
${}是对sql和参数值进行直接的字符串拼接,而#{}则解析为PreparedStatement的占位符?
#{}能够避免sql注入
扩展/原理
- mybatis对于${} 和 #{} 解析的源码。
- mybatis 解析#{} 会对传入String类型的参数加上双引号""
- 如果参数自己就有呢
- 加的逻辑是什么
- 这就导致若使用 order by 则需要使用 ${},因为使用 #{} 则会变为 order by "字段名"
- PreparedStatement 避免SQL注入的原理
- ${} 的使用场景
- 上面 order by 的场景
- 根据入参动态表名和字段名的场景(此时的表名和字段名一般只是根据入参判断,不会使用入参拼接,避免SQL注入)
- mysql 的库名、表名、字段名能够使用引文单/双引号吗? 不能
可参考/待整理
- mybatis 绑定参数不带引号(${}与#{}的区别) https://blog.csdn.net/qq_36669407/article/details/104947391
- mybatis的单引号 https://www.cnblogs.com/cashew/p/11465448.html
- mybatis中传递参数时,会加上单引号 https://blog.csdn.net/zhongjh1/article/details/52840124
- Mybatis中单双引号引发的惨案 https://blog.csdn.net/qqHJQS/article/details/100530001
- mybatis中#{}和${}的区别 https://www.cnblogs.com/davidwang456/p/4929426.html\
- 防止SQL注入的五种方法 https://www.cnblogs.com/baizhanshi/p/6002898.html
- 参数化查询为什么能够防止SQL注入 https://blog.csdn.net/luxuheng/article/details/22095671
- 关于PreparedStatement原理的理解 https://www.cnblogs.com/stefanking/articles/5082983.html
- PreparedStatement的预编译原理 https://www.cnblogs.com/JaxYoun/p/15363197.html
- MyBatis源码研究之$和# https://blog.csdn.net/lqzkcx3/article/details/78144319
- 吐血整理Mybatis源码的解析方式 https://blog.csdn.net/qq_39513430/article/details/104503554
- 关于Mybatis的$和#的细节,源码解析 https://blog.csdn.net/lz710117239/article/details/76218172
- mybatis中#和$的区别是什么 https://www.php.cn/faq/416843.html
- Mybatis 中$与#的区别 https://www.cnblogs.com/hellokitty1/p/6007801.html
- 面试题:Mybatis中 $ 和 # 的区别? https://blog.csdn.net/qq_40925189/article/details/115839007
- navicat for mysql 建表中文引号问题 https://blog.csdn.net/whitesun123/article/details/86139941