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


    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语句。

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

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

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

    测试:

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

    1. ~~~java
    2. @SpringBootTest
    3. class SpringbootMybatisCrudApplicationTests {
    4. @Autowired //从Spring的IOC容器中,获取类型是EmpMapper的对象并注入
    5. private EmpMapper empMapper;
    6. @Test
    7. public void testDel(){
    8. //调用删除方法
    9. empMapper.delete(16);
    10. }
    11. }
    12. ~~~

     日志输入

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

    1. 打开application.properties文件

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

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

    开启日志之后,我们再次运行单元测试,可以看到在控制台中,输出了以下的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注入安全。

  • 相关阅读:
    这些提高摸鱼效率的自动化测试技巧,提高打工人幸福感~
    iOS 控制网络请求顺序
    iperf安装与使用
    Csgo 控制台——代码
    238-h148 排序链表
    Unity 3D 2022.1 AND UnityHub 3.2 Patch
    【pytest官方文档】解读- 如何安装和使用插件
    yaml-cpp YAML格式处理库的介绍和使用(面向业务编程-文件格式处理)
    机器学习与密码学
    Vue自定义组件学习笔记
  • 原文地址:https://blog.csdn.net/m0_74197695/article/details/137873646