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 中相关的锁
May 25 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
MySQL悲观锁与乐观锁的实现方案
Nov 02 MySQL
MySQL基于索引的压力测试的实现
Nov 07 MySQL
MySQL中varchar和char类型的区别
Nov 17 MySQL
MySQL中int (10) 和 int (11) 的区别
Jan 22 MySQL
MySQL实战记录之如何快速定位慢SQL
Mar 23 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 MySQL
MySQL数据库查询之多表查询总结
Aug 05 MySQL
关于MySQL中explain工具的使用
May 08 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
输出控制类
2006/10/09 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
PHP封装的Twitter访问类实例
2015/07/18 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
javascript校验价格合法性实例(必须输入2位小数)
2014/05/05 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
2015/09/02 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
js实现随机点名器精简版
2020/06/29 Javascript
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
python处理图片之PIL模块简单使用方法
2015/05/11 Python
Python yield 使用浅析
2015/05/28 Python
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
python hashlib加密实现代码
2019/10/17 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
会计自荐信范文
2014/03/09 职场文书
干部考核评语
2014/04/29 职场文书
艺术节开幕词
2015/01/28 职场文书
学雷锋活动简报
2015/07/20 职场文书
详解TypeScript中的类型保护
2021/04/29 Javascript