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 27 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
MySQL非空约束(not null)案例讲解
Aug 23 MySQL
mysql timestamp比较查询遇到的坑及解决
Nov 27 MySQL
SQL语法CONSTRAINT约束操作详情
Jan 18 MySQL
SQL注入篇学习之盲注/宽字节注入
Mar 03 MySQL
进阶篇之linux环境下安装MySQL数据库
Apr 09 MySQL
MySql数据库 查询时间序列间隔
May 11 MySQL
Mysql中的触发器定义及语法介绍
Jun 25 MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 MySQL
MySQL索引失效场景及解决方案
Jul 23 MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
Sep 23 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
点评山进PR-D3L三波段收音机
2021/03/02 无线电
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
js中的this关键字详解
2013/09/25 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
2015/02/15 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
解决webpack打包速度慢的解决办法汇总
2017/07/06 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
如何将HTML字符转换为DOM节点并动态添加到文档中详解
2018/08/19 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
python中文编码问题小结
2014/09/28 Python
python如何通过实例方法名字调用方法
2018/03/21 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
Python通用函数实现数组计算的方法
2019/06/13 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
VLAN和VPN有什么区别?分别实现在OSI的第几层?
2014/12/23 面试题
自荐信格式简述
2014/01/25 职场文书
幼儿园招生广告
2014/03/19 职场文书
党支部公开承诺书
2014/03/28 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
2014年底工作总结
2014/12/15 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS