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

Mybatis-09.基础操作-删除(预编译SQL)

一.预编译SQL

我们执行的SQL语句的结果虽然在可视化界面中可以看到。但是执行的过程并没有直观的看到。因此在mybatis框架当中,我们可以借助mybatis的日志来看到这些信息。这些日志是默认没有开启的,是关闭的,要查看日志,要按如下操作。

配置好后再次执行,发现确实是变了

这个SQL语句有一个专业的名字,叫做预编译SQL。 

采用预编译SQL,参数会替换掉?,从而删除掉id=16的结果。 

二.为什么要采用预编译的SQL?

一个SQL语句在执行时,会先检查缓存中是否有,有的话直接执行缓存中的SQL语句,如果没有的话先缓存再执行。

不使用预编译SQL,那么id不一样,就要重新缓存再执行

如果使用预编译: 

第一次id = 1,delete from emp where id = ?在缓存当中没有,因此要先存入缓存中。第二次id = 2和id = 3直接执行就行,因为缓存中已经有了。这样就只需要预编译一次就行。 性能更高。

三.SQL注入

使用预编译SQL可以防止SQL注入问题,那么什么是SQL注入呢?

在后台管理系统的登录中,通过输入的用户名和密码,我们在数据库中进行校验。如果账号和密码校验成功那么便能够登录系统。将账号和密码填入到select count(*) from emp where username = '   ' and password = '   ',如果在数据库中找到了正确的信息,那么就证明该用户的账号密码正确,从而可以登录。但是有一个问题:

当我用户名随意输入,而密码输入为 ' or '1' = '1 时,仍然可以登录,这是为什么呢?

 、

原因在于如果不使用预编译的SQL语句,那么就会将账号和密码拼接到其相应的位置,那么就会导致其SQL语句被更改,从而进行登录。当我们添加上 ' or '1' = '1时,SQL语句变为:

select count(*) from emp where username = 'wueiuwieuwueiw' and password = '' or '1' = '1'

这样的话后面的or '1' = '1'会永远成立,导致前面的条件判断失效,进而导致非用户也可以登录。

要想解决这个问题,就不能使用直接拼接sql语句的形式,而是应该使用预编译sql的形式。在预编译中会将输入作为一个整体填入到?占位符的地方,从而避免SQL注入问题。

那么如何使用MySQL的预编译语句呢?只要使用#{}这个预编译的占位符,那么就可以生成预编译SQL。编译后会被?替代掉。


http://www.kler.cn/a/372430.html

相关文章:

  • 【LLM论文日更】| 训练大型语言模型在连续潜在空间中进行推理
  • Flink中并行度和slot的关系——任务和任务槽
  • 前端文件下载多方式集合
  • WebPack3项目升级webpack5的配置调试记录
  • windows 默认的消息ID有那些---我与大模型对话
  • KAFKA 权威指南笔记(一)究竟应该配置多少个BROKER?
  • 从零学习大模型(八)-----P-Tuning(上)
  • 【大数据学习 | kafka】kafka的shell操作
  • 【数据库】数据库管理(下)存储过程 触发器 慢查询日志 备份与恢复
  • 在vue项目中,如何写一个自定义指令
  • 【JavaScript】JavaScript 进阶-3-编程思想构造函数原型(更新中)
  • python 实现了一个简单的五子棋游戏
  • 三季度业绩获多家机构首肯,“听劝的”B站终于“起死回生”?
  • Python的协程与传统的线程相比,是否能更有效地利用计算资源?在多大程度上,这种效率是可测量的?如何量化Python协程的优势|协程|线程|性能优化
  • 【系统设计】深入理解HTTP缓存机制:从Read-Through缓存到HTTP缓存的交互流程
  • 小红书小眼睛低于100的进
  • 视频协议与封装格式
  • 题目:输入某年某月某日,判断这一天是这一年的第几天?
  • 【Qt】QProcess用法小结
  • C# Solidworks二次开发:宏录制实战讲解(第一讲)
  • echarts属性之axisPointer
  • SELS-SSL/TLS
  • 【python】os.fork进程创建
  • SCSI驱动与 UFS 驱动交互概况
  • Maven 下载与安装详细教程,新手也很适用!
  • unity3d——Time