Java高级Day47-Statement

news2024/9/21 7:05:04

124.Statement

Statement基本介绍:

  1. Statement对象用于执行静态SQL语句并返回其生成的结果的对象

  2. 在连接建立后,需要对数据库进行访问,执行命名或是SQL语句,可以通过Statement【存在SQL注入】,PreparedStatement【预处理】,CallableStatement【存储过程】

  3. Statement对象执行SQL语句,存在SQL注入风险

  4. SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库

  5. 要防范SQL注入,只要用PreparedStatement(从Statement扩展而来)取代Statement就可以了

举例子:

--查找某个管理是否存在
​
SELECT * 
         FROM admin
         WHERE NAME = 'tom' AND pwd = '123'
         
--SQL注入
--用户名为 1' OR
--密码为 or '1'='1
SELECT *
         FROM admin
         WHERE NAME = '1' OR ' AND pwd = 'OR '1' = '1'
         //这样就被注入了,无论怎么查询都可以查到人

用代码在IDEA测试

public class TestJava {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner scanner = new Scanner(System.in);
​
        //让用户输入账号和密码
        System.out.print("请输入管理员的名字");//next:接收 空格 或 单引号 表示结束,nextLine回车才是结束
        String admin_name = scanner.nextLine();//如果希望看见注入效果,要用nextLine
        System.out.print("请输入管理员的密码");
        String admin_pwd = scanner.nextLine();
​
        //通过Properties对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
​
        //1.注册驱动
        Class.forName(driver);
        //2.得到连接
        Connection connection = (Connection) DriverManager.getConnection(url, user, password);
        //3.得到Statement
        Statement statement = connection.createStatement();
        //4.组织sql
        String sql = "select name , pwd from admin where name='"
                + admin_name + "' and pwd = '"+admin_pwd +"'";
        ResultSet resultSet = statement.executeQuery(sql);
        if (resultSet.next()){//如果查询到一条记录,则说明该用户存在
            System.out.println("恭喜:登陆成功");
        } else {
            System.out.println("对不起:登陆失败");
        }
        //关闭连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}

125.PreparedStatement

基本介绍

  1. PreparedStatement执行的SQL语句中的参数用问号(?)来表示,调用PreparedStatement对象的setXxx()方法来设置这些参数,setXxx()方法有两个参数,第一个参数是要设置的SQL语句中的参数的索引(从1开始),第二个是设置的SQL语句中的参数的值

  2. 调用executeQuery():返回ResultSet对象

  3. 调用executeUpdate():执行更新,包括增删改修

预处理好处:

  1. 不再使用 + 拼接sql语句,减少语法错误

  2. 有效的解决了sql注入问题

