【WEEK7】 【DAY5】JDBC—PreparedStatement Object【English Version】

2024.4.12 Friday
Following 【WEEK7】 【DAY4】JDBC—Statement Object【English Version】

Contents

  • 10.3.PreparedStatement Object
    • 10.3.1.PreparedStatement can prevent SQL injection, more efficient than statement
    • 10.3.2. Insertion
    • 10.3.3. Deletion
    • 10.3.4. Update
    • 10.3.5. Query
    • 10.3.6. Preventing SQL Injection
      • 10.3.6.1. Under normal circumstances
      • 10.3.6.2. Result
      • 10.3.6.3. SQL Injection Failed
      • 10.3.6.4. Result
  • 10.4. Using IDEA to Connect to the Database
    • 10.4.1. As shown below

10.3.PreparedStatement Object

10.3.1.PreparedStatement can prevent SQL injection, more efficient than statement

10.3.2. Insertion

package lesson.three;

import lesson.two.utils.JdbcUtils;

import java.sql.*;

public class TestInsert {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;

        try {
            conn = JdbcUtils.getConnection();
            //Difference from a regular statement: uses question marks as placeholders
            String sql = "INSERT INTO users(id,`NAME`,`PASSWORD`,`email`,`birthday`) VALUES (?,?,?,?,?)";

            st = conn.prepareStatement(sql);   //Pre-compile SQL: generate SQL but do not execute

            //Manually assign values to parameters
            //The syntax of set... corresponds to each position of the input function parameters and the parameters you wish to set
            st.setInt(1,4); //id
            st.setString(2,"lqf");
            st.setString(3,"987654");
            st.setString(4,"27046873@qq.com");
            st.setDate(5,new java.sql.Date(new java.util.Date().getTime()));
            //new Date().getTime() means: the time calculated by the computer needs to be converted to MySQL time
            //sql.Date is database time, util.Date is Java's
            //Because the source code of setDate has the time parameter as the database type: void setDate(int parameterIndex, java.sql.Date x)
            //So, we need to use new Date().getTime() to get the timestamp (in this version, using “new java.util.Date().getTime()” does not cause an error)

            //Execute
            int i = st.executeUpdate();
            if(i > 0){
                System.out.println("Insertion successful");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn,st,null);
        }
    }
}
  • Result
    Insert picture description here
    Insert picture description here

10.3.3. Deletion

package lesson.three;

import lesson.two.utils.JdbcUtils;

import java.sql.*;

public class TestDelete {
    public static void main (String[] args) {
        Connection conn = null;
        PreparedStatement st = null;

        try {
            conn = JdbcUtils.getConnection();
            //Difference from a regular statement: uses question marks as placeholders
            String sql = "DELETE FROM users WHERE id = ?";

            st = conn.prepareStatement(sql);   //Pre-compile SQL: generate SQL but do not execute

            //Manually assign values to parameters
            st.setInt(1,4); //id
            //Execute
            int i = st.executeUpdate();
            if(i > 0){
                System.out.println("Deletion successful");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn,st,null);
        }
    }
}
  • Result
    Insert picture description here
    Insert picture description here
    *After completing the code, if there’s no option to run: generally means the system didn’t detect the main function -> The most basic error is a spelling mistake in the main function, check this first before searching online for other possibilities.

10.3.4. Update

package lesson.three;

import lesson.two.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestUpdate {
    public static to main(String[] args){

        Connection conn = null;
        PreparedStatement st = null;

        try {
            conn = JdbcUtils.getConnection();
            //Difference from a regular statement: uses question marks as placeholders
            String sql = "UPDATE users SET `NAME` = ? WHERE id = ?";

            st = conn.prepareStatement(sql);   //Pre-compile SQL: generate SQL but do not execute

            //Manually assign values to parameters
            st.setString(1,"阿布巴卡");
            st.setInt(2,1); //id

            //Execute
            int i = st.executeUpdate();
            if(i > 0){
                System.out.println("Update successful");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn,st,null);
        }
    }
}
  • Result
    Insert picture description here
    Insert picture description here
    Here’s the translation:

10.3.5. Query

package lesson.three;

