1.3 删除 1.3.1 功能实现 页面原型:
当我们点击后面的"删除"按钮时,前端页面会给服务端传递一个参数,也就是该行数据的ID。 我们接收到ID后,根据ID删除数据即可。
功能:根据主键删除数据
SQL语句
-- 删除id=17的数据 delete from emp where id = 17; AI生成项目 sql Mybatis框架让程序员更关注于SQL语句
接口方法
@Mapper public interface EmpMapper {
//@Delete("delete from emp where id = 17")
//public void delete();
//以上delete操作的SQL语句中的id值写成固定的17,就表示只能删除id=17的用户数据
//SQL语句中的id值不能写成固定数值,需要变为动态的数值
//解决方案:在delete方法中添加一个参数(用户id),将方法中的参数,传给SQL语句/*** 根据id删除数据* @param id 用户id*/
@Delete("delete from emp where id = #{id}")//使用#{key}方式获取方法中的参数值
public void delete(Integer id);
} AI生成项目 java 运行
@Delete注解:用于编写delete操作的SQL语句
如果mapper接口方法形参只有一个普通类型的参数,#{…} 里面的属性名可以随便写,如:#{id}、#{value}。但是建议保持名字一致。
测试
在单元测试类中通过@Autowired注解注入EmpMapper类型对象
@SpringBootTest class SpringbootMybatisCrudApplicationTests { @Autowired //从Spring的IOC容器中,获取类型是EmpMapper的对象并注入 private EmpMapper empMapper;@Test public void testDel(){ //调用删除方法 empMapper.delete(16); }} AI生成项目 java 运行
1.3.2 日志输入 在Mybatis当中我们可以借助日志,查看到sql语句的执行、执行传递的参数以及执行结果。具体操作如下:
打开application.properties文件
开启mybatis的日志,并指定输出到控制台
#指定mybatis输出日志的位置, 输出控制台 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl AI生成项目 XML 开启日志之后,我们再次运行单元测试,可以看到在控制台中,输出了以下的SQL语句信息:
但是我们发现输出的SQL语句:delete from emp where id = ?,我们输入的参数16并没有在后面拼接,id的值是使用?进行占位。那这种SQL语句我们称为预编译SQL。
1.3.3 预编译SQL 1.3.3.1 介绍 预编译SQL有两个优势:
性能更高
更安全(防止)
性能更高:预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句时,不会再次编译。(只是输入的参数不同)
更安全(防止):将敏感字进行转义,保障SQL的安全性。
1.3.3.2 :是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行的方法。
由于没有对用户输入进行充分检查,而SQL又是拼接而成,在用户输入参数时,在参数中添加一些SQL关键字,达到改变SQL运行结果的目的,也可以完成恶意。
测试1:使用资料中提供的程序,来验证问题
第1步:进入到DOS
第2步:执行以下命令,启动程序
#启动存在的程序 java -jar sql_Injection_demo-0.0.1-SNAPSHOT.jar AI生成项目 java 运行
第3步:打开浏览器输入http://localhost:9090/login.html
发现竟然能够登录成功:
以上操作为什么能够登录成功呢?
由于没有对用户输入内容进行充分检查,而SQL又是字符串拼接方式而成,在用户输入参数时,在参数中添加一些SQL关键字,达到改变SQL运行结果的目的,从而完成恶意。
用户在页面提交数据的时候人为的添加一些特殊字符,使得sql语句的结构发生了变化,最终可以在没有用户名或者密码的情况下进行登录。
测试2:使用资料中提供的程序,来验证问题
第1步:进入到DOS
第2步:执行以下命令,启动程序:
#启动解决了的程序 java -jar sql_prepared_demo-0.0.1-SNAPSHOT.jar AI生成项目 java 运行 第3步:打开浏览器输入http://localhost:9090/login.html
发现无法登录:
以上操作SQL语句的执行:
把整个' or '1'='1作为一个完整的参数,赋值给第2个问号(' or '1'='1进行了转义,只当做字符串使用)
1.3.3.3 参数占位符 在Mybatis中提供的参数占位符有两种:${...} 、#{...}
#{...}
执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数值
使用时机:参数传递,都使用#{…}
${...}
拼接SQL。直接将参数拼接在SQL语句中,存在问题
使用时机:如果对表名、列表进行动态设置时使用
注意事项:在项目开发中,建议使用#{...},生成预编译SQL,防止全。 ———————————————— 版权声明:本文为CSDN博主「向着五星的方向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_69748833/article/details/135396255