广告
返回顶部
首页 > 资讯 > 数据库 >【JDBC】PreparedStatement实现批量插入数据
  • 822
分享到

【JDBC】PreparedStatement实现批量插入数据

数据库javamysql 2023-09-09 09:09:29 822人浏览 独家记忆
摘要

题目:【JDBC】PreparedStatement实现批量插入数据 前言: PreparedStatement除了解决Statement的拼串、sql注入问题之外,还可以实现以下操作 Prepare

题目:【JDBC】PreparedStatement实现批量插入数据

前言:

PreparedStatement除了解决Statement的拼串、sql注入问题之外,还可以实现以下操作

  1. PreparedStatement操作Blob的数据,而Statement做不到
  2. PreparedStatement可以实现更高效的批量操作
  3. update、delete本身就具有批量操作的效果(通过过滤条件)
  4. 此时的批量操作主要指的是批量插入

目标:

(1).使用PreparedStatement实现更高效的批量插入

迭代过程:

方式一:使用Statement

(1).数据表如下

# 向Goods表中插入20000条数据CREATE TABLE goods{id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(25)};

(2).使用Statement

// (封装好的工具类)实现数据库连接Connection conn = JDBCUtils.getConnection();// 获取Statement实例Statement st = conn.createStatement();// 使用Statement执行SQL语句for(int i = 1;i <= 20000;i++){    // 拼接字符串,容易SQL注入攻击    String sql = "insert into goods(name)values('name_" + i + "')";    st.execute(sql);}

方式二:

(1).使用Statement

// 方式二:使用PreparedStatementpublic class InsertTest {@Test// idea Ctrl + Alt + t 快捷键抛出异常public void testInsert1() {Connection conn = null;PreparedStatement ps = null;try {// 测试用时long start = System.currentTimeMillis();// 连接数据库conn = JDBCUtils.getConnection();// 通过Connection实例获取PreparedStatement, 预编译SQL语句String sql = "insert into goods(name)values(?)";ps = conn.prepareStatement(sql);// 批量插入数据for(int i = 1; i <= 20000; i++){ps.setObject(1, "name_" + i);ps.execute();}// 测试用时long end = System.currentTimeMillis();// 花费事件System.out.println("花费的时间为:" + (end - start));//20000:83065} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.closeResource(conn, ps);}}}

(2).PreparedStatement 能最大可能提高性能原因:

  1. DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
  2. 在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存。这样每执行一次都要对传入的语句编译一次。
  3. (语法检查,语义检查,翻译成二进制命令,缓存)

(3).与Statement对比:

  1. 字符串拼接使得每次执行都要编译一次

方式三:

(1).攒够一定数量SQL,一次执行

@Test// 批量插入方式三:攒够一定数量,一次执行 //318mspublic void testInsert3() {Connection conn = null;PreparedStatement ps = null;try {// 测试用时long start = System.currentTimeMillis();// 连接数据库conn = JDBCUtils.getConnection();// 通过Connection实例获取PreparedStatement, 预编译SQL语句String sql = "insert into goods(name)values(?)";ps = conn.prepareStatement(sql);// 批量插入数据for(int i = 1; i <= 20000; i++){ps.setObject(1, "name_" + i);// 1.攒SQLps.addBatch();// 攒够500条if(i % 500 == 0 || i == 20000){// 2.执行batchps.executeBatch();// 3.清空batchps.clearBatch();}}// 测试用时long end = System.currentTimeMillis();// 花费事件System.out.println("花费的时间为:" + (end - start));} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.closeResource(conn, ps);}}

方式四:

(1)设置连接不允许自动提交数据

@Test// 批量插入方式四:攒够一定数量,一次执行 //297mspublic void testInsert4() {Connection conn = null;PreparedStatement ps = null;try {// 测试用时long start = System.currentTimeMillis();// 连接数据库conn = JDBCUtils.getConnection();// 设置不允许自动提交数据conn.setAutoCommit(false);// 通过Connection实例获取PreparedStatement, 预编译SQL语句String sql = "insert into goods(name)values(?)";ps = conn.prepareStatement(sql);// 批量插入数据for(int i = 1; i <= 20000; i++){ps.setObject(1, "name_" + i);// 1.攒SQLps.addBatch();// 攒够500条if(i % 500 == 0 || i == 20000){// 2.执行batchps.executeBatch();// 3.清空batchps.clearBatch();}}// 同一提交数据conn.commit();// 测试用时long end = System.currentTimeMillis();// 花费事件System.out.println("花费的时间为:" + (end - start));//1583ms} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.closeResource(conn, ps);}}

使用小结:

(1).JDBC程序编写步骤

image-20221020124949833

(2).【面试】PreparedStatement 和 Statement 区别

  • PreparedStatement 是Statement 的子接口

  • 代码的可读性和可维护性

  • PreparedStatement 能最大可能提高性能:

    • DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
    • 在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存。这样每执行一次都要对传入的语句编译一次。
    • (语法检查,语义检查,翻译成二进制命令,缓存)
  • PreparedStatement 可以防止 SQL 注入

来源地址:https://blog.csdn.net/wbumingbai/article/details/127424976

您可能感兴趣的文档:

--结束END--

本文标题: 【JDBC】PreparedStatement实现批量插入数据

