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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
MySQL创建索引需要了解的
Apr 08 MySQL
MySQL root密码的重置方法
Apr 21 MySQL
MySQL数据迁移相关总结
Apr 29 MySQL
浅谈mysql执行过程以及顺序
May 12 MySQL
MySQL系列之五 视图、存储函数、存储过程、触发器
Jul 02 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
Mysql中一千万条数据怎么快速查询
Dec 06 MySQL
关于k8s环境部署mysql主从的问题
Mar 13 MySQL
Nebula Graph解决风控业务实践
Mar 31 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
Jul 07 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
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
日本十大惊悚动漫
2020/03/04 日漫
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
ZF等常用php框架中存在的问题
2008/01/10 PHP
php实现查询百度google收录情况(示例代码)
2013/08/02 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
php简单判断文本编码的方法
2015/07/30 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
PHP与Web页面交互操作实例分析
2020/06/02 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
jQuery层次选择器选择元素使用介绍
2013/04/18 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
JS实现的仿QQ空间图片弹出效果代码
2016/02/23 Javascript
理解javascript对象继承
2016/04/17 Javascript
Immutable 在 JavaScript 中的应用
2016/05/02 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
vue-cli 目录结构详细讲解总结
2019/01/15 Javascript
python查看zip包中文件及大小的方法
2015/07/09 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
Python基于pyecharts实现关联图绘制
2020/03/27 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
您在慕尼黑的跑步商店:Lauf-bar
2019/10/11 全球购物
社区活动邀请函范文
2014/01/29 职场文书
宪法宣传周工作方案
2014/05/26 职场文书
演讲稿开场白台词
2014/08/25 职场文书
python字典的元素访问实例详解
2021/07/21 Python