MyBatis 参数赋值:#{} 和 ${}及区别

目录

一. #{} 和${} 使用

1 对Interger类型的参数

2 对String类型的参数 

二、#{} 和${} 区别

1.性能更好

2.SQL注入

总结


MyBatis 参数赋值有两种方式:#{} 和 ${}

一. #{} 和${} 使用

1 对Interger类型的参数

#{}:
@Select("select username, `password`, age, gender, phone from userinfo where 
id= #{id} ")UserInfo queryById(Integer id);

发现输出的SQL语句:
 select username, `password`, age, gender, phone from userinfo where id= ?
输入的参数并没有在后面拼接,id的值是使用  ? 进型占位。这种SQL 称之为"预编译SQL"。

${}

@Select("select username, `password`, age, gender, phone from userinfo where 
id= ${id} ")UserInfo queryById(Integer id);

这次的参数是直接拼接在SQL语句中。

2 对String类型的参数 

#{}:

@Select("select username, `password`, age, gender, phone from userinfo where 
username= #{name} ")
UserInfo queryByName(String name);

${}

@Select("select username, `password`, age, gender, phone from userinfo where 
username= '${name}' ")UserInfo queryByName(String name);

字符串作为参数时, 需要添加引号 ' ' , 使用 ${} 不会拼接引号 ' ' , 如果不加就会导致程序报错。
注意到:
#{} 使用的是预编译SQL, 通过 ? 占位的方式, 提前对SQL进行编译, 然后把参数填充到SQL语句中。 #{} 会根据参数类型, 自动拼接引号 ' ' 。
${} 会直接进行字符替换, 一起对SQL进行编译。如果参数为字符串, 需要手动加上引号 ' ' 。
参数为数字类型时,也可以加上,查询结果不变,但是可能会导致索引失效,性能下降。

二、#{} 和${} 区别

#{} 和 ${} 的区别就是预编译SQL和即时SQL 的区别。
当发送一条SQL语句给服务器后, 大致流程如下:
  1. 解析语法和语义, 校验SQL语句是否正确
  2. 优化SQL语句, 制定执行计划
  3. 执行并返回结果
一条 SQL如果走上述流程处理,称之为 Immediate Statements(即时 SQL)

1.性能更好

绝大多数情况下, 某一条 SQL 语句可能会被反复调用执行, 或者每次执行的时候只有个别的值不同(比如 select 的 where 子句值不同, update 的 set 子句值不同, insert 的 values 值不同)。如果每次都需要经过上面的语法解析, SQL优化、SQL编译等,则效率就明显不行。
预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句时,不会再次编译(只是输入的参数不同), 省去了解析优化等过程, 以此来提高效率。

2.SQL注入

SQL注入:是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。sql 注入代码: ' or 1 = ' 1 

SQL注入举例:

@Select("select username, `password`, age, gender, phone from userinfo where 
username= '${name}' ")List<UserInfo> queryByName(String name);
@Test
void queryByName() {List<UserInfo> userInfos = userInfoMapper.queryByName(" ' or 1='1 ");System.out.println(userInfos);
}

可以看出,查询的数据并不是想要的数据。${} 可能会产生SQL注入的问题,所以用于查询的字段,尽量使用 #{} 预查询的方式。 

SQL注入是一种非常常见的数据库攻击手段, SQL注入漏洞也是网络世界中最普遍的漏洞之一。 如果发生在用户登录的场景中, 密码输入为 ' or 1='1 , 就可能完成登录。
${} 会有SQL注入的风险, 所以尽量使用#{}完成查询。那么, 是不是 ${} 就没有存在的必要性了呢?
下面来看一下 ${} 的使用场景:
 
1. 排序功能

Mapper实现: 

@Select("select id, username, age, gender, phone, delete_flag, create_time, 
update_time " +"from userinfo order by id ${sort} ")
List<UserInfo> queryAllUserBySort(String sort);
使用  ${sort} 可以实现排序查询。而使用  #{sort} 查询时会自动加引号, 会导致 sql 错误。
那么使用${}仍然存在SQL注入,需要控制参数,只设置为desc或者asc即可。
除此之外, 还有字段和表名作为参数时, 也只能使用  ${}。但也需要考虑SQL注入。
2. like 查询
${}存在SQL注入的问题,所以不能直接使用 ${}。解决办法:使用 mysql 的内置函数 concat() 来处理,实现代码如下:
@Select("select id, username, age, gender, phone, delete_flag, create_time, 
update_time " +"from userinfo where username like concat('%',#{key},'%')")List<UserInfo> queryAllUserByLike(String key);

总结

#{} 和${} 的区别:

1. $符号存在SQL注入问题;

2. $是即时SQL(参数直接拼接),#是预编译SQL(参数通过占位的方式);

3. 像排序功能,like查询等只能使用$,但是得解决SQL注入的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音视频入门基础:WAV专题(3)——FFmpeg源码中,判断某文件是否为WAV音频文件的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.wav 可以判断出某个文件是否为WAV格式的音频文件&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为WAV格式的音频文件呢&#xff1f;它内部其实是通过wav_probe函数来判断的。从文章《FFmpeg源码&#xff1a;av_prob…

uniapp 使用css实现大转盘

思路&#xff1a; 1.一个原型的外壳包裹 2.使用要分配的个数&#xff0c;计算出角度&#xff0c;利用正切函数tan计算出角度对应对边长度 3.使用clip-path画出一个扇形 4.使用v-for循环出对应的份数&#xff0c;依次使用transform rotate旋转对应的角度。 注意&#xff1a…

文件共享功能无法使用提示错误代码0x80004005【笔记】

环境情况&#xff1a; 其他电脑可以正常访问共享端&#xff0c;但有一台电脑访问提示错误代码0x80004005。 处理检查&#xff1a; 搜索里输入“启用或关闭Windows功能”按回车键&#xff0c;在“启用或关闭Windows功能”里将“SMB 1.0/CIFS文件共享支持”勾选后&#xff08;故…

【GoodERP更新日志】增加采购发票、销售发票 批量抵扣记账 批量撤销入账 功能

开源项目GoodERP更新-2024年7月29日 本次提交合并增加的功能或解决的问题&#xff1a; 1、增加采购发票、销售发票 批量抵扣记账 批量撤销入账 功能&#xff08;增加上了批量抵扣记账&#xff08;会检查发票号、开票日期有没有填写上&#xff09;、批量撤销入账 两个批量功能…

SpringBoot整合阿里云短信业务

详细介绍SpringBoot整合阿里云短信服务的每一步过程&#xff0c;同时会将验证码存放到Redis中并设置过期时间&#xff0c;尽量保证实战的同时也让没做过的好兄弟也能实现发短信的功能~ 1. 注册阿里云账号和创建Access Key 首先&#xff0c;你需要注册一个阿里云账号&#xff0…

前端Long类型精度丢失:后端处理策略

文章目录 精度丢失的具体原因解决方法1. 使用 JsonSerialize 和 ToStringSerializer2. 使用 JsonFormat 注解3. 全局配置解决方案 结论 开发商城管理系统的品牌管理界面时&#xff0c;发现一个问题&#xff0c;接口返回品牌Id和页面展示的品牌Id不一致&#xff0c;如接口返回的…

opencascade AIS_MouseGesture AIS_MultipleConnectedInteractive源码学习

AIS_MouseGesture //! 鼠标手势 - 同一时刻只能激活一个。 enum AIS_MouseGesture { AIS_MouseGesture_NONE, //!< 无激活手势 // AIS_MouseGesture_SelectRectangle, //!< 矩形选择&#xff1b; //! 按下按钮开始&#xff0c;移动鼠标定义矩形&…

制造企业,如何做好设备的维修和保养?

生产设备的稳定高效的运行是保障产能、提升品质、降低成本的关键所在。机器也有疲惫之时&#xff0c;定期的维修与保养不仅是延长设备寿命的必要手段。如何科学、系统地做好生产设备的维修与保养&#xff0c;成为了制造企业必须深思并实践的课题。 以下&#xff0c;从几个关键维…

结构体笔记

结构体 C语言中的数据类型&#xff1a; 基本数据类型&#xff1a;char/int/short/double/float/long 构造数据类型&#xff1a;数组&#xff0c;指针&#xff0c;结构体&#xff0c;共用体&#xff0c;枚举 概念&#xff1a; 结构体是用户自定义的一种数据类型&#xff0c…

Python NLTK 情感分析不正确

1、问题背景 一位 Reddit 用户使用 Python 的 NLTK 库来训练一个朴素贝叶斯分类器以研究其他句子的情感&#xff0c;但是无论输入什么句子&#xff0c;分类器总是预测为正面。 2、解决方案 经过仔细检查&#xff0c;发现原始代码中的问题在于 wordList 为空。因此&#xff0…

Cadence23学习笔记(十四)

ARC就是圆弧走线的意思&#xff1a; 仅打开网络的话可以只针对net进行修改走线的属性&#xff1a; 然后现在鼠标左键点那个走线&#xff0c;那个走线就会变为弧形&#xff1a; 添加差分对&#xff1a; 之后&#xff0c;分别点击两条线即可分配差分对&#xff1a; 选完差分对之后…

Redis:管道

1. 面试题 如何优化频繁命令往返造成的性能瓶颈&#xff1f; 问题由来 edis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤&#xff1a; 1 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果)&#xff0c;并监听Socket…

前端框架 element-plus 发布 2.7.8

更新日志 功能 组件 [级联选择器 (cascader)] 添加持久化属性以提升性能 (#17526 by 0song)[日期选择器 (date-picker)] 类型添加月份参数 (#17342 by Panzer-Jack)[级联选择器 (cascader)] 添加标签效果属性 (#17443 by ntnyq)[加载 (loading)] 补充加载属性 (#17174 by zhixi…

vue-快速入门

Vue 前端体系、前后端分离 1、概述 1.1、简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;可以高效地开发用户界面。…

SpringBoot的约车APP-计算机毕业设计源码96773

摘要 本文基于Spring Boot框架设计并实现了一款约车APP&#xff0c;旨在为用户提供便捷的出行服务。通过后端Spring Boot框架和前端交互界面的设计&#xff0c;实现了用户快速叫车、实时定位、路线规划等功能。系统结合了高效的后端处理和直观的用户体验&#xff0c;为用户提供…

分类常用的评价指标-二分类/多分类

二分类常用的性能度量指标 精确率、召回率、F1、TPR、FPR、AUC、PR曲线、ROC曲线、混淆矩阵 「精确率」查准率 PrecisionTP/(TPFP) 「召回率」查全率RecallTP/(TPFN) 「真正例率」即为正例被判断为正例的概率TPRTP/(TPFN) 「假正例率」即为反例被判断为正例的概率FPRFP/(TNFP)…

降Compose十八掌之『鱼跃于渊』| Gesture Handling

公众号「稀有猿诉」 原文链接 降Compose十八掌之『鱼跃于渊』| Gesture Handling UI是用户界面&#xff0c;一个最为基础的功能就是与用户进行交互&#xff0c;要具有可交互性。要想有可交互性就需要处理用户输入事件。手势是最为常见的一种用户输入&#xff0c;今天就来…

SAPUI5基础知识18 - 自定义CSS和主题色

1. 背景 在上一篇博客中&#xff0c;我们通过使用SAPUI5提供的CSS类实现元素间距的调整。在本篇博客中&#xff0c;让我们看一下如何实现自定义的CSS样式。 2. 背景知识 2.1 CSS基础语法 CSS&#xff0c;全称为级联样式表&#xff08;Cascading Style Sheets&#xff09;&a…

6.6 使用dashboard商城搜索导入模板

本节重点介绍 : 模板商城中搜索模板导入模板修改模板 大盘模板商城地址 免费的 地址 https://grafana.com/grafana/dashboards 搜索模板技巧 详情 导入dashboard 两种导入模式 url导入id导入json文件导入 导入 node_exporter模板 https://grafana.com/grafana/dashboa…

“葫芦娃”竟上了SCI论文!当童年碰上科研,你还会觉得科研枯燥吗?

本周投稿推荐 SCI • 能源电力类&#xff0c;1.5-2.0&#xff08;25天来稿即录&#xff09; • 1区计算机类&#xff0c;3.5-4.0&#xff08;1个月录用&#xff09; • CCF推荐&#xff0c;1区-Top&#xff08;3天初审&#xff09; EI • 各领域沾边均可&#xff08;2天录…