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 pt-slave-restart工具的使用简介
Apr 07 MySQL
MySQL创建高性能索引的全步骤
May 02 MySQL
MySQL 查询速度慢的原因
May 25 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
MySQL为id选择合适的数据类型
Jun 07 MySQL
浅谈MySQL next-key lock 加锁范围
Jun 07 MySQL
MySQL系列之七 MySQL存储引擎
Jul 02 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 MySQL
MySQL分区表实现按月份归类
Nov 01 MySQL
MySQL悲观锁与乐观锁的实现方案
Nov 02 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
MySQL限制查询和数据排序介绍
Mar 25 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 Memcached应用实现代码
2010/02/08 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
destoon数据库表说明汇总
2014/07/15 PHP
PHP MVC框架路由学习笔记
2016/03/02 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
lib.utf.js
2007/08/21 Javascript
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
JS实现图片产生波纹一样flash效果的方法
2015/02/27 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解
2016/03/31 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
原生JS实现垂直手风琴效果
2017/02/19 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
微信小程序Redux绑定实例详解
2017/06/07 Javascript
Angular中的$watch、$watchGroup、$watchCollection
2017/06/25 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
2017/09/19 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
Vue仿百度搜索功能
2020/12/28 Vue.js
python读文件逐行处理的示例代码分享
2013/12/27 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
Python实现微信表情包炸群功能
2021/01/28 Python
物业工作计划书
2014/01/10 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
危爆物品安全大检查大整治工作方案
2014/05/03 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
新年祝酒词大全
2015/08/11 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书
使用vue-element-admin框架从后端动态获取菜单功能的实现
2021/04/29 Vue.js
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python