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 24 MySQL
如何用Navicat操作MySQL
May 12 MySQL
MySQL库表名大小写的选择
Jun 05 MySQL
MySQL 百万级数据的4种查询优化方式
Jun 07 MySQL
分析mysql中一条SQL查询语句是如何执行的
Jun 21 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
MySQL图形化管理工具Navicat安装步骤
Dec 04 MySQL
MySQL优化及索引解析
Mar 17 MySQL
MySQL如何快速创建800w条测试数据表
Mar 17 MySQL
MySQL实战记录之如何快速定位慢SQL
Mar 23 MySQL
解决Mysql报错 Table 'mysql.user' doesn't exist
May 06 MySQL
关于MySQL中explain工具的使用
May 08 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中foreach循环中使用引用要注意的地方
2011/01/02 PHP
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
2020/05/02 PHP
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
jquery利用event.which方法获取键盘输入值的代码
2011/10/09 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
2017/07/13 Javascript
node的process以及child_process模块学习笔记
2018/03/06 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
js实现鼠标单击Tab表单切换效果
2018/05/16 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
python使用matplotlib画柱状图、散点图
2019/03/18 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
利用Python复制文件的9种方法总结
2019/09/02 Python
python实现银行管理系统
2019/10/25 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
python3.6使用SMTP协议发送邮件
2020/05/20 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
animation和transition的区别
2020/10/12 HTML / CSS
有趣、实用和鼓舞人心的产品:Inspire Uplift
2019/11/05 全球购物
中职生自我鉴定范文
2013/10/03 职场文书
农村改厕实施方案
2014/03/22 职场文书
总经理检讨书
2014/09/15 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
如何写辞职信
2015/05/13 职场文书