Mybatis中#和$的区别

news2025/7/14 18:21:52

在MyBatis中,#{} 和 ${} 是两种用于参数替换的占位符,但它们在处理方式和安全性上有所不同

#{}

预编译处理:MyBatis在处理#{}时,会将其中的内容作为参数进行预编译处理。这意味着MyBatis会生成一个PreparedStatement对象(预编译的SQL语句),并将#{}中的内容作为参数传递给这个对象。因此,当SQL语句执行时,参数会被直接设置到SQL语句中,而不是替换整个占位符。

举例:

<select id="selectUserById" resultType="User">  
    SELECT * FROM users WHERE id = #{userId}  
</select>
  • 在这个例子中,#{userId} 是一个占位符,它会被预处理为一个参数占位符(通常被替换为 ?),也就是说 SELECT * FROM users WHERE id = #{userId} 会被替换为 SELECT * FROM users WHERE id = ?
  • 并且MyBatis会使用PreparedStatement的set方法来为这个占位符设置值。
  • 当调用这个方法时,你通常会传递一个参数给 selectUserById 方法,这个参数会被MyBatis自动绑定到 #{userId} 占位符上。

性能更高

  • 当SQL语句被预编译后,其编译后的版本会被缓存起来。
  • 后续再次执行相同的SQL语句时,数据库服务器会直接从缓存中取出编译后的版本,而无需再次进行编译。
  • 这减少了编译所需的计算资源和时间,从而提高了性能。

防止SQL注入:由于#{}使用了预编译的方式,它会自动处理参数中的特殊字符,如引号、分号等,从而防止了SQL注入攻击。

