jdbc使用PreparedStatement批量插入数据的方法


Posted in MySQL onApril 27, 2021

批量插入

1. 批量执行SQL语句

当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率

JDBC的批量处理语句包括下面三个方法:

  • addBatch(String):添加需要批量处理的SQL语句或是参数;
  • executeBatch():执行批量处理语句;
  • clearBatch():清空缓存的数据

通常我们会遇到两种批量执行SQL语句的情况:

  • 多条SQL语句的批量处理;
  • 一个SQL语句的批量传参;

2. 高效的批量插入

举例:向数据表中插入20000条数据

数据库中提供一个goods表。创建如下:

CREATE TABLE goods(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);

实现层次一:使用Statement

Connection conn = JDBCUtils.getConnection();
Statement st = conn.createStatement();
for(int i = 1;i <= 20000;i++){
 String sql = "insert into goods(name) values('name_' + "+ i +")";
 st.executeUpdate(sql);
}

实现层次二:使用PreparedStatement

long start = System.currentTimeMillis();
  
Connection conn = JDBCUtils.getConnection();
  
String sql = "insert into goods(name)values(?)";
PreparedStatement ps = conn.prepareStatement(sql);
for(int i = 1;i <= 20000;i++){
 ps.setString(1, "name_" + i);
 ps.executeUpdate();
}
  
long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end - start));//82340
JDBCUtils.closeResource(conn, ps);

实现层次三

/*
 * 修改1: 使用 addBatch() / executeBatch() / clearBatch()
 * 修改2:mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持。
 *    ?rewriteBatchedStatements=true 写在配置文件的url后面
 * 修改3:使用更新的mysql 驱动:mysql-connector-java-5.1.37-bin.jar
 * 
 */
@Test
public void testInsert1() throws Exception{
 long start = System.currentTimeMillis();
  
 Connection conn = JDBCUtils.getConnection();
  
 String sql = "insert into goods(name)values(?)";
 PreparedStatement ps = conn.prepareStatement(sql);
  
 for(int i = 1;i <= 1000000;i++){
  ps.setString(1, "name_" + i);
   
  //1.“攒”sql
  ps.addBatch();
  if(i % 500 == 0){
   //2.执行
   ps.executeBatch();
   //3.清空
   ps.clearBatch();
  }
 }
  
 long end = System.currentTimeMillis();
 System.out.println("花费的时间为:" + (end - start));//20000条:625                                                                         //1000000条:14733  
  
 JDBCUtils.closeResource(conn, ps);
}

实现层次四

/*
* 层次四:在层次三的基础上操作
* 使用Connection 的 setAutoCommit(false)  /  commit()
*/
@Test
public void testInsert2() throws Exception{
 long start = System.currentTimeMillis();
  
 Connection conn = JDBCUtils.getConnection();
  
 //1.设置为不自动提交数据
 conn.setAutoCommit(false);
  
 String sql = "insert into goods(name)values(?)";
 PreparedStatement ps = conn.prepareStatement(sql);
  
 for(int i = 1;i <= 1000000;i++){
  ps.setString(1, "name_" + i);
   
  //1.“攒”sql
  ps.addBatch();
   
  if(i % 500 == 0){
   //2.执行
   ps.executeBatch();
   //3.清空
   ps.clearBatch();
  }
 }
  
 //2.提交数据
 conn.commit();
  
 long end = System.currentTimeMillis();
 System.out.println("花费的时间为:" + (end - start));//1000000条:4978 
  
 JDBCUtils.closeResource(conn, ps);
}

到此这篇关于jdbc使用PreparedStatement批量插入数据的文章就介绍到这了,更多相关jdbc使用PreparedStatement批量插入数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
详解MySQL的半同步
Apr 22 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
MYSQL数据库使用UTF-8中文编码乱码的解决办法
May 26 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
MySQL query_cache_type 参数与使用详解
Jul 01 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
SQL IDENTITY_INSERT作用案例详解
Aug 23 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
Mar 03 MySQL
MySQL中IO问题的深入分析与优化
Apr 02 MySQL
mysql 乱码 字符集latin1转UTF8
Apr 19 MySQL
Mysql开启外网访问
May 15 MySQL
MySQL安装后默认自带数据库的作用详解
Apr 27 #MySQL
MySQL Router的安装部署
MySQL Shell的介绍以及安装
MySQL InnoDB ReplicaSet(副本集)简单介绍
Apr 24 #MySQL
MySQL 角色(role)功能介绍
Apr 24 #MySQL
浅谈Mysql多表连接查询的执行细节
Mysql基础之常见函数
Apr 22 #MySQL
You might like
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
jQuery对表单的操作代码集合
2011/04/06 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
jquery拖拽自动排序插件使用方法详解
2020/07/20 jQuery
JS实现的tab页切换效果完整示例
2018/12/18 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
2020/02/27 Javascript
在Python中处理XML的教程
2015/04/29 Python
Python 3.x 新特性及10大变化
2015/06/12 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
python实现图书管理系统
2018/03/12 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
python实现将汉字保存成文本的方法
2018/11/16 Python
django和vue实现数据交互的方法
2019/08/21 Python
python多线程并发及测试框架案例
2019/10/15 Python
opencv3/C++实现视频读取、视频写入
2019/12/11 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
基于keras中的回调函数用法说明
2020/06/17 Python
Django视图类型总结
2021/02/17 Python
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
大学生村官工作总结2015
2015/04/09 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
护士业务学习心得体会
2016/01/25 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript
ICOM R71E和R72E图文对比解说
2022/04/07 无线电