被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?

news2024/11/17 16:23:11

引言:在使用 MyBatis 进行数据库操作时,#{}${} 的区别是面试中常见的问题,对理解如何在 MyBatis 中安全有效地处理 SQL 语句至关重要。正确使用这两种占位符不仅影响应用的安全性,还涉及到性能优化。

题目

被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?

推荐解析

预编译与直接替换

面试官问了我这个问题,直接把我问老实了,求放过,赶忙来写下以下思考:

1)#{}:使用 #{} 时,MyBatis 为 SQL 语句的参数生成一个预编译语句,并通过参数占位符(?)来代替实际的参数值。这种方式是安全的,因为它防止了 SQL 注入攻击,参数值在发送到数据库之前不会被解析为 SQL 的一部分。

如果你有一个查询用户的操作,你可以这样写:

SELECT * FROM users WHERE id = #{userId}

2)${}:相反,使用 ${} 时,参数值被直接替换到 SQL 语句中。这种方式虽然灵活,可以动态替换表名、列名等 SQL 语句的组成部分,但却可能导致 SQL 注入问题,因为参数值如果包含恶意的 SQL 代码也会被执行。

如果你需要动态地选择表名或列名,可以这样使用:

SELECT * FROM ${tableName}

性能考虑

对于性能我得出以下思考:

1)#{} 性能优势:由于使用预编译的 SQL 语句,数据库可以重用相同结构的 SQL 语句,减少编译次数,提高执行效率。

2)${} 性能问题:可能导致每次都要编译新的 SQL 语句,因为 SQL 结构可能因为参数的不同而改变。

类型处理

琢磨琢磨我又发现了新大陆!类型处理~

1)#{} 类型处理:MyBatis 可以根据参数的 Java 类型自动推断数据库类型,处理日期、枚举等复杂类型的转换。

2)${} 类型处理:不进行类型转换,将参数视为纯文本,直接嵌入到 SQL 语句中。

鱼聪明 AI 的回答:

鱼聪明 AI 地址:https://www.yucongming.com/

#{}(参数占位符)

  • 预编译#{} 表达式使得参数在 SQL 语句中以占位符 ? 的形式出现。这意味着 SQL 语句会被预编译并多次执行,参数值在运行时绑定。这种方式对于数据库性能优化至关重要,因为预编译可以减少数据库编译SQL的次数,提高执行效率。
  • 防止 SQL 注入:由于参数不是直接拼接到 SQL 语句中,而是作为一个绑定的值传递给预编译的 SQL 语句,因此 #{} 防止了 SQL 注入的风险。用户输入被当作字符串处理,不会被执行为 SQL 代码的一部分。
  • 类型安全:MyBatis 能够根据 Java 类型自动推断出相应的 SQL 类型。例如,如果你传递一个 Java Date 对象,MyBatis 会适当地处理它与 SQL 日期类型之间的转换。

${}(SQL 字符串拼接)

  • 直接替换:使用 ${} 时,参数值会在解析 SQL 语句之前直接替换到 SQL 字符串中。这意味着你可以通过 ${} 插入动态表名、列名或者其他 SQL 片段,如动态排序条件。
  • 高风险${} 由于是直接将参数内容拼接到 SQL 语句中,所以存在 SQL 注入的风险。如果参数值来自不可控的用户输入,那么可能被注入恶意的 SQL 代码。
  • 灵活性:尽管风险较高,${} 在某些场景下是必要的。特别是在 SQL 语句的某些部分无法通过预编译实现,如动态改变表名或某些数据库函数和命令,${} 提供了必要的灵活性。

推荐文章和书籍

文章:https://zhuanlan.zhihu.com/p/86293659

书籍:《 Java 核心技术卷 I 》

欢迎交流

当讨论 MyBatis 中的 #{}${} 占位符时,我们可以从以下几个角度深入探讨它们的概念、区别和实际应用,以便更好地理解它们在数据库操作中的作用:

1)什么是 #{}${}?它们在 MyBatis 中有什么应用?

2)#{}${} 的工作原理是什么?

3)#{}${} 在实际应用中的选择标准是什么?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1838975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

富唯智能打造的AGV搬运机器人转运机器人

AGV搬运机器人&转运机器人 AGV搬运机器人,内部搭载ICD系列核心控制器,拥有不同的移载平台,负载最高可达 1000kq;重复精度高达5mm;支持 Wi-Fi漫游,实现更稳健的网络数据交互;无轨化激光 SLAM 导航,配合 3D 避障相机…

2024年仿真建模与多媒体技术国际学术会议(ISMMT 2024)

全称:2024年仿真建模与多媒体技术国际学术会议(ISMMT 2024) 会议网址:http://www.ismmt.com 会议时间:最终通知见官网! 会议地点: 深圳 投稿邮箱:ismmtsub-conf.com投稿标题:ArticleTEL。投稿时…

什么是“基准测试集”呢?

基准测试集有三部分构成:DocumentSet、QuerySet、RelevantJudgement。在比较多个IR系统孰优孰劣的时候,要做的就是:使用统一的DecumentSet建立索引,然后使用统一的QuerySet去进行查询,最后使用统一的judgement进行评判…

web爬虫笔记:js逆向案例九(某多多 anti_content参数)补环境流程

web爬虫笔记:js逆向案例九(某多多 anti_content参数)补环境流程 一、目标网站:aHR0cHM6Ly9tb2JpbGUueWFuZ2tlZHVvLmNvbS8= 二、接口分析 1、快速定位加密位置(通过搜索/cells/hub/v3快速定位到加密js文件) 2、通过分析可知&#

HSP_09章 模块和包

