简述MyBatis中#{}引用和${}引用的区别

各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!!  

目录

1.有无预编译

优点

缺点

2.SQL执行的快慢

3.能否被SQL注入

4.参数输入方式

5.总结


1.有无预编译

#{}是有预编译的而${}是没有预编译的,那什么是预编译,预编译又有什么优缺点呢?在了解这个之前,预编译进行的步骤:

它会将SQL语法进行解析再进行SQL优化再进行编译,最后才给到数据库进行执行。

优点

但是当有多个SQL语句的时候,预编译就会显得很慢,所以预编译的SQL会被加入到一个缓存区,当只有?处的参数变化时,会直接从缓存区中拿到SQL,让SQL进行执行,这样它的速度就会加快很多。并且执行了SQL优化后,SQL语句就不会因为SQL注入导致数据库被破坏。

缺点

在执行多个不仅仅是参数不同的SQL时每次都需要重新预编译,导致速度不如不预编译的快。

2.SQL执行的快慢

就像上面说的有无预编译的区别,#{}在执行多个仅在参数有所不同的SQL时仅仅在预编译时进行编译省去了SQL的编译,执行效率就更高,而${}则只是一个字符串拼接,每次都要把SQL语句给到数据库进行编译处理再执行,对于多个仅在参数有所不同的SQL时效率低,而在不仅仅是参数不同的SQL语句中${}更加有效率。但是当今的项目大部分都是执行多个仅在参数有所不同的SQL,所以大部分情况都是#{}更有效率。

3.能否被SQL注入

因为#{}在预编译阶段就进行了SQL的优化,导致它不仅仅是SQL的拼接,而是替换?处的参数,所以它不能被SQL注入从而使数据库受到损害。而${}只是对数据的单纯拼接,所以它是会被SQL注入的,就比如以下语句:

@Select("select * from student1 where id<=${id}")
    public List<StudentInfo> getId(Integer id) ;

我们可以直接输入以下内容来获取所有的用户信息

1 or 1=1

也可以输入以下内容直接删除数据库

1;drop database mybatis;

 所以${}是比较危险的。

4.参数输入方式

#{}会根据所对应的参数选择加不加“”,如String类型就会加“”,而Integer类型就不会加引号。而${}在所有情况下都不会加引号。如图:

#{}会进行参数带入

${}直接以字符形势加入字符,这时候就会报错,外面需要自己在参数外加‘’

所以在一般情况下#{}方便很多,我们不需要在参数为String时外面添加引号,但是也有特殊情况,那就是我们需要String类型但是我们不想加引号,如自己选定降序,升序排序。但是我们又怕SQL注入,所以一般对于这种情况我们都会对前端或者后端做出交互限制,让前端发送数字,或者后端把前端的字符转成数字,再以键值对的形式输入参数,这样就算有别的数据也会被判定为不合法。

5.总结

总的来说,#{}的用途更加广泛,也更加安全,它们俩的区别概括一下也就三个点:

1.#{}有预编译${}无预编译

2.#{}写入参数是占位的方式不会被SQL注入,安全,${}是直接以字符的形式写入参数,会被SQL注入,不安全。

3.一般情况的SQL#{}都能完成,但是对于一些特殊场景比如排序,字段名作为参数等情况需要使用${},但是也要注意使用方法。

