Mybatis-底层是如何解决sql注入增删改查操作--删除操作

ops/2025/1/15 12:37:59/

目录

什么是sql注入?

SQL注入如何解决?

如何在Mybatis 中实现删除操作?

方式一:

方式二:

编写单元测试方法进行测试:

小结:


什么是sql注入?

  • SQL注入:通过控制输入来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。

SQL注入最典型的场景,就是用户登录功能

登录操作的原理:

在进行登录操作时,怎么样才算登录成功呢? 如果我们查询到了数据,就说明用户名密码是对的。 如果没有查询到数据,就说明用户名或密码错误。

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

如果返回大于0,说明登录成功

如果返回小于0,说明登录失败

我们编写的SQL语句是基于字符串直接进行拼接的(问题所在) 。 我们输入的用户名无所谓,比如:shfhsjfhja ,而密码呢,就是我们精心设计的,如:' or '1' = '1

那最终拼接的SQL语句,如下所示:

我们知道,or 连接的条件,是或的关系,两者满足其一就可以。 所以,虽然用户名密码输入错误,也是可以查询返回结果的,而只要查询到了数据,就说明用户名和密码是正确的。--这就出现了sql注入的问题。


SQL注入如何解决?

而通过预编译SQL(select * from user where username = ? and password = ?),就可以直接解决上述SQL注入的问题。 

在预编译SQL语句中,当我们执行的时候,会把整个' or '1'='1作为一个完整的参数赋值给第2个问号(等价于对' or '1'='1进行了转义(关键之处),只当做字符串使用)

那么此时再查询时,就查询不到对应的数据了,登录失败。

注意:在以后的项目开发中,我们使用的基本全部都是预编译SQL语句。

并且使用预编译的sql性能会更高。


如何在Mybatis 中实现删除操作?

  • 需求:根据ID删除用户信息

  • SQL:delete from user where id = 5;

  • Mapper接口方法:

    • 方式一:

java">/*** 根据id删除*/
@Delete("delete from user where id = 5")
public void deleteById();

这种方式执行删除操作,调用deleteById方法只能删除id为5的用户信息,因为将id直接写死在代码中了,不可取。 

  • 方式二:

java">/*** 根据id删除*/
@Delete("delete from user where id = #{id}")
public void deleteById(Integer id);

在Mybatis中,我们可以通过参数占位符号 #{...} 来占位,在调用deleteById方法时,传递的参数值,最终会替换占位符。

  • 编写单元测试方法进行测试:

     在单元测试类中,增加如下测试方法.

java">@Test
public void testDeleteById(){userMapper.deleteById(36);
}

        运行单元测试,结果如下:

 运行之后,我们发现,#{...} 占位符,其实最终被替换成了 ?占位符,生成的是预编译的SQL语句。【推荐】

  • DML语句执行完毕,是有返回值的,我们可以为Mapper接口方法定义返回值来接收,如下:

java">/*** 根据id删除*/
@Delete("delete from user where id = #{id}")
public Integer deleteById(Integer id);

 Integer类型的返回值,表示DML语句执行完毕影响的记录数。(小细节)

  • Mybatis的提供的符号,有两个,一个是 #{...},另一个是 ${...},区别如下:

符号说明场景优缺点
#{…}占位符。执行时,会将#{…}替换为?,生成预编译SQL参数值传递安全、性能高 (推荐)
${…}拼接符。直接将参数拼接SQL语句中,存在SQL注入问题表名、字段名动态设置时使用不安全、性能低

在企业项目开发中,强烈建议使用 #{...} 。 


小结:

1. Mybatis 中执行 DML 语句时,有没有返回值?
有, int类型 ,表示 DML 语句执行影响的记录数
2. Mybatis # $ 的区别是什么 ? (面试题)
# 占位符 ,会替换为?生成预编译 SQL (推荐)
$ 字符串拼接符号 , 将参数值直接拼接在 SQL

http://www.ppmy.cn/ops/150284.html

相关文章

如何规模化实现完全自动驾驶?Mobileye提出解题“新”思路

在CES 2025上,Mobileye展示了端到端自动驾驶系统Mobileye Drive™,通过高度集成的传感器、算法和计算平台,可以实现自动驾驶功能的全覆盖。 Mobileye创始人兼首席执行官Amnon Shashua教授 期间,Mobileye创始人兼首席执行官Amnon …

linux手动安装mysql5.7

一、下载mysql5.7 1、可以去官方网站下载mysql-5.7.24-linux-glibc2.12-x86_64.tar压缩包: https://downloads.mysql.com/archives/community/ 2、在线下载,使用wget命令,直接从官网下载到linux服务器上 wget https://downloads.mysql.co…

30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <1> 5分钟快速创建一个springboot web项目

快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui&#xff0c;并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus generator自…

【微服务】面试 2、服务雪崩

服务雪崩概念 主要内容&#xff1a;在微服务项目中&#xff0c;微服务间存在远程调用。若某一服务&#xff08;如服务 d&#xff09;出现故障&#xff0c;调用它的服务&#xff08;如服务 a&#xff09;会失败。若调用方持续向故障服务发起请求&#xff0c;由于服务连接数有限且…

GCC安全编译选项

文章目录 GCC安全编译选项1.BIND_NOW2.NX3.PIC4.PIE5.SP6.NO Rpath/Runpath7.FS8.Ftrapv9.Strip10.安全编译Python GCC安全编译选项 1.BIND_NOW 定义:立即绑定,打开GOT表重定位只读选项 使用方式:LDFlAGS"-Wl,-z,relro,-z,now" ./configure 2.NX 堆栈不可执行:打…

Chatper 4: Implementing a GPT model from Scratch To Generate Text

文章目录 4 Implementing a GPT model from Scratch To Generate Text4.1 Coding an LLM architecture4.2 Normalizing activations with layer normalization4.3 Implementing a feed forward network with GELU activations4.4 Adding shortcut connections4.5 Connecting at…

快速、简单的2D-6D位姿估计:Gen6D算法复现 (pytorch 1.12.1 + cu113)

​ 摘要 记录一下复现Gen6D的过程&#xff0c;主要记录其中遇到的一些bug&#xff0c;主要参考了博主牙牙要健康、Fate-Sky-CSDN博客这两位博主的博客。 参考文章&#xff1a; 【6D位姿估计】【深度学习】windows10下Gen6D代码Pytorch实现 6D姿态估计网络【Gen6D复现】CUDA…

3D可视化产品定制,应用于哪些行业领域?

3D可视化定制服务已广泛渗透至众多行业领域&#xff0c;包括汽车、家居、时尚鞋服、珠宝配饰以及数码电器等&#xff1a; 汽车行业&#xff1a; 借助Web全景技术与3D模型&#xff0c;我们高保真地再现了汽车外观&#xff0c;为用户带来沉浸式的车型浏览体验。用户可在展示界面自…