JavaWeb | 预编译SQL及PreparedStatement讲解

news2024/11/26 13:31:01

本专栏主要是记录学习完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语句进行预编译了

在这里插入图片描述

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语句
    在这里插入图片描述

三、结语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/180984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE总结

JavaSE目录初识JavaJava由来main 方法介绍Java程序的运行数据类型和变量数据类型基本数据类型引用数据类型运算符算术运算符关系运算符逻辑运算符移位运算逻辑控制方法方法的重载与重写关于递归数组二维数组类和对象成员变量成员方法对象this 关键字构造方法封装代码块内部类非…

ext文件系统

Ext文件系统 1.文件目录 1.1 文件控制块FCB 文件系统通过文件控制块(File Control Blcok)来维护文件结构,FCB包含有关文件的信息,包括所有者、权限、文件内容的位置等文件目录用于组织文件,每个目录项对应一个FCB文…

(考研湖科大教书匠计算机网络)第三章数据链路层-第三节:差错控制

专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:检错编码(1)奇偶校验码(2)循环冗余检验码(CRC)二:纠错编码(海明校验码&#xff0…

Opencv调参神器——trackBar控件

Opencv调参神器——trackBar控件 调参需求介绍trackBar控件介绍trackBar控件使用函数案例一:trackBar控件调整图片颜色案例二:trackBar控件调整Canny算子参数案例三:trackBar控件调整图像融合参数trackBar控件总结调参需求介绍 想要学好计算机视觉,有一个库必不可少,那就…

ARM Makefile 基础

一、Makefile 的作用和意义 (1) 工程项目中 c 文件太多管理不方便,因此用 Makefile 来做项目管理,方便编译链接过程。 (2) uboot 和 linux kernel本质上都是 C 语言的项目,都由很多个文件组成,因此都需要通过 Makefile 来管理。…

nodejs小区物业管理系统vue前端

目 录 1 概述 1 1.1课题背景及意义 1 1.2 国内外研究现状 1 1.3 本课题主要工作 2 2 系统开发环境 3 前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install产生) 这文件夹就是…

STM32-Modbus-RTU-01-05-15功能码补充-波特率在线修改-断电数据保护

文章目录一、本文主要内容二、使用modbus通信协议在线修改STM32波特率(一)STM32标准库在线修改串口波特率(二)STM32HAL库-485-modbus-rtu通信在线修改串口波特率1、STM32F103ZET6芯片(1)HAL库下参考标准库形式修改波特率(2)直接修…

SNARK+深度神经网络

1. 引言 SNARK深度神经网络,相关开源实现有: 1)Ezkl(Rust):借助Halo2证明系统,实现了50层的MobileNetV2的执行证明。具体见Daniel Kang等人2022年论文Scaling up Trustless DNN Inference with…

4种I/O模型简介

目录 1、同步阻塞IO(BIO) 2、同步非阻塞IO(NIO) 3、多路复用IO 3.1、select(轮询) 3.2、poll(轮询) 3.3、epoll(事件驱动) 3.4、select、poll、epoll总结 4、异步IO模型(AIO) 网络IO涉及的两个对象:用户线程 系统内核。 当一个read发生时,会经…

Kotlin中嵌套类、数据类、枚举类和密封类的详解

博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家 👉点击跳转到教程 一、嵌套类 如果一个类只对另一个类有用,那么将其嵌入到该类中并使这两个类保持在一起是合乎逻辑的&#xf…

【Deepstream学习】TX1 跑demo

大家好,我是虎哥,使用NVIDIA Jeston TX1 也有很长一段时间了,由于这是基本停产的一个模块,其实自己也担心有很多官方的demo无法适配跑起来了,所以花了点时间,进一步研究发挥其GPU性能,使用各种硬…

STM8S207时钟管理库函数

STM8S207时钟树 //STM8S207时钟管理库函数 //CLK_DeInit();//将相关的时钟寄存器恢复到默认值 //CLK_HSECmd(ENABLE);//启用外部高速振荡器HSE //CLK_HSECmd(DISABLE);//关闭外部高速振荡器HSE //CLK_HSICmd(ENABLE);//启用内部高速振荡器HSI //CLK_HSICmd(DISABLE)//关闭内部高…

Spring Cloud Sentinel(限流、熔断、降级)、SpringBoot整合Sentinel、Sentinel的使用-60

一:Sentinel简介 Sentinel就是分布式系统的流量防卫兵 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 1.1 官方文档 官方文档&#…

哪里可以找到电子版的大学课本?

第一个:中国高校课件下载网站网址:http://download.cucdc.com/这是一个可以下载各个大学课本的网站,基本上所有的大学课本都能在这里找到PDF版本。可以按学校学科搜。 第二个:淘链客网址:https://www.toplinks.cc/s/PD…

MySQL_存储引擎

存储引擎 MySQL体系结构 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 第二层架构主要完成大多数的核心服务功能,如SQL接口&…

读书:《如何想到又做到》

全书最有用的内容是下面这张图:持久改变的SCIENCE模型。 作者为了方便读者记忆,找了7个单词,首字母拼在一起就是SCIENCE,对应着7种武器: S 阶梯(Stepladders):小而又小的迭代 C 社群…

高性能零售IT系统的建设09-Spring Boot2.4.2+Spring Cloud+Nacos+Feign+Hystrix的生产级应用实例

开篇 通过前面8篇我们已经感受到了我接手时这个项目有多“烂”,当然喽如果只是一味的承认它的烂这不是积极乐观主义。 我在接触管理早期听过一次四大厂的报告,报告中说到:从来没有屎一样的团队只有屎一样的“带队”。 这也符合我们一直接受的…

SpringMVC @RequestHeader @CookieValue 处理获取请求参数的乱码问题

SpringMVC RequestHeader CookieValue 处理获取请求参数的乱码问题RequestHeaderCookieValue什么是cookie通过POJO获取请求参数通过CharacterEncodingFilter处理获取请求参数的乱码问题get请求的乱码post请求乱码处理获取请求参数的乱码问题)RequestHeader 1.RequestHeader是将…

实时计算业务介绍实时日志分析

4.1 实时计算业务介绍 学习目标 目标 了解实时计算的业务需求知道实时计算的作用应用 无 4.1.1 实时计算业务需求 实时(在线)计算: 解决用户冷启动问题实时计算能够根据用户的点击实时反馈,快速跟踪用户的喜好 4.1.2 实时计算…

编译与优化

第10章 前端编译与优化 10.2.1 Javac的源码与调试 从Javac代码的总体结构来看,编译过程大致可以分为1个准备过程和3个处理过程,它们分别如下 所示。 1)准备过程:初始化插入式注解处理器。 2)解析与填充符号表过程&…