这里其实还有一个就是模糊查询,正常情况下需要用${},因为例如say like '%hi%',这样的查询我们只能用'%${hi}%',这样的形式来注入参数,而刚好MySQL有个concat拼接字符串的函数,所以我们可以直接使用concat来完成如 say like concat('%',#{hi},'%')。那我们今天就讲到这吧。有到时候和各位说再见了。在这之前:

制作不易,望各位大佬赏个脸,给个三连吧!!谢谢各位大佬了!!!

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

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

相关文章

OceanBase集群如何进行OCP的替换

有OceanBase社区版的用户提出替换 OCP 管控平台的需求。举例来说&#xff0c;之前的OCP平台采用单节点&#xff0c;然而随着OceanBase集群的陆续上线和数量的不断增多&#xff0c;担心单节点的OCP可能面临故障风险&#xff0c;而丧失对OceanBase集群的管控能力。另此外&#xf…

创建vue工程、Vue项目的目录结构、Vue项目-启动、API风格

环境准备 介绍&#xff1a;create-vue是Vue官方提供的最新的脚手架工具&#xff0c;用于快速生成一个工程化的Vue项目create-vue提供如下功能&#xff1a; 统一的目录结构 本地调试 热部署 单元测试 集成打包依赖环境&#xff1a;NodeJS 安装NodeJS 一、 创建vue工程 npm 类…

以Linux为例了解线程

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

IO系列(八) -浅析NIO工作原理

一、简介 现在使用 NIO 的场景越来越多&#xff0c;很多网上的技术框架或多或少的使用 NIO 技术&#xff0c;譬如 Tomcat、Jetty、Netty&#xff0c;学习和掌握 NIO 技术已经不是一个 Java 攻城狮的加分技能&#xff0c;而是一个必备技能。 那什么是 NIO 呢&#xff1f; NIO…

第06章 数据加载、存储与文件格式

以下内容参考自https://github.com/iamseancheney/python_for_data_analysis_2nd_chinese_version/blob/master/%E7%AC%AC05%E7%AB%A0%20pandas%E5%85%A5%E9%97%A8.md 《利用Python进行数据分析第2版》 用以学习和记录。 输入输出通常可以划分为几个大类&#xff1a;读取文本文…

深海奥秘:鳐鱼肽的肌肤之旅

深海&#xff0c;一个神秘又充满生命力的世界&#xff0c;总是带给我们无尽的惊喜。鳐鱼&#xff0c;又被称为“魔鬼鱼”&#xff0c;它的皮肤中含有一种特殊的肽&#xff0c;这种肽不仅分子量适中&#xff0c;易于人体吸收&#xff0c;还具有极高的消化率和生物利用度。来自北…

科技引领乡村振兴新潮流:运用现代信息技术手段,提升农业生产和乡村管理效率,打造智慧化、现代化的美丽乡村

一、引言 随着科技的不断进步&#xff0c;现代信息技术已经渗透到社会的各个领域&#xff0c;成为推动社会发展的重要力量。在乡村振兴战略的背景下&#xff0c;科技的力量同样不容忽视。本文旨在探讨如何运用现代信息技术手段&#xff0c;提升农业生产和乡村管理效率&#xf…

Android软件渲染流程

Android软件渲染流程 一.渲染流程1.VSync信号的监听2.VSync信号触发绘制 二.渲染原理1.画布的获取1.1 渲染缓存的初始化1.2 graphics::Canvas的创建1.3 graphics::Canvas与渲染缓存的绑定1.3.1 SkBitmap的初始化1.3.2 SkiaCanvas与SkBitmap的绑定1.3.3 SkCanvas的创建 2.矩形的…

Transformer系列专题(二)——multi-headed多头注意力机制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、什么是multi-headed&#xff08;多头注意力机制&#xff09;二、multi-headed三、multi-headed结果四、堆叠多层总结 前言 在实践中&#xff0c;当给定相同…

【数据库基础】基本认识数据库--入门引导

文章目录 什么是数据库&#xff1f;主流数据库基本使用安装MySQL连接服务器服务器、数据库、表关系使用案例数据逻辑存储 MySQL架构SQL语句分类什么叫存储引擎 什么是数据库&#xff1f; 数据库是指在磁盘和内存中存储特定结构组织的数据。数据库通常用于存储于某个系统、组织或…

分布式异步框架celery + Redis 安装配置

引入 这里不对web框架做过多说明&#xff0c;到时候在总结一篇 python的常见web框架 django、flask、tornado、sanic、fastapi..各框架区别 - 内部集成功能的多少 django&#xff0c;内部提供了很多组件。 【相对大】flask、tornado、sanic、fastapi… 本身自己功能很少第…

Linux c开发线程锁和条件变量使用

#include <pthread.h> #include <stdio.h> #include <unistd.h>pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond PTHREAD_COND_INITIALIZER;void* thread_function(void* arg) {printf("线程等待唤醒,锁定互斥量...\n");…

【Unitydemo制作】音游制作—排行榜逻辑Json存储

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

查看当前Shell系统环境变量

查看当前Shell系统环境变量 查看命令 env效果 查看Shell变量(系统环境变量自定义变量函数) 命令 set效果 常用系统环境变量 变量名称含义PATH与windows环境变量PATH功能一样&#xff0c;设置命令的搜索路径&#xff0c;以冒号为分割HOME当前用户主目录&#xff1a;/rootSH…

day08-Java常用API

day08——Java常用API 一、今日内容介绍、API概述 各位同学&#xff0c;我们前面已经学习了面向对象编程&#xff0c;使用面向编程这个套路&#xff0c;我们需要自己写类&#xff0c;然后创建对象来解决问题。但是在以后的实际开发中&#xff0c;更多的时候&#xff0c;我们是…

通过 Spring 操作 Redis

要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Java 操作 redis -- 连接 redis 创建项⽬ 勾选 NoSQL 中的 Spring Data Redis 当然, 把 Web 中的 Spring Web 也勾选⼀下.⽅便写接进⾏后续测试. 配置 redis 服务地址 在 application.…

数据库的约束 not null, unique, default, primary key, foreign key, check

约束可以理解成 数据库提供的一种针对数据的合法性进行验证的机制, 在创建表的时候使用 1. 约束类型 NOT NULL - 指示某列不能存储 NULL 值, 表里的这个内容是必填项UNIQUE - 保证某列的每行必须有唯一的值, 不能重复 每次插入/修改时, 都要先触发查询, 如果当前插入/修改的…

mysql存储比特位

一、介绍 二、SQL CREATE TABLE bits_table (id INT PRIMARY KEY AUTO_INCREMENT,bit_value BIGINT UNSIGNED );-- 插入一个 8 位的 BIT 值 INSERT INTO bits_table (bit_value) VALUES (B10101010);-- 查询并格式化输出 SELECT id,bit_value,CONCAT(b, LPAD(BIN(bit_value),…

解决小皮面版搭建php网站数据库连接不了

首先进入mysql bin目录下 并执行cmd mysql -u root -pCREATE USER userlocalhost IDENTIFIED BY pass;GRANT ALL PRIVILEGES ON *.* TO userlocalhost;GRANT SELECT, INSERT, UPDATE ON database_name.* TO xxwlocalhost;FLUSH PRIVILEGES;select host ,user from mysql.user…

pdf文件怎么编辑?分享3个专业的pdf软件!

在数字化时代&#xff0c;PDF文件已成为我们工作、学习中的得力助手。然而&#xff0c;面对需要修改的PDF文件&#xff0c;许多人却感到无从下手。今天&#xff0c;就让我们一起探索如何轻松编辑PDF文件&#xff0c;并介绍几款实用的编辑软件&#xff0c;让你轻松应对各种PDF编…