文章目录 P102 模块的常见应用场景分析P103 模块的基本介绍1. 导入模块import2.实例演示 P104 自定义模块1.自定义模块的介绍:2. 注意事项和使用细节2.1 使用 __name__可以避免模块中测试代码的执行2.2 使用__all__可以控制 import *时,哪些功能被导入,注意: import…

禅道身份认证绕过漏洞(QVD-2024-15263)复现

禅道项目管理系统在开源版、企业版、旗舰版的部分版本中都存在此安全漏洞。攻击者可利用该漏洞创建任意账号实现未授权登录。 1.漏洞级别 高危 2.漏洞搜索 fofa: title"禅道"3.影响范围 v16.x < 禅道 < v18.12 &#xff08;开源版&#xff09; v6.x <…

Vue40-vueComponent构造函数

一、组件的本质&#xff1a;VueComponent构造函数 组件的本质是&#xff1a;构造函数 二、每一次调用vue.extend&#xff0c;返回的事一个全新的 VueComponent VueComponent的源码如下&#xff1a; 三、组件中的this 组件中的this是VueComponent实例对象&#xff0c;结构和vm…

通过视频网站传播的RecordBreaker窃密木马分析

1 攻击活动概览 近期&#xff0c;安天CERT监测到通过视频网站进行传播的攻击活动。攻击者窃取订阅者数量超过10万的视频创作者账号&#xff0c;发布与破解版热门软件相关的演示视频&#xff0c;诱导受害者下载RecordBreaker窃密木马。 RecordBreaker窃密木马是Raccoon…

基于DMAIC的SMT TX插件撞伤不良改善

在快速发展的电子制造领域&#xff0c;SMT&#xff08;表面贴装技术&#xff09;已经成为电子产品组装的核心技术之一。然而&#xff0c;SMT TX插件撞伤不良问题一直是制约生产效率与产品质量的瓶颈。本文将基于DMAIC&#xff08;定义、测量、分析、改进、控制&#xff09;方法…

注意力机制简介

为了减少计算复杂度&#xff0c;通过借鉴生物神经网络的一些机制&#xff0c;我们引入了局部连接、权重共享以及汇聚操作来简化神经网络结构。神经网络中可以存储的信息量称为网络容量。一般来讲&#xff0c;利用一组神经元来存储信息的容量和神经元的数量以及网络的复杂度成正…

重生奇迹MU 探秘奇幻世界

"探秘奇幻世界&#xff0c;成就无尽荣耀&#xff01;欢迎来到重生奇迹MU&#xff0c;一个永不落幕的游戏乐园。在这里&#xff0c;你可以尽情挑战各种困难&#xff0c;发掘神秘宝藏&#xff0c;还可与来自世界各地的玩家一起创造无尽的历史。为了帮助你更好地探索游戏世界…

用Vue3和ApexCharts打造交互式3D折线图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue.js 中使用 ApexCharts 构建交互式折线图 应用场景 ApexCharts 是一个功能强大的 JavaScript 库&#xff0c;用于创建交互式、可定制的图表。在 Vue.js 中&#xff0c;它可以通过 vue3-apexcharts 插件轻松…

IPython大揭秘:神奇技巧让你掌握无敌编程力量!

IPython技巧 基础技巧文件操作技巧输入输出技巧魔术命令技巧调试技巧程序性能优化技巧输入输出重定向技巧魔术命令控制技巧自定义显示格式技巧多线程多进程技巧异常处理技巧数据可视化技巧自定义魔术命令技巧安装扩展包技巧Jupyter Notebook集成技巧文档显示技巧代码块执行技巧…

2024 年 Python 基于 Kimi 智能助手 Moonshot Ai 模型搭建微信机器人(更新中)

注册 Kimi 开放平台 Kimi&#xff1a;https://www.moonshot.cn/ Kimi智能助手是北京月之暗面科技有限公司&#xff08;Moonshot AI&#xff09;于2023年10月9日推出的一款人工智能助手&#xff0c;主要为用户提供高效、便捷的信息服务。它具备多项强大功能&#xff0c;包括多…

【Orange Pi 5与Linux内核编程】-理解Linux内核中的container_of宏

理解Linux内核中的container_of宏 文章目录 理解Linux内核中的container_of宏1、了解C语言中的struct内存表示2、Linux内核的container_of宏实现理解3、Linux内核的container_of使用 Linux 内核包含一个名为 container_of 的非常有用的宏。本文介绍了解 Linux 内核中的 contain…

【软件工程】【22.10】p2

关键字&#xff1a; 软件开发基本途径、初始需求发现技术、UML表达事物之间关系、RUP需求获取基本步骤、项目过程建立涉及工作、项目规划过程域的意图和专用目标 判定表、分支覆盖、条件覆盖 三、简答 四、应用 这里条件覆盖有待商榷

ultralytics 8.2.35增加YOLOv9t/s/m模型全过程

yolov9的小模型开源也有两周左右了&#xff0c;ultralytics两天前新版本已经可以支持使用了。 过一段时间&#xff0c;Yolov10估计也快了。 yolov9的作者代码有一些部分本身就是从yolov5里“借鉴”而来&#xff0c;性能提高没提高见仁见智吧。 yolov10的nms free方式倒是比较…

有了MES、ERP,质量管理为什么还需要QMS?

在制造业&#xff0c;质量管理始终是企业管理中永恒的主题。品质管理要想做得更好&#xff0c;企业必须掌握足够多、足够有用的数据和信息&#xff0c;实现质量管理信息化。很多中小企业也很困惑&#xff0c;是否有必要上线QMS质量管理系统&#xff1f; 一、为什么企业需要QMS的…

C语言实现五子棋教程

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(链表)

揭秘高效存储模型与数据结构底层实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 链表使用场景List&#xff08;列表&#xff09;和 链表的关系链表的实现链表的节点list的源码实现结构模…