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 05 MySQL
mysql在项目中怎么选事务隔离级别
May 25 MySQL
MySQL 全文索引使用指南
May 25 MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 MySQL
MySQL配置主从服务器(一主多从)
Aug 07 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
关于MySQL中的 like操作符详情
Nov 17 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
深入理解mysql事务隔离级别和存储引擎
Apr 12 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
MySQL的存储过程和相关函数
Apr 26 MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
PHP中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
2010/06/28 Javascript
javascript字符串拼接的效率问题
2010/12/25 Javascript
Javascript中的delete介绍
2012/09/02 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
详解Django框架中用户的登录和退出的实现
2015/07/23 Python
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
python学生管理系统的实现
2020/04/05 Python
详解CSS3选择器:nth-child和:nth-of-type之间的差异
2017/09/18 HTML / CSS
高级护理专业大学生求职信
2013/10/24 职场文书
培训主管的岗位职责
2013/11/23 职场文书
趣味活动策划方案
2014/02/08 职场文书
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
部队个人年终总结
2015/03/02 职场文书
2015年敬老月活动总结
2015/03/27 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
2019年公司卫生管理制度样本
2019/08/21 职场文书
Mysql实现主从配置和多主多从配置
2021/06/02 MySQL
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技