JavaWeb | 预编译SQL及PreparedStatement讲解

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

在这里插入图片描述

文章目录

  • 一、前言
  • 二、PreparedStatement
    • 1.概述
    • 2.获取 PreparedStatement 对象
    • 3.格式
    • 4.方法摘要
    • 5.实例
    • 6.原理
  • 三、结语

一、前言

在上文中提到了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语句进行预编译了

JavaWeb | 预编译SQL及PreparedStatement讲解_第1张图片

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语句
    JavaWeb | 预编译SQL及PreparedStatement讲解_第2张图片

三、结语

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

你可能感兴趣的:(JavaWeb,#,JDBC,数据库,sql,java,数据库)