Mybatis中#和$的区别

在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注入。
  • 在大多数情况下,应该优先使用 #{} 而不是 ${}。当确实需要使用 ${} 时,请确保输入是安全的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus+Grafana监控MySQL

一、准备 grafana服务器&#xff1a;192.168.48.136Prometheus服务器&#xff1a;192.168.48.136被监控服务器&#xff1a;192.168.48.134、192.168.48.135查看时间是否同步 二、安装prometheus server 【2.1】安装 # 解压安装包 tar -zxvf prometheus-2.52.0.linux-amd64.t…

location.href = ‘welcome.html‘;报错 - Completed 406 NOT_ACCEPTABLE

巧妙解决方案&#xff0c;使用服务端进行redirect即可 。 package com.aliyun.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping;Controller public class RedirectController {GetMapping("/r…

华为云CodeArts API:API管理一体化平台 5月新特性上线啦!

CodeArts API是华为云API全生命周期管理一体化解决方案平台&#xff0c;支持开发者高效实现API设计、API开发、API测试、API托管、API运维、API变现的一站式体验。 通过以API契约为锚点&#xff0c;CodeArts API保证API各阶段数据高度一致&#xff0c;为开发者提供友好易用的A…

【kubernetes】k8s中包管理工具-----Helm 超详细解读

目录 一、Helm 1.1什么是 Helm 1.2Helm 有三个重要的概念 1.2.1Chart 1.2.2Repository&#xff08;仓库&#xff09; 1.2.3Release 1.3Helm3 与 Helm2 的区别 二、Helm 部署 2.1安装 helm 2.2命令补全 2.3使用 helm 安装 Chart 2.3.1添加常用的 chart 仓库 2.3.2…

数据结构 实验 2

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

Linux C语言:字符串处理函数

一、字符串函数 1、C库中实现了很多字符串处理函数 #include <string.h> ① 求字符串长度的函数strlen② 字符串拷贝函数strcpy③ 字符串连接函数strcat④ 字符串比较函数strcmp 2、字符串长度函数strlen 格式&#xff1a;strlen(字符数组)功能&#xff1a;计算字符串…

Spring AI 接入OpenAI实现文字生成图片功能

Spring AI 框架集成的图片大模型 2022年出现的三款文生图的现象级产品&#xff0c;DALL-E、Stable Diffusion、Midjourney。 OpenAI dall-e-3dall-e-2 Auzre OpenAI dall-e-3dall-e-2 Stability stable-diffusion-v1-6 ZhiPuAI cogview-3 OpenAI 与 Auzer OpenAI 使用的图片…

接口自动化测试工程化——了解接口测试

什么是接口测试 接口测试也是一种功能测试 我理解的接口测试&#xff0c;其实也是一种功能测试&#xff0c;只是平时大家说的功能测试更多代指 UI 层面的功能测试&#xff0c;而接口测试更偏向于服务端层面的功能测试。 接口测试的目的 测试左移&#xff0c;尽早介入测试&a…

6.归并+快排

5. 归并排序 核心思想 将无序数组从中间分为左右两个部分&#xff0c;分别给左右两个部分排序&#xff0c;排序以后把两个有序区间进行合并 把数组从中间分为左右两部分分别对前后两部分进行排序将排好序的两部分合并 包含两个部分&#xff1a;拆解阶段和合并阶段 归并排序…

跨平台看抖音、哔哩哔哩、虎牙、斗鱼啦,一个app即可完成

一、简介 1、一款免费、开源、无广告、跨平台的,可以观看抖音、哔哩哔哩、虎牙、斗鱼等平台的直播内容的软件。它简单好用,支持 Windows、MacOS、Linux、Android、iOS 等平台。 二、下载 1、文末有下载链接,apk手机可直接安装,不明白可以私聊我哈(麻烦咚咚咚,动动小手给个…

详解QFileSystemModel的使用

在Qt应用程序开发中&#xff0c;QFileSystemModel是一个强大的类&#xff0c;用于展示和操作文件系统的信息。它基于标准的QAbstractItemModel&#xff0c;提供了浏览本地文件系统目录树的能力&#xff0c;并且能够自动更新以反映文件系统的变化。本文将详细讲解QFileSystemMod…

MongoDB——写入耗时

mongodb写入10万条数据的耗时差不多是1s import time import pymongo from pymongo import MongoClient# 连接到MongoDB client MongoClient(mongodb://localhost:27017/) db client[test_db] collection db[test_collection]# 生成10万条数据 documents [{"name&quo…

ThinkPHP内核在线客服系统源码多商户版 对接适用场景(PC+WAP+公众号)

源码介绍 大部分站长都了解美洽系统&#xff0c;就跟这种类似的&#xff0c;可以实现一行代码接入客服&#xff0c;非常舒服&#xff0c;支持无限客服&#xff0c;无限坐席! 私有化源码部署&#xff0c;数据可控&#xff0c;稳定可靠。可自定义版权、logo。支持网页、微信公众…

CPN tools学习——可执行的 PN

目录 1添加令牌 2.转换防护Guard 1添加令牌 左侧新建颜色集和变量的声明定义&#xff1a; 为库所分配颜色集&#xff1a;左键tab键 P1处&#xff1a;添加多重集合&#xff0c;表示添加了两个令牌&#xff0c;第一个令牌值为A&#xff0c;第二个为B。 P2处&#xff1a;表示…

docker的教程长亭

把我的常用docker写在这里 之前用 vul - hub 靶场经常用 现在docker不知道为什么挂了 开启 docker-compose up -d 关闭 docker-compose down docker ps 只是运行 docker ps -a 所有 包括停止 docker ps -q 只看id docker stop <container_name_or_id> docker 的容器…

辣椒属2个T2T基因组-文献精读23

Two telomere-to-telomere gapless genomes reveal insights into Capsicum evolution and capsaicinoid biosynthesis 两个端粒到端粒无缝基因组揭示了辣椒进化和辣椒素生物合成的相关见解 摘要 辣椒&#xff08;Capsicum&#xff09;因其果实中含有辣椒素而闻名&#xff0c…

zabbix自定义监控mysql状态和延迟

zabbix自定义监控mysql状态和延迟 文章目录 zabbix自定义监控mysql状态和延迟zabbix自定义监控mysql状态配置主从配置自定义监控添加监控项添加触发器模拟测试异常 zabbix自定义监控mysql延迟配置自定义监控添加监控项添加触发器测试 zabbix自定义监控mysql状态 配置主从 1.安…

【区间合并 差分 栈】3169. 无需开会的工作日

本文涉及知识点 区间合并 差分数组&#xff08;大约2024年7月1号发) LeetCode3169. 无需开会的工作日 给你一个正整数 days&#xff0c;表示员工可工作的总天数&#xff08;从第 1 天开始&#xff09;。另给你一个二维数组 meetings&#xff0c;长度为 n&#xff0c;其中 me…

蓝牙模块的安全性与隐私保护

蓝牙模块作为现代无线通信的重要组成部分&#xff0c;在智能家居、可穿戴设备、健康监测等多个领域得到了广泛应用。然而&#xff0c;随着蓝牙技术的普及&#xff0c;其安全性和隐私保护问题也日益凸显。本文将探讨蓝牙模块在数据传输过程中的安全性问题&#xff0c;分析隐私保…