本文链接: https://www.lsjlt.com/news/401248.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【JDBC】PreparedStatement实现批量插入数据
    题目:【JDBC】PreparedStatement实现批量插入数据 前言: PreparedStatement除了解决Statement的拼串、sql注入问题之外,还可以实现以下操作 Prepare...
    99+
    2023-09-09
    数据库 java mysql
  • jdbc使用PreparedStatement批量插入数据的方法
    目录批量插入1. 批量执行SQL语句2. 高效的批量插入批量插入 1. 批量执行SQL语句 当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次...
    99+
    2022-11-12
  • Java如何实现JDBC批量插入
    本篇内容主要讲解“Java如何实现JDBC批量插入”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java如何实现JDBC批量插入”吧!一、说明在JDBC中,executeBatch这个方法可以将...
    99+
    2023-07-05
  • java实现批量插入数据
    日常工作或者学习中,可能会遇到批量插入数据的需求,一般情况下数据量少的时候,我们会直接调用批量接口插入数据即可,当数据量特别大时,可能由于数据库限制,插入的数据最多不能超过100条(假如限制100条)...
    99+
    2023-09-03
    java 数据库 oracle
  • Java实现JDBC批量插入原理详解
    目录一、说明二、实验介绍三、正式实验首先测试mysql接下来测试oracle四、存储过程五、总结一、说明 在JDBC中,executeBatch这个方法可以将多条dml语句批量执行,...
    99+
    2023-03-11
    Java JDBC实现批量插入 Java JDBC批量插入 Java JDBC插入
  • MyBatis如何实现批量插入数据
    本文小编为大家详细介绍“MyBatis如何实现批量插入数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“MyBatis如何实现批量插入数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、SQL实现示例假设我们...
    99+
    2023-07-04
  • Elasticsearch批量插入数据
    Elasticsearch批量插入数据 使用bulk批量操作数据库 1. 创建批量操作文件 格式: {"index":{"_index":"home","_type":"home",""_id":"2"}}...
    99+
    2022-10-18
  • SQL批量插入数据
    MS SQL Server数据库批量插入数据的sql语句总结:第一种:insert into tb_NameList(Name,InsertDate,UpdateDate)values('aa',GETDA...
    99+
    2022-10-18
  • java 批量插入数据
    批量插入数据,常见的使用mybatis foreach 插入的方式,原始的方式和批处理 1,常见的mybatis foreach xml insert into CODEINFO (CODE_TYPE, CODE, MEAN, STAT...
    99+
    2023-09-03
    mybatis mysql 批量插入
  • 使用saveOrUpdateBatch实现批量插入更新数据
    saveOrUpdateBatch 是 Hibernate 中的一个方法,可以用来批量插入或更新数据。这个方法的参数是一个 List,里面可以存储多个实体对象。当 Hibernate 执行这个方法时,会检查每个实体对象是否存在主键,如果存在...
    99+
    2023-08-31
    hibernate spring java 后端
  • 如何利用MySqlBulkLoader实现批量插入数据
    这篇文章主要介绍“如何利用MySqlBulkLoader实现批量插入数据”,在日常操作中,相信很多人在如何利用MySqlBulkLoader实现批量插入数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何利...
    99+
    2023-07-02
  • Java实现百万级数据量向MySQL批量插入
    业务背景: 大数据向mysql表同步百万级数量,我们需要将大数据表里同步过来的数据分别向三张业务表做数据同步,最终将业务表的数据展示给前台进行相关业务操作。 数据量级 大数据表:700w数据量 三张业务表分别需要同步:23w、80w、680...
    99+
    2023-08-25
    mysql java mybatis
  • C# MySQL 插入大批量数据
    一、定义DataTable的数据类型 private DataTable GetDataTableFromExternalSource(string tablename) { DataTable dat...
    99+
    2023-09-08
    mysql c# 数据库
  • python批量插入数据到mysql
    使用python批量插入数据到mysql的三种方法 自动化单条insert # -*- coding:utf-8 -*-import timefrom pymysql import *# 装饰器,计算插入50000条数据需要的时间def t...
    99+
    2023-09-06
    mysql 数据库 sql
  • MyBatis实现批量插入数据,多重forEach循环
    目录批量插入数据,多重forEach循环下面是一个实际应用mybatis insert foreach项目场景批量插入数据,多重forEach循环 在业务开发过程中,遇到批量插入时,...
    99+
    2022-11-13
  • springboot 注解方式批量插入数据的实现
    目录一.使用场景二.实现方法1.mysql表结构2.domain3.mapper4.测试类5.测试结果三.插入效率对比1.批量插入2.一条一条插入一.使用场景 一次请求需要往数据库插...
    99+
    2022-11-13
  • gorm 执行原生sql实现批量插入数据
    可以使用 GORM 的 DB 对象来执行原生 SQL 操作,然后结合 SQL 的 INSERT INTO 语句来实现批量插入数据。 以下是一个示例代码,假设我们有一个 users 表,包含 id、na...
    99+
    2023-09-20
    sql 数据库 mysql golang
  • SpringBootMybatis批量插入Oracle数据库数据
    目录前端数据数据表结构后端Controller:mapperxml前端数据 有如下需求,前端提交一个对象cabinData,保存到数据表中,对象结构如下:  {      "ship...
    99+
    2022-11-13
  • MyBatis如何批量插入大量数据
    这篇文章将为大家详细讲解有关MyBatis如何批量插入大量数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题背景:只用MyBatis中foreach进行批量插入数据,一次性插入超过一千条的时候MyBa...
    99+
    2023-06-22
  • 大批量数据分批批量插入或更新(Mybatis+MySQL)
    大批量数据分批批量插入或更新 在MySQL数据库的前提下,插入或更新大批量数据。首先批量插入需要考虑到以下几个因素: 数据库一次可以承受多大或者多少条数据的插入批量插入是否会占用Mysql资源太久,影响系统整体使用性能代码中的集合是否会造成...
    99+
    2023-08-30
    mybatis mysql 数据库 java spring boot
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作