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 07 MySQL
MySQL sql_mode修改不生效的原因及解决
May 07 MySQL
MySQL 可扩展设计的基本原则
May 14 MySQL
详解GaussDB for MySQL性能优化
May 18 MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
May 20 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
Mysql中调试存储过程最简单的方法
Jun 30 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
一文搞懂MySQL索引页结构
Feb 28 MySQL
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
Apr 09 MySQL
MySQL的prepare使用以及遇到的bug
May 11 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 cookis创建实现代码
2009/03/16 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
2016/03/21 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
php中青蛙跳台阶的问题解决方法
2018/10/14 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
jqGrid增加时--判断开始日期与结束日期(实例解析)
2013/11/08 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
node.js中module.exports与exports用法上的区别
2016/09/02 Javascript
Angular.js中下拉框实现渲染html的方法
2017/06/18 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
react redux入门示例
2018/04/19 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
2019/06/15 Javascript
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
Python增量循环删除MySQL表数据的方法
2016/09/23 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
django项目中使用云片网发送短信验证码的实现
2021/01/19 Python
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
节约用水倡议书
2014/04/16 职场文书
取保候审保证书
2014/04/30 职场文书
单位法定代表人授权委托书
2014/09/20 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
爱国主义电影观后感
2015/06/18 职场文书
呐喊读书笔记
2015/06/30 职场文书
网络舆情信息简报
2015/07/21 职场文书
医务人员岗前培训心得体会
2016/01/08 职场文书
大学生各类奖学金申请书
2019/06/24 职场文书
php中pcntl_fork详解
2021/04/01 PHP