当前位置: 首页 > news >正文

简述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},'%')。那我们今天就讲到这吧。有到时候和各位说再见了。在这之前:

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

相关文章:

  • 春秋云境CVE-2023-50564
  • 金丝雀发布(灰度发布)介绍 及 声明式管理方法简介
  • 全国智慧海洋与大数据技术应用行业产教融合共同体成立
  • 【IPD进阶】学习IPD流程,从黑话开始
  • Shell编程之条件判断语句
  • 为什么说kafka没办法保证数据不丢?
  • 如何解决爬虫的IP地址受限问题?
  • flutter使用dbus插件时,在终端无法使用“dart-dbus”命令
  • PostgreSQL自带的命令行工具25- ecpg
  • onload和onunload有什么区别(代码举例说明)
  • 【元壤教育】全国最具价值的AIGC培训课程学前须知
  • 如何在 Git 中处理和解决分支合并冲突?
  • js如何遍历FormData的值
  • C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题
  • 分布式异步框架celery + Redis 安装配置
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • github指令
  • JavaScript函数式编程(一)
  • Java知识点总结(JavaIO-打印流)
  • KMP算法及优化
  • PHP的Ev教程三(Periodic watcher)
  • python docx文档转html页面
  • sublime配置文件
  • Vue学习第二天
  • 闭包,sync使用细节
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 每天10道Java面试题,跟我走,offer有!
  • 模型微调
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前端面试总结(at, md)
  • 浅谈web中前端模板引擎的使用
  • 如何学习JavaEE,项目又该如何做?
  • 少走弯路,给Java 1~5 年程序员的建议
  • 微信开源mars源码分析1—上层samples分析
  • 原生Ajax
  • 正则学习笔记
  • 带你开发类似Pokemon Go的AR游戏
  • $.ajax()参数及用法
  • %check_box% in rails :coditions={:has_many , :through}
  • (26)4.7 字符函数和字符串函数
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (三)终结任务
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)memcache、redis缓存
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • ... 是什么 ?... 有什么用处?
  • .equals()到底是什么意思?
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net8 Blazor 尝鲜
  • .NET文档生成工具ADB使用图文教程
  • @Documented注解的作用
  • @Resource和@Autowired的区别