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的join buffer原理
Apr 29 MySQL
MySQL数据库超时设置配置的方法实例
Oct 15 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 MySQL
实战 快速定位MySQL的慢SQL
Mar 22 MySQL
在MySQL中你成功的避开了所有索引
Apr 20 MySQL
MySQL优化之慢日志查询
Jun 10 MySQL
mysql幻读详解实例以及解决办法
Jun 16 MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 MySQL
mysql拆分字符串作为查询条件的示例代码
Jul 07 MySQL
MySQL索引失效场景及解决方案
Jul 23 MySQL
MySQL深分页问题解决思路
Dec 24 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
计数器详细设计
2006/10/09 PHP
php接口与接口引用的深入解析
2013/08/09 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
2013/08/26 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
jQuery简介_动力节点Java学院整理
2017/07/04 jQuery
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
微信小程序canvas绘制圆角base64图片的实现
2019/08/18 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
浅谈vue中$bus的使用和涉及到的问题
2020/07/28 Javascript
python实现简单socket通信的方法
2016/04/19 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
Django 大文件下载实现过程解析
2019/08/01 Python
用Python抢火车票的简单小程序实现解析
2019/08/14 Python
python默认参数调用方法解析
2020/02/09 Python
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
大学生学习生活的自我评价
2013/11/01 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
政风行风评议心得体会
2014/10/21 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python