MyBatis #{} 和 ${} 的区别
前言:
#{} 和 ${} 的区别是 MyBatis 中一个常见的面试题,#{} 和 ${} 是MyBatis 中获取参数的两种方式,但我们在项目中大多数使用的都是 #{} 来获取参数,那么它们两个有什么区别呢?
区别
一. #{} 采用预编译 SQL,${} 采用即时 SQL
现在我们通过 MyBatis 框架的注解方法查询数据库
@Select("select username, `password`, age, gender, phone from userinfo where id=#{id}")
UserInfo queryById(Integer id);
得到的 MyBatis 日志如下
我们可以发现,输出的 SQL 语句中,参数并没有拼接到后面,而是用占位符 ?来代替了,我们将这种 SQL 称为预编译 SQL
现在我们将 #{} 换成 ${}
@Select("select username, `password`, age, gender, phone from userinfo where id=${id}")
UserInfo queryById(Integer id);
再次获取 MyBatis 日志
我们可以看到,这次输出的 SQL 语句,参数直接拼接到了后面,我们将这种 SQL 称为即时 SQL
所以 #{} 采用预编译 SQL ,${} 采用即时 SQL
预编译 SQL,即时 SQL
1.效率更高
原因:
绝⼤多数情况下,某⼀条 SQL 语句可能会被反复调⽤执⾏,或者每次执⾏的时候只有个别的值不同,如果每次都需要 经过语法解析, SQL优化、SQL编译等,则效率就明显不⾏了
通过 #{} 获取参数是预编译 SQL ,会将参数位置用占位符代替,然后直接进行解析,优化,编译,编译⼀次之后会将编译后的 SQL 语句缓存起来,后⾯再次执⾏这条语句时,不会再次编译 (只是输⼊的参数不同), 省去了解析优化等过程, 以此来提⾼效率,相当于就是一个固定的模板,每次往模板里放参数
而通过 ${} 获取参数是即时 SQL ,会将参数拼接到 SQL 语句中,然后再将新构成的 SQL 语句发送给数据库进行解析,优化,编译,当传送下一个参数时,依然会执行相同的流程,所以每次传参以后构造新的 SQL 语句都会执行一遍解析,优化,编译的流程,导致效率较低
2.更安全(防⽌SQL注⼊)
原因:
SQL注⼊:是通过操作输⼊的数据来修改事先定义好的SQL语句,以达到执⾏代码对服务器进⾏攻击的⽅法。
我们上面提到通过 #{} 获取参数是预编译 SQL,相当于就是一个固定的模板,每次往模板里放参数,我们以下面的 SQL 语句为例:
select username, age, gender from userinfo where username=#{username};
上述获取参数是通过 #{} 获取,是预编译 SQL ,所以在还未传入参数的时候,SQL 语句就已经进行解析,优化,编译变成模板了,因此,无论参数输入的是什么内容,都会认为是 username 的值,在 username 这个列中查找对应的数据,因此 SQL 语句的功能不会改变,所以不会存在 SQL 注入
但我们如下所示,通过 ${} 获取参数的话,就是直接把参数的内容进行拼接产生新的 SQL 语句
select username, age, gender from userinfo where username='${username}';
假设我们传的参数为 'or 1='1 通过拼接形成的 SQL 语句为
select username, age, gender from userinfo where username=''or 1='1'
SQL 语句改为上述形式后,黑客便能获得额外的数据,这就是 SQL 注入
二. #{} 会给String类型的参数添加引号,${} 不会
接下来我们再看String类型的参数
@Select("select username, `password`, age, gender, phone from userinfo where username=#{username}")
UserInfo queryByName(String username);
得到的 MyBatis 日志如下
此时我们发送的 SQL 语句成功执行,所以 Mysql 执行的 SQL 语句为:
select username, `password`, age, gender, phone from userinfo where username=‘zhangsan’;
可见,通过 #{} 获取参数时,如果参数的类型是 String ,就会在放到 SQL 语句中时,自动添加引号
现在我们将 #{} 换成 ${}
@Select("select username, `password`, age, gender, phone from userinfo where username=${username}")
UserInfo queryByName(String username);
得到的 MyBatis 日志如下
通过日志我们可以看出,SQL 语句执行失败,因为传入的参数 “zhangsan” 拼接到 SQL 语句中没有加上引号,导致 SQL 语句的语义错误,把 “zhangsan” 认为是一个字段名
现在我们对上面的代码进行一点修改,对参数添加单引号
@Select("select username, `password`, age, gender, phone from userinfo where username='${username}'")
UserInfo queryByName(String username);
再次运行得到的 MyBatis 日志如下
此时我们的 SQL 语句就正确并成功执行了
使用建议
我们尽量使用 #{} 获取参数,如果实在需要 ${} 符号获取,就一定要注意 SQL 注入的问题
相关文章:
MyBatis #{} 和 ${} 的区别
前言: #{} 和 ${} 的区别是 MyBatis 中一个常见的面试题,#{} 和 ${} 是MyBatis 中获取参数的两种方式,但我们在项目中大多数使用的都是 #{} 来获取参数,那么它们两个有什么区别呢? 区别 一. #{} 采用预编译 SQL&…...
计算机科学速成课
建议看看计算机科学速成课,一门很全面的计算机原理入门课程,短短10分钟可以把大学老师十几节课讲的东西讲清楚!整个系列一共41个视频,B站上有中文字幕版。 每个视频都是一个特定的主题,例如软件工程、人工智能、操作系…...
基于单片机的汽车安全气囊系统故障仿真设计
**单片机设计介绍, 基于单片机微波炉加热箱系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的汽车安全气囊系统的故障检测系统是一种用于检测安全气囊系统故障的智能化设备,通过单片机控…...
JPA整合Sqlite解决Dialect报错问题, 最新版Hibernate6
前言 我个人项目中,不想使用太重的数据库,而内嵌数据库中SQLite又是最受欢迎的, 因此决定采用这个数据库。 可是JPA并不支持Sqlite,这篇文章就是记录如何解决这个问题的。 原因 JPA屏蔽了底层的各个数据库差异, 但是…...
算法通关村第十关-青铜挑战快速排序
大家好我是苏麟,今天带来快速排序 . 快速排序 单边快速排序(lomuto 洛穆托分区方案) 单边循环 (lomuto分区) 要点 : 选择最右侧元素作为基准点j 找比基准点小的,i 找比基准点大的,一旦找到,二者进行交换。 交换时机: 找到小的,…...
whisper large-v3 模型文件下载链接
#源码里找到的_MODELS {"tiny.en": "https://openaipublic.azureedge.net/main/whisper/models/d3dd57d32accea0b295c96e26691aa14d8822fac7d9d27d5dc00b4ca2826dd03/tiny.en.pt","tiny": "https://openaipublic.azureedge.net/main/whisp…...
Ajax 之XMLHttpRequest讲解
一直以来都听别人说Ajax,今天终于接触到了。。。。。。。。。。 一.什么是Ajax? 答: AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。 AJAX 异步 JavaScript和XML&#x…...
小程序里面循环使用ref的话获取不到
文章目录 概要问题案例解决方法 概要 在小程序里面一般循环使用ref的话会获取不到 问题案例 //这个时自己封装的组件,然后循环使用 <jilianXuanzhe huoqu"huoqu" :ref"jilianXuanzhe i"></jilianXuanzhe>//如果这样使用的话获取…...
PY32F002B从压缩包到实现串口printf输出
最近学习使用芯领的PY32F002B开发板,记录学习历程供有同样需求的人参考。 本文主要讲述利用开发板实现printf语句串口输出。 开发环境的初步搭建 官方提供了一个压缩文件,文件名py32f002B_231026.zip, 链接:https://pan.baidu.c…...
音视频项目—基于FFmpeg和SDL的音视频播放器解析(八)
介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...
CorelDRAW2024最新版本的图形设计软件
CorelDRAW2024是Corel公司推出的最新版本的图形设计软件。CorelDRAW是一款功能强大的矢量图形编辑工具,被广泛用于图形设计、插图、页面布局、照片编辑和网页设计等领域。 1. 新增的设计工具:CorelDRAW 2024引入了一些全新的设计工具,使用户能…...
【作业】操作系统实验一:进程和线程
文章目录 实验内容一、进程的创建1、编辑源程序2、编辑结果3、编译和运行程序4、解释运行结果 二、进程共享1、运行2、解释运行结果 三、进程终止1、运行2、解释运行结果 四、进程同步1、运行2、解释运行结果 五、Linux中子进程映像的重新装入1、运行2、解释运行结果 六、线程1…...
Linux 环境删除Conda
你可以按照以下步骤操作来删除Conda: 首先,停止所有conda环境。在终端中运行以下命令: conda deactivate然后使用以下命令获取conda安装的路径: which conda如果成功安装了conda,该命令输出的路径应该是类似于这样的&a…...
uni-app(1)pages. json和tabBar
第一步 在HBuilderX中新建项目 填写项目名称、确定目录、选择模板、选择Vue版本:3、点击创建 第二步 配置pages.json文件 pages.json是一个非常重要的配置文件,它用于配置小程序的页面路径、窗口表现、导航条样式等信息。 右键点击pages,按…...
window系统vscode 编译wvp前端代码
下载代码 wvp-GB28181-pro: WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的网络视频平台,负责实现核心信令与设备管理后台部分,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联,支持rtsp/rtmp等…...
获取虎牙直播源
为了今天得LOL总决赛 然后想着下午看看 但是网页看占用高 就想起来有个直播源 也不复杂看了大概一个小时 没啥问题 进入虎牙页面只有 直接F12 网络 然后 看这个长条 一直在获取 发送 那就选中这个区间 找到都是数字这一条 如果直接访问的话会一直下载 我这都取消了 然后 打开…...
Halcon (2):Halcon基础知识
文章目录 文章专栏视频资源前言Halcon文档案例学习结论 文章专栏 Halcon开发 视频资源 机器视觉之C#联合Halcon 前言 本章我们主要讲解Halcon的基础语法 Halcon文档 按下F1,就可以看到Halcon的文档,不过都是纯英文的 如果不清楚参数如何使用&#x…...
测不准原理
测不准原理 算符的对易关系 commutation relation 测不准原理的矢量推导 Schwarz inequality: 设对易关系: 设一个新态: 投影: 那么有: 代回Schwarz inequality 即可证明:...
微机原理_12
一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。〕 十进制正数56的 8位二进制补码是()。 A. 00011001 B. 10100110 C. 10011001 D. 00100110 若栈顶的物理地址为20100H,当执行完指令PUSH…...
设计模式(5)-使用设计模式实现简易版springIoc
自定义简易版springIoc 1 spring使用回顾 自定义spring框架前,先回顾一下spring框架的使用,从而分析spring的核心,并对核心功能进行模拟。 数据访问层。定义UserDao接口及其子实现类 public interface UserDao {public void add(); }public…...
数据结构与集合源码
我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 本…...
nodejs+vue面向中小学课堂教学辅助软件系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计
主要功能有,管理员通过后台会对此教学辅助进行审核,管理员在还可以进行首页、个人中心、学生管理、教师管理、班级信息管理、科目名称管理、课程信息管理、教学资料管理、作业信息管理、作业提交管理、作业成绩管理、在线考试管理、试题管理、考试管理、…...
智能配电系统解决方案
智能配电系统解决方案是一种集成了先进技术和智能化功能的配电系统,它能够提高电力系统的效率、可靠性和安全性。力安科技智能配电系统解决方案依托电易云-智慧电力物联网,具体实施的方案如下: 智能化设备和传感器:采用智能化的开…...
Python基础入门---conda 如何管理依赖包以及复制相同环境的
文章目录 创建虚拟环境:创建虚拟环境并指定Python版本:安装依赖包:从环境导出依赖包清单:从依赖包清单创建环境:复制环境:移植环境:在Conda中,你可以使用conda create命令来创建和管理虚拟环境,而使用conda install命令来安装和管理依赖包。以下是一些基本的命令和步骤…...
JVM jstat 查看内存新生代老年代回收情况,排查oom
jstat 命令 jstat - [-t] [-h] [ []] option:我们经常使用的选项有gc、gcutil vmid:java进程id interval:间隔时间,单位为毫秒 count:打印次数 每秒打印一次 jstat -gc 9162 1000S0C:年轻代第一个survivor的容量…...
Postman启动问题:Could not open Postman
Postman启动问题:Could not open Postman 状态,在单击Postman之后一直在转圈圈,无法正常启动。 细心的朋友会发现,右下角 会经常出现防火墙关闭等提示信息,表示该程序,在向外链接。 Error Could not open…...
Golang起步篇(Windows、Linux、mac三种系统安装配置go环境以及IDE推荐以及入门语法详细释义)
Golang起步篇 Golang起步篇一. 安装Go语言开发环境1. Wondows下搭建Go开发环境(1). 下载SDK工具包(2). 解压下载的压缩包,放到特定的目录下,我一般放在d:/programs下(路径不能有中文或者特殊符号如空格等)(3). 配置环境变量步骤1:先打开环境变…...
Error message “error:0308010C:digital envelope routines::unsupported“
1.降级到 Node.js v16。 您可以从 Node.js 的 website 重新安装当前的 LTS 版本。 您也可以使用 nvm。对于 Windows,请使用 nvm-windows。 2.启用传统 OpenSSL 提供程序。 在类 Unix 系统(Linux、macOS、Git bash 等)上: exp…...
解决java在idea运行正常,但是打成jar包后中文乱码问题
目录 比如: 打包命令使用utf-8编码: 1.当在idea中编写的程序,运行一切正常.但是当被打成jar包时,执行的程序会中文乱码.产生问题的原因和解决方案是什么呢? 一.问题分析 分别使用idea和jar包形式打印出System中所有的jvm参数---代码如下: public static…...
数据结构-插入排序+希尔排序+选择排序
目录 1.插入排序 插入排序的时间复杂度: 2.希尔排序 希尔排序的时间复杂度: 3.选择排序 选择排序的时间复杂度: 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的…...
柬埔寨做网站/浏览器老是出现站长工具
中国气象局与交通运输部2021年07月22日联合发布全国主要公路气象预报7月22日20时至23日20时,内蒙古东北部、黑龙江西北部、西藏南部、陕西南部、黄淮西部、浙江中东部、四川盆地东南部、云南、广西西南部和沿海、广东西南部、海南岛等地部分地区有中到大雨ÿ…...
j昆明网站制作公司/中国企业500强排行榜
git pull解决no tracking information问题点击以下链接跳转到原文: http://www.onlycalm.cn/docs/Git/git pull解决no tracking information问题/...
wordpress the7汉化版/考证培训机构报名网站
1.参考:python核心编程 2. 转载于:https://www.cnblogs.com/sophia194910/p/5755995.html...
网站修改用什么工具/推广营销方案
OSI七层模型模型图如下: 前三层(应用层,表示层,会话层)》给用户提供服务。 后四层(传输层,网络层,数据链路层,物理层)》数据传递提供服务。 其中 数据链路层中…...
wordpress比赛模板/有道搜索
很多人电脑用久了 会感觉运行速度很慢 心想刚买来的时候很快的啊 随着时间导致计算机系统运行速度变慢原因大致分为以下4点。一、排除病毒原因方法:1、升级杀毒软件,进行全面查杀2、利用专杀工具进行进一步查杀3、查出病毒,无法杀毒。进入安全…...
楚雄州州纪网站党风廉政建设/企业管理培训机构
node-schedule 官方 Nodejs学习笔记(十二)— 定时任务(node-schedule) Nodejs定时任务(node-schedule) 安装: npm install node-schedule --save # 或者 yarn add node-schedule用法 1、Cron风格定时器 const …...