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 Router的安装部署
Apr 24 MySQL
详解mysql三值逻辑与NULL
May 19 MySQL
MySQL 8.0 Online DDL快速加列的相关总结
Jun 02 MySQL
MySQL不使用order by实现排名的三种思路总结
Jun 02 MySQL
MySQL删除和插入数据很慢的问题解决
Jun 03 MySQL
mysql连接查询中and与where的区别浅析
Jul 01 MySQL
MySQL系列之三 基础篇
Jul 02 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
SQL基础的查询语句
Nov 11 MySQL
为什么MySQL不建议使用SELECT *
Apr 03 MySQL
Windows下载并安装MySQL8.0.x 版本的完整教程
Apr 10 MySQL
MySQL 语句执行顺序举例解析
Jun 05 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使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
PHP递归遍历多维数组实现无限分类的方法
2016/05/06 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
js 深拷贝函数
2008/12/04 Javascript
jquery submit ie6下失效的原因分析及解决方法
2013/11/15 Javascript
JS动态调用方法名示例介绍
2013/12/18 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
2015/05/25 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
微信小程序 框架详解及实例应用
2016/09/26 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
详解react服务端渲染(同构)的方法
2017/09/21 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
[01:08:44]NB vs VP 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
python获取网页状态码示例
2014/03/30 Python
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
python中@property和property函数常见使用方法示例
2019/10/21 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
python 如何设置守护进程
2020/10/29 Python
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
简述安装Slackware Linux系统的过程
2012/01/12 面试题
计算机本科生自荐信
2013/10/15 职场文书
医院护士的求职信
2014/01/03 职场文书
我们的节日清明节活动方案
2014/03/05 职场文书
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
vue 自定义组件添加原生事件
2022/04/21 Vue.js