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 Shell的介绍以及安装
Apr 24 MySQL
带你学习MySQL执行计划
May 31 MySQL
MySQL删除和插入数据很慢的问题解决
Jun 03 MySQL
MySQL 数据恢复的多种方法汇总
Jun 21 MySQL
MySQL系列之四 SQL语法
Jul 02 MySQL
Mysql实现简易版搜索引擎的示例代码
Aug 30 MySQL
Linux系统下MySQL配置主从分离的步骤
Mar 21 MySQL
排查并解决MySQL生产库内存使用率高的报警
Apr 11 MySQL
MySQL如何使备份得数据保持一致
May 02 MySQL
MySQL查询日期时间
May 15 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 MySQL
MySQL性能指标TPS+QPS+IOPS压测
Aug 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开源项目的源码指南
2014/12/21 PHP
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
node中的session的具体使用
2018/09/14 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
Python中异常重试的解决方案详解
2017/05/05 Python
python flask实现分页效果
2017/06/27 Python
python实现给微信公众号发送消息的方法
2017/06/30 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
Python Logging 日志记录入门学习
2018/06/02 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
2020/04/22 Python
scrapy实践之翻页爬取的实现
2021/01/05 Python
J2EE相关知识面试题
2013/08/26 面试题
个人自我鉴定
2013/11/07 职场文书
大学校园生活自我鉴定
2014/01/13 职场文书
付款委托书范本
2014/04/04 职场文书
干部竞争上岗演讲稿
2014/09/11 职场文书
交通事故委托书范本
2014/09/28 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
坎儿井导游词
2015/02/09 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python