MyBatis SQL语句 #{} 和 ${}的区别

news2024/12/24 9:19:48

在这里插入图片描述

T04BF

👋专栏: 算法|JAVA|MySQL|C语言

🫵 今天你敲代码了吗

文章目录

    • 关于 #{} 和 ${}
      • 1. Integer类型的参数
      • 2.String 类型的参数
      • 3. #{} 和 ${} 的区别
        • 3.1 性能问题:
        • 3.2 安全问题

关于 #{} 和 ${}

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

1. Integer类型的参数

(1)${}

<update id="updateUser">
  update userinfo set phone = ${phone} where id = ${id}
</update>

测试结果:
image.png
此时得到的参数ID是直接拼接在sql语句里面了,这种是"即时SQL"
(2)#{}

<update id="updateUser">
  update userinfo set phone = ${phone} where id = #{id}
</update>

image.png
与前一种方式不一致的是,输入的参数不是在后面直接拼接,而是使用?进行占位,这种是"预编译SQL"

2.String 类型的参数

(1) ${}

<select id="queryUserByUsername" resultMap="XMLBaseMap">
  select * from userinfo where username = #{username}
</select>

测试:

@Test
void queryUserByUsername() {
    System.out.println(userInfoMapper.queryUserByUsername("zhangsan"));
}

执行结果:
image.png
(2) #{}

<select id="queryUserByUsername" resultMap="XMLBaseMap">
  select * from userinfo where username = ${username}
</select>

测试结果:
image.png
此时的SQL语句是:
image.png
可以看到,这次的参数也是直接拼接在sql语句后面了,但是字符串作为参数的时候,需要加上''
使用${} 不会自动拼接引号
因此需要我们自己添加引号
image.png

3. #{} 和 ${} 的区别

3.1 性能问题:

绝大部分情况下,一条SQL语句是会被重复执行的,或者每次执行的参数不一样(如where后面的条件参数)
如果每次都需要经过上面的语法解析,SQL优化,SQL编译等,则会影响效率
而预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,后面再执行的时候,只是参数不同就不会再次编译,提高了效率

3.2 安全问题

使用预编译SQL可以防止SQL注入的问题

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

select * from userinfo where username = ‘${username}’

' or 1 = '1作为字符串参数传进去,就会得到下面的SQL语句:
image.png
那么如果此时是delete,后果不堪设想

那么是不是说由于SQL注入的问题,就必须无脑使用#{}??
实际上,在一些需求里面,我们不得不使用${}
如排序功能
如果使用#{}:

<select id="queryUserInfoByOrder" resultMap="XMLBaseMap">
  select * from userinfo order by id #{order}
</select>

此时需要将order作为字符串传入
但是由于使用#{} 会自动加上引号,就会出现问题

<select id="queryUserInfoByOrder" resultMap="XMLBaseMap">
  select * from userinfo order by id #{order}
</select>

执行结果:
image.png
这种情况就不得不使用${}了,但是怎么解决SQL注入问题呢??
– 通过枚举,页面或者判断的方式控制参数,只能为desc 或 asc
like查询
like使用#{} 会报错
image.png
还是由于#{} 自动加引号导致的
此时还是不得不使用${}
image.png
还是得解决SQL注入的问题:
在sql里面,CONCAT函数用于将两个或多个字符串值连接成一个字符串,可以用于解决这个问题

<select id="queryUserInfoLike" resultMap="XMLBaseMap">
  select * from userinfo where username like concat('%',#{key},'%');
</select>

image.png

感谢您的访问!!期待您的关注!!!

在这里插入图片描述

T04BF

🫵 今天记得敲代码

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

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

相关文章

Spring Security学习笔记(二)Spring Security认证和鉴权

前言&#xff1a;本系列博客基于Spring Boot 2.6.x依赖的Spring Security5.6.x版本 上一篇博客介绍了Spring Security的整体架构&#xff0c;本篇博客要讲的是Spring Security的认证和鉴权两个重要的机制。 UsernamePasswordAuthenticationFilter和BasicAuthenticationFilter是…

C++:平衡搜索二叉树(AVL)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;平衡搜索二叉树&#xff08;AVL&#xff09;》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 :maple_leaf:AVL树:maple_leaf:…

Redis 7.x 系列【27】集群原理之通信机制

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2 节点和节点2.1 集群拓扑2.2 集群总线协议2.3 流言协议2.4 心跳机制2.5 节点握…

matlab仿真 数字信号载波传输(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第七 章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; clear all M8; msg[1 4 3 0 7 5 2 6]; ts0.01; T1; %t0:ts:T; t0:ts:T-ts; %x0:ts:length(msg); x0:ts:length(msg)-ts; f…

爬虫 APP 逆向 ---> 粉笔考研

环境&#xff1a; 粉笔考研 v6.3.15&#xff1a;https://www.wandoujia.com/apps/1220941/history_v6031500雷电9 模拟器&#xff1a;https://www.ldmnq.com/安装 magisk&#xff1a;https://blog.csdn.net/Ruaki/article/details/135580772安装 Dia 插件 (作用&#xff1a;禁…

前端开发知识-vue

大括号里边放键值对&#xff0c;即是一个对象。 一、vue可以简化前端javascript的操作。 主要特点是可以实现视图、数据的双向绑定。 使用vue主要分为三个步骤&#xff1a; 1.javascript中引入vue.js 可以src中可以是vue的网址&#xff0c;也可以是本地下载。 2.在javasc…

地形材质制作(能使地面湿润)

如图&#xff0c;创建一个材质并写以下逻辑 Landscape Layer Blend节点能使在地形模式绘制中有三个选择&#xff0c;根据以上逻辑&#xff0c;Red是原材质,Green是绿色材质也就是草&#xff0c;Blue为水&#xff08;这个我认为比较重要&#xff09; Blue的颜色最好为这个 这个节…

董宇辉离职,我一点都不意外!只不过感觉来的太快

下面这张图&#xff0c;是我在半年多前写的一段随笔&#xff0c;没想到来的这么快&#xff01; 碰巧的是今天中午&#xff0c;在开发者群里有两位老铁自曝&#xff0c;本以为能公司干到老&#xff0c;但公司却不给机会&#xff0c;已经不在是公司员工了。 最近&#xff0c;晓衡…

一些关于颜色的网站

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 1、中国传统色 2、网页颜色选择器 3、渐变色网站 4、多风味色卡生成 5、波浪生成 6、半透明磨砂框 色卡组合

苍穹外卖01

0. 配置maven (仅一次的操作 1.项目导入idea 2. 保证nginx服务器运行 &#xff08;nginx.exe要在非中文的目录下&#xff09; 开启服务&#xff1a; start nginx 查看任务进程是否存在&#xff1a; tasklist /fi "imagename eq nginx.exe" 关闭ngi…

SAPUI5基础知识20 - 对话框和碎片(Dialogs and Fragments)

1. 背景 在 SAPUI5 中&#xff0c;Fragments 是一种轻量级的 UI 组件&#xff0c;类似于视图&#xff08;Views&#xff09;&#xff0c;但它们没有自己的控制器&#xff08;Controller&#xff09;。Fragments 通常用于定义可以在多个视图中重用的 UI 片段&#xff0c;从而提…

【数据结构--排序】

目录 一、排序概述1.1、排序的相关定义1.2、排序用到的结构与函数 二、常见排序算法2.1、冒泡算法&#xff08;交换顺序&#xff09;&#xff08;1&#xff09;算法&#xff08;2&#xff09;性能分析 2.2、简单选择排序&#xff08;1&#xff09;算法&#xff08;2&#xff09…

express连接mysql

一、 安装express npm install express --save二、express配置 //引入 const express require("express"); //创建实例 const app express(); //启动服务 app.listen(8081, () > {console.log("http://localhost:8081"); });三、安装mysql npm i m…

《昇思25天学习打卡营第6天|ResNet50图像分类》

写在前面 从本次开始&#xff0c;接触一些上层应用。 本次通过经典的模型&#xff0c;开始本次任务。这里开始学习resnet50网络模型&#xff0c;应该也会有resnet18&#xff0c;估计18的模型速度会更快一些。 resnet 通过对论文的结论进行展示&#xff0c;说明了模型的功能&…

第2章 编译SDK

安装编译依赖 sudo apt-get update sudo apt-get install clang-format astyle libncurses5-dev build-essential python-configparser sconssudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool \ expect g patchelf chrpath gawk texinfo chrpath diffstat …

springboot促进高等教育可持续发展管理平台-计算机毕业设计源码36141

摘 要 随着全球对可持续发展的日益关注&#xff0c;高等教育作为培养未来领导者和创新者的摇篮&#xff0c;其在推动可持续发展中的角色日益凸显。然而&#xff0c;传统的高等教育管理模式在应对复杂多变的可持续发展挑战时&#xff0c;显得力不从心。因此&#xff0c;构建一个…

stm32入门-----USART串口实现数据包的接收和发送

目录 前言 数据包 1.HEX数据包 2.文本数据包 C编程实现stm32收发数据包 1.HEX数据包的收发 2.文本数据包的收发 前言 前面几期讲解了USART串口发送数据和接收数据的原理&#xff0c;那本期在前面的基础上学习stm32 USART串口发送和接收数据包。本期包括两个项目&a…

数据库作业四

1. 修改 student 表中年龄&#xff08; sage &#xff09;字段属性&#xff0c;数据类型由 int 改变为 smallint &#xff1a; ALTER TABLE student MODIFY Sage SMALLINT; 2. 为 Course 表中 Cno 课程号字段设置索引&#xff0c;并查看索引&#xff1a; ALTER TABLE…

Linux系统下非root用户自行安装的命令切换为root权限时无法使用,提示comman not found解决办法

今天在开发的时候遇上了一个问题就是要去我们数据平台中进行数据的提取&#xff0c;数据存储用的是minio&#xff0c;一个MinIO部署由一组存储和计算资源组成&#xff0c;运行一个或多个 minio server 节点&#xff0c;共同作为单个对象存储库。独立的MinIO实例由具有单个 mini…

多区域DNS以及主从DNS的搭建

搭建多域dns服务器&#xff1a; 搭建DNS多区域功能&#xff08;Multi-Zone DNS&#xff09;主要是为了满足复杂网络环境下的多样化需求&#xff0c;提高DNS服务的灵活性、可扩展性和可靠性。 适应不同网络环境&#xff1a; 在大型组织、跨国公司或跨地域服务中&#xff0c;网…