  3. 大大减少了编译次数,效率较高

public class TestJava {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner scanner = new Scanner(System.in);
​
        //让用户输入账号和密码
        System.out.print("请输入管理员的名字");//next:接收 空格 或 单引号 表示结束,nextLine回车才是结束
        String admin_name = scanner.nextLine();//如果希望看见注入效果,要用nextLine
        System.out.print("请输入管理员的密码");
        String admin_pwd = scanner.nextLine();
​
        //通过Properties对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
​
        //1.注册驱动
        Class.forName(driver);
        //2.得到连接
        Connection connection = (Connection) DriverManager.getConnection(url, user, password);
        //3.得到PreparedStatement
        //3.1 组织sql,sql语句的问号相当于占位符
        String sql = "select name , pwd from admin where name= ? and pwd = ?";
        //3.2 preparedStatement 对象实现了 PreparedStatement 接口的实现类的对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //3.3 给问号赋值
        preparedStatement.setString(1,admin_name);
        preparedStatement.setString(2,admin_pwd);
        //4. 执行select语句,用 executrQuery
        //   如果执行的是 dml(update,inset,delete) executeUpdate()
        //   执行 executeQuery,不要在写 sql
        ResultSet resultSet = preparedStatement.executeQuery();
        if (resultSet.next()){//如果查询到一条记录,则说明该用户存在
            System.out.println("恭喜:登陆成功");
        } else {
            System.out.println("对不起:登陆失败");
        }
        //关闭连接
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}

126.预处理DML

public class TestJava {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner scanner = new Scanner(System.in);
​
        //让用户输入账号和密码
        System.out.print("请输入管理员的名字");//next:接收 空格 或 单引号 表示结束,nextLine回车才是结束
        String admin_name = scanner.nextLine();//如果希望看见注入效果,要用nextLine
        System.out.print("请输入管理员的密码");
        String admin_pwd = scanner.nextLine();
​
        //通过Properties对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
​
        //1.注册驱动
        Class.forName(driver);
        //2.得到连接
        Connection connection = (Connection) DriverManager.getConnection(url, user, password);
        //3.得到PreparedStatement
        //3.1 组织sql,sql语句的问号相当于占位符
        //添加记录
        //String sql = "insert into admin values(?,?)";
        //修改记录
        //String sql = "update admin set pwd = ? where name = ?";
        //删除记录
        //String sql = "delete from admin where name = ?";
        //3.2 preparedStatement 对象实现了 PreparedStatement 接口的实现类的对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //3.3 给问号赋值
        preparedStatement.setString(1,admin_name);
        preparedStatement.setString(2,admin_pwd);
        //4. 执行dml语句,用 executrUpdate
        int rows = preparedStatement.executeUpdate();
        System.out.println(rows > 0 ? "执行成功" : "执行失败");
​
        //关闭连接
        preparedStatement.close();
        connection.close();
    }
}

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

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

相关文章

如何写一个自动化Linux脚本去进行等保测试--引言

#我的师兄喜欢给我的休闲实习生活加活,说是让我在实习期间写一个自动化脚本去进行等保测试。呵呵哒。 怎么办呢,师兄的指令得完成,师兄说让我使用Python完成任务。 设想如下: 1、将Linux指令嵌入到python脚本中 2、调试跑通 …

C++11——function与bind

包装器 function包装器function的介绍function的使用function的使用场景function的意义 bind包装器bind的介绍bind的使用 function包装器 function的介绍 function是用来包装函数的,所以叫做包装器或者适配器,fuction的本质其实是一个类模板。 functio…

Mac使用gradle编译springboot-2.7.x源码

1 开发环境: JDK8 ideaIU-2024.2.2 gradle-7.6.3 代理网络 2 下载springboot源码 代码仓库网址 git clone -b 2.7.x https://github.com/spring-projects/spring-boot.git3 安装gradle gradle下载网址 https://services.gradle.org/distributions/ 安装此文件指…

Three.js 3D人物漫游项目(上)

本文目录 前言1、项目构建1.1 安装依赖1.2 初始化1.3 项目结构1.4 初始化的项目运行 2、加载模型2.1 threejs三要素2.1.1 代码解读 2.2 加载模型2.2.1 代码解读 2.3 效果 前言 在数字技术的浪潮中,三维图形渲染技术以其独特的魅力,正逐步渗透到我们生活的…

基于无人机影像的可见光单木分割数据集-json格式

基于无人机影像的可见光单木分割数据集,共1700张影像,数据集大小3.6GB,分割标注采用标准json格式。 该数据集是一个专门用于基于无人机可见光影像进行单木分割的数据集,旨在帮助研究人员和开发者训练和评估基于深度学习的图像分割…

4.5 pandas 实战 分析抖音播放数据(1)