举例:

        如果我们传递一个参数值userId为 1' OR '1'='1(这是一个常见的SQL注入攻击尝试),MyBatis会将其绑定到SQL语句中,生成的实际执行的SQL语句将类似于:

        SELECT * FROM users WHERE id = ?

        参数1' OR '1'='1会被作为一个普通的参数值传递,数据库会正确地将其当作一个字符串值来处理,而不会执行任何SQL注入代码。(由于使用了参数绑定,这个字符串值不会被当作SQL语句的一部分来解析和执行。相反,它会被当作一个普通的字符串值来与数据库中的列值进行比较。

      

${}

字符串替换:与#{}不同,MyBatis在处理${}时,会将其中的内容直接替换到SQL语句中,而不是作为参数传递。这意味着${}中的内容会原样输出到SQL语句中,因此需要注意特殊字符和SQL注入的问题。

举例:

<select id="selectUserByName" resultType="User">  
    SELECT * FROM users WHERE name = '${userName}'  
</select>
  • 在这个例子中,${userName} 会被直接替换为实际的变量值。MyBatis不会对其进行任何预处理或转义。

SQL注入风险

        如果 userName 包含了恶意的SQL代码(如 ' OR '1'='1),那么这个SQL语句就会变成 SELECT * FROM users WHERE name = '' OR '1'='1',这将会返回表中的所有用户记录(因为'1'='1'是满足的)。

        在实际应用中,如果必须使用 ${}(例如在动态表名或列名的情况下),请确保传入的变量值是安全的、经过验证的,或者来自于受信任的来源。

总结

  • #{} 是安全的,因为它使用预编译的SQL语句和参数绑定。
  • ${} 是不安全的,因为它直接将变量值替换到SQL语句中,可能导致SQL注入。
  • 在大多数情况下,应该优先使用 #{} 而不是 ${}。当确实需要使用 ${} 时,请确保输入是安全的。

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

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

相关文章

Python武器库开发-武器库篇之SSH服务暴力破解(五十四)

Python武器库开发-武器库篇之SSH服务暴力破解(五十四) SSH&#xff08;Secure Shell&#xff09;是一种加密的网络协议&#xff0c;用于在不安全的网络上提供安全的远程登录和文件传输功能。SSH可以在客户端和服务器之间建立安全的通信连接&#xff0c;确保通信数据的机密性和…

Web应用安全测试-防护功能失效

Web应用安全测试-防护功能失效 1、账号弱锁定机制 漏洞描述&#xff1a;系统帐号锁定时间太短 测试方法&#xff1a;登录时多次输入错误密码&#xff0c;触发账户锁定机制&#xff0c;查看锁定时间是否低于3分钟。 风险分析&#xff1a;若账户锁定时间过短&#xff0c;攻击…

洋人道歉,「国产」出品,全球最强端侧多模态大模型!(懒人包)

最近&#xff0c;在AI圈发生了一件大事&#xff0c;那就是斯坦福AI团队因抄袭清华系开源大模型而引起了国际社交平台上的巨大争议。事件的核心围绕一款名为“Llama3-V”的斯坦福团队开发的多模态大模型&#xff0c;该模型一经发布&#xff0c;便以其低成本高效率的特性&#xf…

广州酒吧安全管理:蓝牙可燃气体报警器的实践与检定

随着现代都市生活的丰富多样&#xff0c;酒吧已成为人们休闲娱乐的重要场所。然而&#xff0c;酒吧内大量使用的燃气设备也带来了不小的安全隐患。 如何在确保顾客享受愉悦时光的同时&#xff0c;保障他们的生命财产安全&#xff0c;成为广州各大酒吧经营者亟待解决的问题。 …

数据结构 实验 2

题目一&#xff1a;遍历二叉树 一、实验目的 熟练掌握指针变量、链表的含义掌握二叉树的结构特性&#xff0c;以及二叉链表的存储方式的特点掌握用递归的方法处理二叉树的基本算法掌握二叉树的四种遍历方式&#xff08;先序、中序、后序、按层次&#xff09; 二、实验步骤 …

Unity资源 之 最受欢迎的三消游戏开发包 - Bubble Shooter Kit 【免费领取】

三消游戏开发包 - Bubble Shooter Kit 免费领取 前言资源包内容领取兑换码 前言 如果你是一名 Unity 游戏开发者&#xff0c;并且正在寻找一种快速、简单的方式来创建自己的三消游戏&#xff0c;那么 Bubble Shooter Kit 就是你所需要的。 资源包内容 Bubble Shooter Kit 是…

typora+Picgo使用Lsky pro搭建本地服务图床

typoraPicgo使用Lsky pro搭建本地服务图床 Picgo下载lankong插件lankong插件安装Auth token获取 Picgo测试typora测试问题说明 Picgo下载 Picgo下载&#xff1a;https://github.com/Molunerfinn/PicGo/releases&#xff0c;注意&#xff1a;请直接使用尝鲜版&#xff0c;正式版…

【kaggle量化交易第一名方案】Trading at the Close

2024 1st Place Solution Overview 最终模型(CV/Private LB为5.8117/5.4030)是CatBoost(5.8240/5.4165)、GRU(5.8481/5.4259)和Transformer(5.8619/5.4296)的组合,权重分别为0.5、0.3、0.2,从验证集中搜索得到。这些模型共享相同的300个特征。 此外,在线学习(On…

2024【大模型】国内市场如何?程序员该何时入局?

1.市场形势 根据最新的市场研究报告&#xff0c;2023年中国的大模型市场呈现出显著的发展趋势和广阔的前景。以下是关于中国大模型市场的几个关键点&#xff1a; 市场规模和增长&#xff1a;2023年&#xff0c;中国AI大模型行业的市场规模达到了147亿元人民币&#xff0c;预计…

stable-diffusion 3 体验部署流程(ComfyUI)

环境准备 下载及简介 git clone https://huggingface.co/stabilityai/stable-diffusion-3-medium SD3 checkpoints&#xff1a; sd3_medium_incl_clips.safetensors (5.5GB)sd3_medium_incl_clips_t5xxlfp8.safetensors (10.1GB)sd3_medium.safetensors (4.3GB) 前两个可以…

RK3568笔记三十二:PaddleSeg训练部署

一、环境 1、Autodl配置 PyTorch 1.7.0Python 3.8(ubuntu18.04)Cuda 11.02、所需环境需求 - OS: 64-bit - Python 3(3.6/3.7/3.8/3.9/3.10)&#xff0c;64-bit version - pip/pip3(9.0.1)&#xff0c;64-bit version - CUDA > 10.2 - cuDNN > 7.6 - PaddlePaddle (the…

qmt量化交易策略小白学习笔记第28期【qmt编程之获取财务数据列表--十大股东和股东数】

qmt编程之获取财务数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 十大股东/十大流通…

数据结构-稀疏数组

稀疏数组是一种特殊的数据结构&#xff0c;主要用于存储那些大部分元素为零或者未使用的大型数组。以下是关于稀疏数组的详细知识点&#xff0c;按照分点表示和归纳的方式整理&#xff1a; 一、定义 稀疏数组是指那些大部分内容值为空&#xff08;通常为0&#xff09;的数组。…

【Spring6】13-19章 JdbcTemplate+代理模式+AOP+Spring事务+Spring集成MyBatis

十三、JdbcTemplate JdbcTemplate是Spring提供的一个JDBC模板类&#xff0c;是对JDBC的封装&#xff0c;简化JDBC代码。 当然&#xff0c;你也可以不用&#xff0c;可以让Spring集成其它的ORM框架&#xff0c;例如&#xff1a;MyBatis、Hibernate等。 接下来我们简单来学习一下…

【网络编程】TCP原理

TCP套接字中的I/O缓冲 write函数调用后并非立即传输数据&#xff0c;read函数调用后也非马上接收数据。write函数调用瞬间&#xff0c;数据将移至输出缓冲&#xff1b;read函数调用瞬间&#xff0c;从缓冲读取数据。 这些IO缓冲特性可整理如下。 口IO缓冲在每个TCP套接字中单…

人工智能发展历程和工具搭建学习

目录 人工智能的三次浪潮 开发环境介绍 Anaconda Anaconda的下载和安装 下载说明 安装指导 模块介绍 使用Anaconda Navigator Home界面介绍 Environment界面介绍 使用Jupter Notebook 打开Jupter Notebook 配置默认目录 新建文件 两种输入模式 Conda 虚拟环境 添…

C#开发-集合使用和技巧(一)常用集合和方法介绍

C#开发-集合使用和技巧 &#xff08;一&#xff09;常用集合和方法介绍常用集合和方法介绍 C#开发-集合使用和技巧1. 集合基础集合介绍集合跟数组对比 2.我们常用的集合类型列表List<T>键值对集合Dictionary<TKey,TValue>队列Queue<T>其他一些集合类型堆栈St…

04-让LLM理解知识 -Prompt

1 Prompt Prompt 可理解为用于指导AI模型生成特定类型、主题或格式内容的文本。在NLP中&#xff0c;Prompt 通常由一个问题或任务描述组成&#xff0c;例如“给我写一篇有关RAG的文章”&#xff0c;这句话就是Prompt。 Prompt赋予了LLM小样本甚至零样本学习的能力。 大模型的…

07 SpringBoot 配置绑定

所谓“配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常&#xff0c;我们会把一些配置信息&#xff08;例如&#xff0c;数据库配置&#xff09;放在配置文件中&#xff0c;然后通过 Java 代码去读取该配置文件&#xff0c;并且把配置文件中指定的配置封…

TF-IDF算法:从文本中发现价值的黄金法则

TF-IDF算法 一、简介二、TF-IDF算法原理2.1 词频&#xff08;TF&#xff09;2.2 逆文档频率&#xff08;IDF&#xff09;2.3 TF-IDF的计算 三、TF-IDF算法应用3.1 搜索引擎3.2 文本分类3.3 信息提取3.4 文本摘要 四、TF-IDF算法的改进4.1、TF-IDF算法的改进4.1.1. 基于词的权重…