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的MVCC多版本并发控制的实现
Apr 14 MySQL
MySQL安装后默认自带数据库的作用详解
Apr 27 MySQL
详解MySQL的Seconds_Behind_Master
May 18 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
解决Mysql多行子查询的使用及空值问题
Jan 22 MySQL
MySQL的索引你了解吗
Mar 13 MySQL
一次SQL如何查重及去重的实战记录
Mar 13 MySQL
MySQL去除密码登录告警的方法
Apr 20 MySQL
MySQL提取JSON字段数据实现查询
Apr 22 MySQL
MySQL生成千万测试数据以及遇到的问题
Aug 05 MySQL
SQLServer常见数学函数梳理总结
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排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
浅谈Javascript面向对象编程
2011/11/15 Javascript
js实现浏览器的各种菜单命令比如打印、查看源文件等等
2013/10/24 Javascript
jquery.form.js用法之清空form的方法
2014/03/07 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
javascript常用正则表达式汇总
2015/07/31 Javascript
JS+CSS实现电子商务网站导航模板效果代码
2015/09/10 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
vue项目实战总结篇
2018/02/11 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
2018/01/24 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
python实现日志按天分割
2019/07/22 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
基于OpenCV的网络实时视频流传输的实现
2020/11/15 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
英国Lookfantastic中文网站:护肤品美妆美发购物(英国直邮)
2020/04/27 全球购物
用Python写一个for循环的例子
2016/07/19 面试题
UNIX文件系统常用命令
2012/05/25 面试题
理工学院学生自我鉴定
2014/02/23 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
化工工艺设计求职信
2014/06/25 职场文书
化工专业求职信
2014/07/01 职场文书
医德医魂心得体会
2014/09/11 职场文书
服务整改报告
2014/11/06 职场文书
大学生敬老院活动总结
2015/05/07 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android