JavaWeb | 预编译SQL及PreparedStatement讲解

22 篇文章 2 订阅
5 篇文章 0 订阅

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏
本专栏地址:🔥JDBC
Java入门篇: 🔥Java基础学习篇
Java进阶学习篇(持续更新中):🔑Java进阶学习篇

在这里插入图片描述

一、前言

在上文中提到了SQL注入问题,这篇文章主要是讲解处理SQL注入问题的解决方案:预编译SQL语句,而这都归功于PreparedStatement方法,所以本文也会讲解该方法及其原理

二、PreparedStatement

1.概述

表示预编译的 SQL 语句的对象。

SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。

PreparedStatement作用: 预编译SQL语句并执行:预防SQL注入问题

2.获取 PreparedStatement 对象

要注意的是这里的❓是英文问号(半角)如果使用中文中的问好(全角)的话就会报错

// SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
// 通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);

3.格式

 PreparedStatement对象:setXxx(参数1,参数2):给 ? 赋值

4.方法摘要

executeQuery:在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象

executeUpdate:在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。

调用这两个方法时不需要传递SQL语句,因为获取SQL语句执行对象时已经对SQL语句进行预编译了

在这里插入图片描述

5.实例

//2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
    String url = "jdbc:mysql:///db1?useSSL=false";
    String username = "root";
    String password = "123456";
    Connection conn = DriverManager.getConnection(url, username, password);

    // 接收用户输入 用户名和密码
    String name = "zhangsan";
    String pwd = "' or '1' = '1";

    // 定义sql
    String sql = "select * from tb_user where username = ? and password = ?";
    // 获取pstmt对象
    PreparedStatement pstmt = conn.prepareStatement(sql);
    // 设置?的值
    pstmt.setString(1,name);
    pstmt.setString(2,pwd);
    // 执行sql
    ResultSet rs = pstmt.executeQuery();
    // 判断登录是否成功
    if(rs.next()){
        System.out.println("登录成功");
    }else{
        System.out.println("登录失败");
    }
    //7. 释放资源
    rs.close();
    pstmt.close();
    conn.close();

6.原理

  • 将sql语句发送到MySQL服务器端
  • MySQL服务端会对sql语句进行如下操作
    • 检查SQL语句

    • 检查SQL语句的语法是否正确

    • 编译SQL语句。将SQL语句编译成可执行的函数

    • 检查SQL和编译SQL花费的时间比执行SQL的时间还要长。如果我们只是重新设置参数,那么检查SQL语句和编译SQL语句将不需要重复执行。这样就提高了性能。

  • 执行SQL语句
    在这里插入图片描述

三、结语

对于预编译的过程,大家可以查看一下日志文件,但是只需要掌握其原理即可,有任何问题都可以评论留言,如果想要了解详细过程的话,以后也会再写一篇文章来讲述的

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alita11101_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值