当前位置: 首页 > news >正文

mybatis#号和$区别

在MyBatis中,`#{}`和${}都是用于实现动态SQL的占位符,但它们在使用场景和安全性上有明显的区别:

  1. 用途区别

    • #{}主要用于传递接口传输过来的具体数据,如参数值,它可以防止SQL注入,因为MyBatis会对#{}中的参数进行预编译处理,将参数值安全地传递给数据库,并且自动转义特殊字符,避免SQL注入攻击。这种方式适用于大多数情况,尤其是当参数值来自用户输入或不可信数据时。例如:  SELECT * FROM users WHERE id = #{userId}
          "#{}":MyBatis会使用预编译的SQL语句,并为每个参数,设置相应的占位符(通常是"?"),然后,当执行SQL时,MyBatis会使用 "PreparedStatement 的 setXXX()方法"来设置参数值,这种方式,可以有效地防止SQL注入攻击,因为,参数值不会被解析为SQL的一部分。

    • ${}则一般用于传入数据库对象,例如列表和表名,它不会对参数进行预编译处理,而是直接将参数拼接到了原始的SQL里面。这种方式可以适合应用在一些动态SQL场景中,比如动态传递表名、动态设置排序字段等,但由于不会对参数进行特殊处理,存在SQL注入的风险。
      SELECT * FROM users WHERE id = ${userId} 
      相当于 "SELECT * FROM users WHERE id =" + userId

  2. 安全性

    • #{}由于具有更高的安全性,能够防止SQL注入,因此在能够使用#{}的地方应尽量避免使用${}。使用#{}产生的预编译SQL语句可以提高数据库性能,因为数据库可以缓存相同的预编译语句。
    • ${}由于直接拼接原始SQL语句,无法防止SQL注入的问题,因此在需要动态参数的场景中应谨慎使用,确保传入的数据是安全的。
  3. 总结

    • 在实际应用中,应优先考虑使用#{}占位符来传递参数,以避免潜在的安全风险。只有在确实需要动态拼接原始SQL语句的情况下,才考虑使用${}占位符,并确保传入的数据经过适当的验证和过滤。

相关文章:

  • 开放式耳机怎么选?五大2024年口碑销量爆棚机型力荐!
  • postgresq数据库使用shardingsphere 避坑-分表归并和空指针异常
  • 访问者模式在金融业务中的应用及其框架实现
  • 什么是 URL ?
  • Vue.js 和 Node.js 全栈项目的运行与部署指南
  • 绕过HTTP401和403响应限制工具
  • Grafana 对接 Zabbix 数据源API错误
  • uniapp零基础入门Vue3组合式API语法版本开发咸虾米壁纸项目实战
  • CXL-GPU: 全球首款实现百ns以内的低延迟CXL解决方案
  • 【Rust入门教程】hello world程序
  • Excel中按列的首行字母顺序,重新排列(VBA脚本)
  • 【附下载】100+AI领域论文及研究报告合集免费领取!
  • Rocky Linux 9 系统OpenSSH CVE-2024-6387 漏洞修复
  • 7/3 第六周 数据库的高级查询
  • 百亿红利市场年增速超20%,3亿银发族带动中老年奶粉三大内卷方向
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Create React App 使用
  • Date型的使用
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JavaScript服务器推送技术之 WebSocket
  • JavaScript设计模式系列一:工厂模式
  • PHP的类修饰符与访问修饰符
  • Promise面试题,控制异步流程
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python_OOP
  • Redis学习笔记 - pipline(流水线、管道)
  • Sass Day-01
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vue2.x学习三:事件处理生命周期钩子
  • 构建工具 - 收藏集 - 掘金
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 力扣(LeetCode)21
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 为什么要用IPython/Jupyter?
  • 智能网联汽车信息安全
  • No resource identifier found for attribute,RxJava之zip操作符
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​iOS安全加固方法及实现
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # include “ “ 和 # include < >两者的区别
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (7)STL算法之交换赋值
  • (a /b)*c的值
  • (C#)获取字符编码的类
  • (TOJ2804)Even? Odd?
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (转)程序员技术练级攻略
  • .Net 8.0 新的变化
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