【JavaWeb】Day47.Mybatis基础操作——删除

ops/2024/10/9 13:33:25/

Mybatis基础操作

需求

  • 准备数据库表 emp

  • 创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)

  • application.properties中引入数据库连接信息 创建对应的实体类 Emp(实体类属性采用驼峰命名)

  • 准备Mapper接口 EmpMapper

@Mapper注解:表示当前接口为mybatis中的Mapper接口

程序运行时会自动创建接口的实现类对象(代理对象),并交给Spring的IOC容器管理

删除

功能实现

        实现前端页面的删除操作时,前端页面会给服务端传递一个参数,也就是该行数据的ID。 我们接收到ID后,根据ID删除数据即可。

功能:根据主键删除数据

例如:删除ID=17的数据

@Delete("delete from emp where id = 17")

 public void delete();

以上delete操作的SQL语句中的id值写成固定的17,就表示只能删除id=17的用户数据。

SQL语句中的id值不能写成固定数值,需要变为动态的数值。

解决方案:在delete方法中添加一个参数(用户id),将方法中的参数,传给SQL语句。

 @Delete("delete from emp where id = #{id}")//使用#{key}方式获取方法中的参数值public void delete(Integer id);

 @Delete注解:用于编写delete操作的SQL语句

       如果mapper接口方法形参只有一个普通类型的参数,#{…} 里面的属性名可以随便写,如:#{id}、#{value}。但是建议保持名字一致。

测试:

     在单元测试类中通过@Autowired注解注入EmpMapper类型对象

~~~java
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {@Autowired //从Spring的IOC容器中,获取类型是EmpMapper的对象并注入private EmpMapper empMapper;@Testpublic void testDel(){//调用删除方法empMapper.delete(16);}
}
~~~

 日志输入

在Mybatis当中我们可以借助日志,查看到sql语句的执行、执行传递的参数以及执行结果。具体操作如下:

1. 打开application.properties文件

2. 开启mybatis的日志,并指定输出到控制台

```properties
#指定mybatis输出日志的位置, 输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
```

开启日志之后,我们再次运行单元测试,可以看到在控制台中,输出了以下的SQL语句信息:

预编译SQL

介绍

预编译SQL有两个优势:

1. 性能更高

2. 更安全(防止SQL注入)

       性能更高:预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句时,不会再次编译。(只是输入的参数不同)

       更安全(防止SQL注入):将敏感字进行转义,保障SQL的安全性。

SQL注入(重点)

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

        由于没有对用户输入进行充分检查,而SQL又是拼接而成,在用户输入参数时,在参数中添加一些SQL关键字,达到改变SQL运行结果的目的,也可以完成恶意攻击。

测试1:使用资料中提供的程序,来验证SQL注入问题

第1步:进入到DOS

第2步:执行以下命令,启动程序

第3步:打开浏览器输入`http://localhost:9090/login.html`

发现竟然能够登录成功:

以上操作为什么能够登录成功呢?

由于没有对用户输入内容进行充分检查,而SQL又是字符串拼接方式而成,在用户输入参数时,在参数中添加一些SQL关键字,达到改变SQL运行结果的目的,从而完成恶意攻击。

       用户在页面提交数据的时候人为的添加一些特殊字符,使得sql语句的结构发生了变化,最终可以在没有用户名或者密码的情况下进行登录。

测试2:使用资料中提供的程序,来验证SQL注入问题

第1步:进入到DOS

第2步:执行以下命令,启动程序:

第3步:打开浏览器输入`http://localhost:9090/login.html`

发现无法登录:

以上操作SQL语句的执行:

        把整个`' or '1'='1`作为一个完整的参数,赋值给第2个问号(`' or '1'='1`进行了转义,只当做字符串使用)

参数占位符(重要)

在Mybatis中提供的参数占位符有两种:${...} 、#{...}

 #{...}

  - 执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数值

  - 使用时机:参数传递,都使用#{…}

 ${...}

  - 拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题

  - 使用时机:如果对表名、列表进行动态设置时使用

注意事项:在项目开发中,建议使用#{...},生成预编译SQL,防止SQL注入安全。


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

相关文章

2024 EasyRecovery三分钟帮你恢复 电脑硬盘格式化

随着数字化时代的到来,我们的生活和工作中越来越依赖于电子设备。然而,电子设备中的数据丢失问题也随之而来。数据丢失可能是由各种原因引起的,如硬盘故障、病毒感染、误删除等。面对这种情况,一个高效、可靠的数据恢复工具变得尤…

【rust简单工具理解】

1.map方法 map这个闭包的本质就是映射 let numbers vec![1, 2, 3, 4, 5]; let numbers_f64: Vec<f64> numbers.into_iter().map(|&x| x as f64).collect(); println!("{:?}", numbers_f64); // 输出: [1.0, 2.0, 3.0, 4.0, 5.0]2.and_then and_then …

一次网卡驱动BUG故障的排错历程

前言 在日常运维中&#xff0c;总会遇到一些棘手的故障或问题&#xff0c;尤其面临多系统融合的兼容性或一些融合节点可能存在未知bug等方面&#xff0c;排错难度都会增加。 本文将从一次小事件为入口进行延伸&#xff0c;将宿主机esxi基础系统的多融合节点故障的排错历程展开…

Python篇-垃圾回收机制详解

参考&#xff1a; Python垃圾回收机制详解-CSDN博客

HttpServletRequest/Response

HttpServletRequest 一些常用类的用法 package Demo;import javax.jws.WebService; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import ja…

封装个js分页插件

// 分页插件类 class PaginationPlugin {constructor(fetchDataURL, options {}) {this.fetchDataURL fetchDataURL;this.options {containerId: options.containerId || paginationContainer,dataSizeAttr: options.dataSizeAttr || toatalsize, // 修改为实际API返回的数据…

el-table使用show-summary合计,但只需要合并某一列

el-table使用show-summary合计&#xff0c;但只需要合并某一列 这里有两种方法&#xff0c;一种是网上的&#xff0c;我会引用他的链接给你们看。 一种是我自己看源码发现的 方法一 这个就是方法一的链接 点击我跳转方法一 方法二 不需要计算的列 去掉prop 然后用插槽显示即可…

Linux中文件特殊权限suid、sgid、sticky详解

Linux中文件特殊权限suid、sgid、sticky 作用对象 suid权限作用于文件属主sgid权限作用于属组sticky权限作用于other suid 作用&#xff1a;让普通用户临时拥有该文件的属主的指向权限&#xff0c;suid权限只能应用在二进制可执行文件&#xff08;命令&#xff09;表示方法…