JDBC小记——SQL注入及预编译操作对象、批处理

news2024/11/17 7:51:29

目录

SQL注入

预编译操作对象

自定义JDBC工具类

1.创建配置文件

2.配置

3.在工具类中使用配置文件

批处理

注意事项


SQL注入

SQL注入是黑客对数据库进行攻击的常用手段之一,他们拼接一些恶意的sql语句,来获取他们想要的数据。

例:

select * from user where username='1' or '1'='1' and password='1' or '1' = '1';

利用sql语言的特点,即where后面的条件为真,来恶意查询数据,即可查询到全部数据

 为了解决这个问题,我们要用到预编译操作对象,防止sql注入

预编译操作对象

PreparedStatement     用来防止SQL注入

//SQL语句中的值 全部用 ? 问号占位

String sql = "select * from user where username=? and password=?";

//获取一个预编译操作对象  PreparedStatement

PreparedStatement preparedStatement = conn.prepareStatement(sql);

//给问号赋值

preparedStatement.setString(1, uname);
preparedStatement.setString(2, pwd);

ResultSet resultSet = preparedStatement.executeQuery(); //不用传sql

其他代码都与之前一致

执行程序后,没有查询到任何数据。

就是因为我们使用了预编译操作对象——preparedStatement

他的setString()方法中对非法单引号做了转义,使得坏人不能够得逞。

我们可以打印看一下

自定义JDBC工具类

首先建一个工具包,在里面定义JBDC工具类

但是,数据库、用户名和密码总不是固定不变的,当我们需要去改变时,需要打开这个工具类来改变数据,不如我们创建一个配置文件,使用配置文件来读取数据、修改数据来的方便。

1.创建配置文件

2.配置

3.在工具类中使用配置文件

批处理

即多条sql语句一起执行,当插入大量数据时,建议使用批处理。

statement.addBatch();//添加批处理,先将数据缓存起来
statement.executeBatch();//执行批处理
statement.clearBatch();//清空缓存

如果我们向数据库中一条条插入数据,如下:

package org.xingyun.demo;

import org.xingyun.bean.Bank;
import org.xingyun.utils.JDBCUtil;

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

public class demo5 {
    public static void main(String[] args) throws SQLException {
        ArrayList<Bank> list = new ArrayList<>();
        for (int i = 0; i < 50000; i++) {
            Bank bank = new Bank(1010+i,"zhangsan"+i,1000+i);
            list.add(bank);
        }
        Connection conn = JDBCUtil.getConnection();
        String sql="insert into bank(id, username, money) values (?,?,?)";
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        long l = System.currentTimeMillis();
        for (Bank bank : list) {
            preparedStatement.setInt(1,bank.getId());
            preparedStatement.setString(2, bank.getUsername());
            preparedStatement.setInt(3, bank.getMoney());
            preparedStatement.executeUpdate();
        }
        long ll = System.currentTimeMillis();
        System.out.println(ll-l);
        JDBCUtil.close(conn,preparedStatement);

    }
}

所用时间为:30322ms

sql语句是一条一条执行,则效率会非常低。

当需要插入大量数据时,我们使用批处理,就是sql语句多条执行,则效率会非常高。如下:

package org.xingyun.demo;

import org.xingyun.bean.Bank;
import org.xingyun.utils.JDBCUtil;

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

public class demo6 {
    public static void main(String[] args) throws SQLException {
        ArrayList<Bank> list = new ArrayList<>();
        for (int i = 0; i < 5000; i++) {
            Bank bank = new Bank(1010 + i, "zhangsan" + i, 1000 + i);
            list.add(bank);
        }

        Connection conn = JDBCUtil.getConnection();
        String sql = "insert into bank(id, username, money) values (?,?,?)";
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        long l = System.currentTimeMillis();
        for (Bank bank : list) {
            preparedStatement.setInt(1, bank.getId());
            preparedStatement.setString(2, bank.getUsername());
            preparedStatement.setInt(3, bank.getMoney());
            preparedStatement.addBatch();
        }
        preparedStatement.executeBatch();
        preparedStatement.clearBatch();
        long ll = System.currentTimeMillis();
        System.out.println(ll-l);
        JDBCUtil.close(conn, preparedStatement);

    }
}

所用时间为:6196

由此可见,时间缩短为不使用批处理时的五分之一。

可见,效率很高。

注意事项

但 提交的sql不能超过max_allowed_packet的设置值 不然报错

jdbc:mysql://localhost:3306/shopxxb2b2c?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false&rewriteBatchedStatements=true

max_allowed_packet查询方法
进入mysql容器 运行

show VARIABLES like 'max_allowed_packet';
1
mysql> show VARIABLES like 'max_allowed_packet';
+--------------------+------------+
| Variable_name      | Value      |
+--------------------+------------+
| max_allowed_packet | 1073741824 |
+--------------------+------------+
1 row in set
max_allowed_packet的单位为字节:

-- 转化为Mb,就是1024Mb
mysql> select 1073741824/1024/1024;
+----------------------+
| 1073741824/1024/1024 |
+----------------------+
| 1024.00000000        |
+----------------------+
1 row in set
————————————————

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

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

相关文章

Bpmn.js流程建模结合业务整合工作流(一)

bmpn.js是什么? 先上图 初步认识bpmn.js 相关文档直接上链接 全网最详bpmn.js教材-基础篇 - 掘金bpmn.js是一个BPMN2.0渲染工具包和web建模器, 使得画流程图的功能在前端来完成. 因为公司业务的需要因而要在项目中使用到bpmn.js,但是由于bpmn.js的开发者是国外友人, 因此国…

【2023年中总结】是的,我从一家世界前百强企业毕业了,进入了一家只有20人的小企业。。。

我的2023-上 &#x1f550; 一、引言&#x1f55c; 二、新年&#x1f559; 三、措手不及&#x1f565; 四、抉择&#x1f55a; 五、适应&#x1f389;测试驱动开发&#x1f389;角色的转变&#x1f389;工作环境和生活环境的转变&#x1f389;工作态度 &#x1f566; 六、挑战&…

【裸机开发】定时器中断(EPIT)

EPIT 是周期性中断定时器&#xff0c;会定期调用指定的中断服务函数&#xff0c;其实可以看做是一种IRQ的外设中断&#xff0c;对应的中断ID是88&#xff08;5632&#xff09;或者 89&#xff08;5732&#xff09;。 目录 一、定时器计数流程 二、寄存器解析 1、EPIT1_CR 2…

骨传导耳机、运动耳机推荐:南卡OE开放式TWS耳机值得买吗?南卡OE测评

目前&#xff0c;如果说到骨传导耳机、蓝牙耳机想必大家都很熟悉&#xff0c;那你了解TWS耳机么&#xff1f; 如果说iPhone“重新定义”了智能手机&#xff0c;那么AirPods就重新定义了耳机——它“断”了耳机与手机/播放器间的连线&#xff0c;还将左右耳彼此间的连线彻底摒弃…

SimpleDateFormat显示24小时和12小时时间格式

public static void main(String[] args) throws Exception {MainTest1 mainTest1 new MainTest1();mainTest1.dateFormat();} yyyy-MM-dd HH:mm:ss格式显示的时间为:2017-06-12 18:01:06 yyyy-MM-dd hh:mm:ss格式显示的时间为:2017-06-12 06:01:06

二章:VMvare虚拟机的安装+VMvare安装winServer2008

目录 一、Vmware软件安装 二、Vmware软件注册 三、Vmware配置虚拟机-1 四、Vmware配置虚拟机-2 五、Vmware配置虚拟机-3 六、Vmware安装windows server 2008 一、Vmware软件安装 第一步 双击安装程序&#xff0c;点击下一步。 第二、三步 勾选接受许可&#xff0c;点击下一步。…

SAM【1】:Segment Anything

文章目录 前言1. Abstraction & Introduction1.1. Abstraction1.2. Introduction 2. Segment Anything Model2.1. Segment Anything Task2.1.1. Task2.1.2. Pre-training2.1.3. Zero-shot transfer 2.2. Segment Anything Model Methods2.2.1. Image Encoder2.2.2. Prompt …

python:并发编程(二十三)

前言 本文将和大家一起探讨python并发编程的实际项目&#xff1a;win图形界面应用&#xff08;篇五&#xff0c;共八篇&#xff09;&#xff0c;系列文章将会从零开始构建项目&#xff0c;并逐渐完善项目&#xff0c;最终将项目打造成适用于高并发场景的应用。 本文为python并…

微信小程序快速入门【二】