课程目标 基于pandas对抖音播放数据做数据分析 数据准备 点此去下载 课程内容 导包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns plt.rcParams["font.family"] "SimHei" plt.rcParams["ax…

道路坑洞分割数据集/道路裂纹分割数据集

1.道路坑洞,道路裂纹分割数据集,包含5790张坑洞分割图像数据(默认分割标注png图片,850MB)2.10000余张道路裂纹图像数据(默认分割标注png图片,3.7GB)3。道路坑洞,道路 道路坑洞与裂纹…

关于“华为杯”第二十一届中国研究生数学建模竞赛赛题下载及提交作品的重要提醒

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 各参赛队伍: “华为杯”第二十一届中国研究生数学建模竞赛即将于2024年…

零基础玩转实在Agent -- 基础篇|实在Agent研究

前言 实在Agent是什么 实在Agent(智能体)是实在智能基于RPA和自研屏幕语义理解技术,结合最前沿的Al大模型打造的自动化智能体产品。 它能像朋友一样聊天,并通过对话的方式理解你的任务需求,自动规划任务的实现方式&…

Qt clicked()、clicked(bool)、toggled(bool)信号的区别和联系

clicked() 信号 所属控件:clicked()信号是QAbstractButton类(及其子类,如QPushButton、QRadioButton、QCheckBox等)的一个信号。clicked信号可以说是许多控件(特别是按钮类控件,如QPushButton)…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0920)

十三、文章分类页面 - [element-plus 表格] Git仓库:https://gitee.com/msyycn/vue3-hei-ma.git 基本架子 - PageContainer 功能需求说明: 基本架子-PageContainer封装文章分类渲染 & loading处理文章分类添加编辑[element-plus弹层]文章分类删除…

Vue3DevTools7是如何在vscode定位指定文件位置的?

Vue3DevTools7是如何在vscode定位指定文件位置的? 背景 今天在使用vue脚手架创建项目的时候,并发现一个新的(实验中的新功能),可以直接在我们的项目中集成Vue DevTools插件,浏览器插件devtools即将成为历史…

第十三周:机器学习笔记

第十三周周报 摘要Abstract一、机器学习——Transformer(上)1. Sequence to Sequence(Seq 2 Seq,序列到序列模型) 的应用2. Transformer的结构2.1 Transformer encoder(Transformer 编码器) 二、Pytorch学习1. 网络模型…

python爬虫初体验(一)

文章目录 1. 什么是爬虫?2. 为什么选择 Python?3. 爬虫小案例3.1 安装python3.2 安装依赖3.3 requests请求设置3.4 完整代码 4. 总结 1. 什么是爬虫? 爬虫(Web Scraping)是一种从网站自动提取数据的技术。简单来说&am…

BandiView 7.03 看图软件

BandiView 加入了大量现代化功能特性,比如支持 HDR 照片高动态范围效果、支持 HEIC / RAW / 漫画模式、免解压直接看图、查看 AI 图片提示词等 BandiView 是一款非常值得推荐的电脑全能看图浏览工具软件,软件的兼容性非常强,可以一站式满足用…

java通过org.eclipse.milo实现OPCUA客户端进行连接和订阅

前言 之前写过一篇关于MQTT的方式进行物理访问的文章:SpringBoot集成MQTT,WebSocket返回前端信息_springboot mqtt websocket-CSDN博客 最近又接触到OPCUA协议,想通过java试试看能不能实现。 软件 在使用java实现之前,想着有没…

欠款管理代码———未来之窗行业应用跨平台架构

一、欠款管理代码 function fun_会员_还款操作(会员卡信息id,MainID){var 未来之窗vos对话框_内容 ";var title"test";var 未来之窗vos对话框_id"hjksgfjkkhkj_child";CyberWin_Dialog.layer(未来之窗vos对话框_内容,{type:"url",title:&…

windows下,用docker部署xinference,为什么老是提示localhost无法访问?

部署xinference有两种方式: 一、本地部署 (略) 二、使用Docker部署(与运行) 其中又包括: 1)使用CPU的方式:(略) 1)使用GPU的方式&#xff1…

LeetCode_sql_day30(1264.页面推荐)

描述 1264.页面推荐 朋友关系列表: Friendship ------------------------ | Column Name | Type | ------------------------ | user1_id | int | | user2_id | int | ------------------------ (user1_id, user2_id) 是这张表具有唯一值的…