import lesson.two.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TestSelect {
    public static void main(String[] args){

        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();
            //Write SQL
            String sql = "SELECT * FROM users WHERE id = ?";

            st = conn.prepareStatement(sql);   //Pre-compile SQL: generate SQL but do not execute

            //Pass parameters
            st.setInt(1,1); //id

            //Execute
            rs = st.executeQuery();
            if(rs.next()){
                System.out.println(rs.getString("NAME"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}
  • Result
    Insert picture description here

10.3.6. Preventing SQL Injection

10.3.6.1. Under normal circumstances

package lesson.three;

import lesson.two.utils.JdbcUtils;

import java.sql.*;

public class prevent_SQL_injection {
    public static void main(String[] args){
        login("Abubakar","123456"); //Under normal circumstances
//        login("''or '1=1 ","'or '1=1 "); //sql injection
    }

    //Login service
    public static void login(String username, String password){
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        try {
            conn = JdbcUtils.getConnection();

            //SQL
            String sql = "SELECT * FROM users WHERE `NAME`=? AND `PASSWORD`=?";

            st = conn.prepareStatement(sql);
            st.setString(1,username);
            st.setString(2,password);

            //The result set returned after the query is saved in rs
            rs = st.executeQuery(); //The sql in the brackets should be deleted, otherwise it throws an error, but the reason is unknown
            //Print
            while (rs.next()) {
                System.out.println(rs.getString("NAME"));
                System.out.println(rs.getString("email"));
                System.out.println(rs.getString("password"));
                System.out.println("===========================");
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}

10.3.6.2. Result

Insert picture description here

10.3.6.3. SQL Injection Failed

Only modify the login statement

login("''or '1=1 ","'or '1=1 "); //sql injection

10.3.6.4. Result

(No results found)
Insert picture description here

10.4. Using IDEA to Connect to the Database

10.4.1. As shown below

Insert picture description here
Insert picture description here
Insert picture description here
In theory, it’s fine as long as it’s successful, but in practice, it’s almost never needed.
Create a table under the p37jdbc database and insert data through IDEA:

-- P44
-- Create user table
CREATE TABLE account(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(40),
    money FLOAT
);
-- Insert test data
INSERT INTO account(`NAME`, money) VALUES ('A', 1000);
INSERT INTO account(`NAME`, money) VALUES ('B', 1000);
INSERT INTO account(`NAME`, money) VALUES ('C', 1000);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows版PHP7.4.9解压直用(免安装-绿色-项目打包直接使用)

安装版和解压版 区别 安装版: 安装方便,下一步------下一步就OK了,但重装系统更换环境又要重新来一遍,会特别麻烦解压版(推荐): 这种方式(项目打包特别方便)能更深了解mysql的配置&…

C 408—《数据结构》易错考点200题(含解析)

目录 Δ前言 一、绪论 1.1 数据结构的基本概念 : 1.2 算法和算法评价 : 二、线性表 2.2 线性表的顺序表示 : 2.3 线性表的链式表示 : 三、栈、队列和数组 3.1 栈 3.2 队列 3.3 栈和队列的应用 3.4 数组和特殊矩阵 四、串 4.2 串的模式匹配 五、树与二叉树 5.1 树的基…

StarUML笔记之从UML图生成C++代码

StarUML笔记之从UML图生成C代码 —— 2024-04-14 文章目录 StarUML笔记之从UML图生成C代码1.Add Diagram2.在TOOLBOX中左键点击Class,松开,然后在中间画面再左键点击,即可出现UML3.修改类图,并添加接口,方法,属性,我…

超干!如何编写完美的Python命令行程序?

这篇文章将教你如何编写完美的 Python 命令行程序,提高团队的生产力,让大家的工作更舒适。 作为 Python 开发者,我们经常要编写命令行程序。比如在我的数据科学项目中,我要从命令行运行脚本来训练模型,以及计算算法的…

分享免费财务软件,比花钱买的还好用!

领取方式: 复制该链接在浏览器打开:网页链接扫码登陆。进入系统,创建账套即可直接使用,如图所示: 功能: 功能1、智能会计凭证:可以自动匹配科目、自动填充相应信息、检测到异常情况&#xff…

世界各国柴油价格22.7统计

数据详情介绍: 统计时间为2022年7月4日。在该月份,全球柴油的平均价格为每升1.43美元。然而,各国间存在明显的价格差异。一般而言,西欧等发达国家的价格基本在每升2美元以上;相反,像伊朗、委内瑞拉、利比亚…

设计模式代码实战-外观模式

1、问题描述 小明家的电源总开关控制了家里的三个设备:空调、台灯和电视机。每个设备都有独立的开关密码,分别用数字1、2和3表示。即输入1时,空调关闭,输入2时,台灯关闭,输入3时,电视机关闭&am…

聊聊jvm中内存模型的坑

jvm线程的内存模型 看图,简单来说线程中操作的变量是副本。在并发情况下,如果数据发生变更,副本的数据就变为脏数据。这个时候就会有并发问题。 参考:https://www.cnblogs.com/yeyang/p/12580682.html 怎么解决并发问题 解决的…

B端系统:控制台图表的十大常见类型,附精美案例

大家伙,我是大千UI工场,专注UI分享和项目接单,本期带来控制台图表的常见类型,欢迎大家关注、互动交流。 B端系统控制台的图表类型有很多种,常见的包括: 折线图:用于显示随时间变化的数据趋势&a…

CSS基础之伪类选择器(如果想知道CSS的伪类选择器知识点,那么只看这一篇就足够了!)

前言:学习CSS就必须要学习选择器,在之前我们已经学习了基本选择器和复合选择器,但是还有几个选择器没有学习,这篇文章主要讲解伪类选择器。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-…

01 | 源码编译(Redis6.2.6源码CLion编译调试)

01 | 源码编译(Redis6.2.6源码CLion编译调试) C语言的运行和构建工具介绍Windows平台安装cygwin安装CLion并设置编译运行环境导入redis源码配置CMakeLists.txtredis根目录下配置CMakeLists.txt,文件内容如下: 构建redis源码报错问…

大数据信用报告中有高风险多久能清除?

很多人可能会听说过大数据信用,因为现在大数据信用已经是很多放贷机构进行风控审核的重要依据,那大数据信用报告中有高风险多久能清除呢?本文就详细为你介绍一下,希望对你了解大数据信用高风险有帮助。 大数据信用为什么会有高风险 大数据信…

面试官:实战中用过CountDownLatch吗?详细说一说,我:啊这...

写在开头 在很多的面经中都看到过提问 CountDownLatch 的问题,正好我们最近也在梳理学习AQS(抽象队列同步器),而CountDownLatch又是其中典型的代表,我们今天就继续来学一下这个同步工具类! CountDownLatc…

蓝桥杯基础18——第13届省赛真题与代码详解

目录 0.心得体会 1.题目如下 2.代码实现的思路 键值扫描 数码管窗口切换 数码管的动态扫描 继电器工作时L3闪烁,整点时刻L1灯光亮5秒 3.变量列表 定义的常量和数组 功能控制和状态变量 定时器和计数变量 4.代码参考 4.1 头文件 onewire.h ds1302.h 4…

funasr 麦克风实时流语音识别;模拟vad检测单独输出完整每句话

参考: https://github.com/alibaba-damo-academy/FunASR chunk_size 是用于流式传输延迟的配置。[0,10,5] 表示实时显示的粒度为 1060=600 毫秒,并且预测的向前信息为 560=300 毫秒。每个推理输入为 600 毫秒(采样点为 16000*0.6=960),输出为相应的文本。对于最后一个语音…

IntelliJ IDEA 2024 for Mac/Win:引领Java开发新纪元的高效集成环境

在日新月异的软件开发领域,一款高效、智能的集成开发环境(IDE)无疑是程序员们不可或缺的神兵利器。今天,我要为大家介绍的,正是这样一款集大成之作——IntelliJ IDEA 2024。无论是Mac用户还是Windows用户,只…

react query 学习笔记

文章目录 react query 学习笔记查询客户端 QueryClient获取查询客户端 useQueryClient异步重新请求数据 queryClient.fetchQuery /使查询失效 queryClient.invalidateQueries 与 重新请求数据queryClient.refetchQueries 查询 QueriesuseQuery查询配置对象查询的键值 Query Key…

LLM生成模型在生物基因DNA应用:HyenaDNA

参考: https://github.com/HazyResearch/hyena-dna 整体框架基本就是GPT模型架构 不一样的就是𝖧𝗒𝖾𝗇𝖺𝖣𝖭𝖠 block ,主要是GPT的多重自注意力层引入了cnn…

深度学习图像处理基础工具——opencv 实战信用卡数字识别

任务 信用卡数字识别 穿插之前学的知识点 形态学操作 模板匹配 等 总体流程与方法 1.有一个模板 2 用轮廓检测把模板中数字拿出来 外接矩形(模板和输入图像的大小要一致 )3 一系列预处理操作 问题的解决思路 1.分析准备:准备模板&#…

微信小程序兼容iphone适配安全区域

背景&#xff1a; 小程序页面底部在ios中会有小黑条遮挡 上代码&#xff1a; padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */ padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS > 11.2 */ 项目描述&#xff1a; 微信小程序是通过…