微信小程序快速入门【二】 文章目录 微信小程序快速入门【二】&#x1f468;‍&#x1f3eb;内容1&#xff1a;背景&#x1f468;‍⚖️内容2&#xff1a;项目结构&#x1f468;‍&#x1f4bb;内容3&#xff1a;项目配置文件app.json&#x1f468;‍&#x1f680;内容4&#x…

SpringBoot使用入门和案例实现

目录 1. 在pom.xml中添加依赖2. 编辑resources/application.properties3. 编写springboot的主程序4. 编写Controller程序5. IDEA本地测试6. 打包上传到服务器运行 1. 在pom.xml中添加依赖 步骤如下&#xff1a; 添加springboot的parent依赖添加springboot的starter-web依赖。…

osip开源库在windows平台上编译

背景 之前写过一篇关于sip协议栈选型的文章&#xff0c;最终采用了osip 2.3.6版本&#xff0c;文章中说明了为什么采用osip协议栈&#xff0c;以及为什么采用2.3.6版本。现在Linux上的产品已经基本满足需求了&#xff0c;接下来我们打算开发一套客户端和服务端对接&#xff0c…

电子邮件机器人和聊天机器人如何使您的客户支持受益?

当我们谈论客户支持中的人工智能时&#xff0c;通常会想到基于Web的聊天机器人。然而&#xff0c;现代人工智能的进步使电子邮件机器人成为客户支持自动化的下一个风口&#xff0c;使组织能够满足人们对于快速便捷的全渠道体验的期望。 有些人认为&#xff0c;与Facebook Mess…

“兆易创新杯”第十八届中国研究生电子设计竞赛有感

今年的电赛给我的感觉是时间真的紧张&#xff0c;可能是因为去年有疫情原因影响所以能准备的时间到七月份&#xff0c;今年不到月底就要全部出成品。我们团队一直在自研一款增强现实眼镜&#xff0c;从硬件设计到软件实现全部由我和另外两个小伙伴一起完成&#xff0c;所以就把…

matlab实现声音录制与左右声道分离

基础知识 1.MATLAB识别的常用语音信号类型&#xff1a; WAV格式 TXT格式 2.读取wav格式语音用函数&#xff1a;wavread 常用格式&#xff1a; ywavread(‘语音文件名’) [y,fs]wavread (‘语音文件名’) 用于读取语音,采样值放在向量y中,fs表示采样频率。 3.读取wav格式语音用…

动态代理与Spring Aop

动态代理 JDK 动态代理 使用JAVA反射包中的类和接口实现动态代理的功能&#xff0c;JAVA.lang.reflect包&#xff1b;主要是三个类&#xff1a; InvocationHandler,Method,Proxy; CGLIB动态代理&#xff0c;第三方工具类库&#xff0c;创建代理对象&#xff0c;cglib的原理是继…

城市内涝监测需要什么设备

近年来&#xff0c;随着城市化进程的加快&#xff0c;城市内涝问题愈发突出。强降雨、缺乏排水设施和过度的人类活动等因素&#xff0c;导致城市内涝灾害频发。内涝不仅给居民生活和财产安全带来威胁&#xff0c;还对城市基础设施和经济发展造成严重影响。 为了应对城市内涝灾…

spring中事务失效的情况(常见的5种)

1.多线程调用 从上面的例子中&#xff0c;我们可以看到事务方法add中&#xff0c;调用了事务方法doOtherThing&#xff0c;但是事务方法doOtherThing是在另外一个线程中调用的。 这样会导致两个方法不在同一个线程中&#xff0c;获取到的数据库连接不一样&#xff0c;从而是两…

centos7宝塔项目配置步骤

0、 1、 2、前面两个空格去掉勾 3、window 配置虚拟机 对应的域名

Django高级扩展之celery使用

Celery是一个简单、灵活、可靠的分布式系统&#xff0c;用于处理大量消息&#xff0c;同时为操作提供维护此类系统所需的工具。是一个专注于实时处理的任务队列&#xff0c;同时还支持任务调度。 目录 应用场景 问题 解决 celery架构图 安装 配置celery Settings.py配置…

CVE-2022-25099

文章目录 CVE-2022-25099一、漏洞介绍二、渗透步骤1、打开网站2、登录后台3、文件上传4、查看flag值 CVE-2022-25099 一、漏洞介绍 WBCE CMS v1.5.2 RCE。 WBCE CMS v1.5.2 /language/install.php 文件存在漏洞&#xff0c;攻击者可精心构造文件上传造成RCE。 二、渗透步骤 1…