JDBC进行批量插入数据操作
目录
1.方式一:使用PreparedStatement
2.方式二:使用addBatch(),excuteBatch(),clearBatch()
3.方式三:设置不允许自动提交数据
4.总结
1.方式一:使用PreparedStatement
步骤
①获取连接。
②编写SQL语句。
③预编译SQL语句。
④填充占位符。
⑤执行SQL语句。
实例:创建数据表并包含一个int类型字段userid,并向其中添加2万条数据。
package lib;import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;public class Test2 {public static void main(String []args) {InputStream is = null;Connection connection = null;try {//获取连接is = Test2.class.getClassLoader().getResourceAsStream("test.properties");Properties properties=new Properties();properties.load(is);String user=properties.getProperty("user");String password=properties.getProperty("password");String url=properties.getProperty("url");String driver=properties.getProperty("driver");Class.forName(driver);connection = DriverManager.getConnection(url, user, password);//删除旧表String sql="drop table test";PreparedStatement ps=connection.prepareStatement(sql);ps.execute();//创建新表sql="create table test (userid int)";ps=connection.prepareStatement(sql);ps.execute();//插入数据sql="insert into test values (?)";ps=connection.prepareStatement(sql);for(int i=1;i<=20000;i++) {ps.setObject(1, i);ps.execute();}} catch (Exception e) {e.printStackTrace();}//资源关闭try {connection.close();} catch (SQLException e) {e.printStackTrace();}try {is.close();} catch (IOException e) {e.printStackTrace();}}
}
2.方式二:使用addBatch(),excuteBatch(),clearBatch()
步骤
①获取连接。
②编写sq语句。
③预编译SQL语句。
④填充占位符。
⑤调用PreparedStatement对象的addBatch()攒SQL语句。
⑥调用PreparedStatement对象的excuteBatch()执行SQL语句。
⑦调用PreparedStatement对象的clearBatch()清空Batch。
注意点:
①上面的三个函数作用分别是:攒SQL语句、执行SQL语句、清空SQL语句。
②MySQL服务器默认是关闭批处理的,需要设置一个参数使MySQL支持批处理操作。做法:在配置文件中URL后面加上:?rewriteBatchedStatements=true
实例:同上
package lib;import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;public class Test2 {public static void main(String []args) {InputStream is = null;Connection connection = null;try {//获取连接is = Test2.class.getClassLoader().getResourceAsStream("test.properties");Properties properties=new Properties();properties.load(is);String user=properties.getProperty("user");String password=properties.getProperty("password");String url=properties.getProperty("url");String driver=properties.getProperty("driver");Class.forName(driver);connection = DriverManager.getConnection(url, user, password);//删除旧表String sql="drop table test";PreparedStatement ps=connection.prepareStatement(sql);ps.execute();//创建新表sql="create table test (userid int)";ps=connection.prepareStatement(sql);ps.execute();//插入数据sql="insert into test values (?)";ps=connection.prepareStatement(sql);for(int i=1;i<=20000;i++) {ps.setObject(1, i);//攒SQL语句ps.addBatch();if(i%500==0) {//执行SQL语句ps.executeBatch();//清空SQL语句ps.clearBatch();}}} catch (Exception e) {e.printStackTrace();}//资源关闭try {connection.close();} catch (SQLException e) {e.printStackTrace();}try {is.close();} catch (IOException e) {e.printStackTrace();}}
}
3.方式三:设置不允许自动提交数据
步骤
同方式二,不过在获取连接之后要先调用Connection对象的setAutoCommit()方法将数据库的自动提交功能进行关闭,然后再所有数据写入完成以后再调用Connection对象的commit()方法来将数据进行统一提交。
实例:同上
package lib;import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;public class Test2 {public static void main(String []args) {InputStream is = null;Connection connection = null;try {//获取连接is = Test2.class.getClassLoader().getResourceAsStream("test.properties");Properties properties=new Properties();properties.load(is);String user=properties.getProperty("user");String password=properties.getProperty("password");String url=properties.getProperty("url");String driver=properties.getProperty("driver");Class.forName(driver);connection = DriverManager.getConnection(url, user, password);//关闭自动提交connection.setAutoCommit(false);//删除旧表String sql="drop table test";PreparedStatement ps=connection.prepareStatement(sql);ps.execute();//创建新表sql="create table test (userid int)";ps=connection.prepareStatement(sql);ps.execute();//插入数据sql="insert into test values (?)";ps=connection.prepareStatement(sql);long time=System.currentTimeMillis();for(int i=1;i<=1000000;i++) {ps.setObject(1, i);//攒SQL语句ps.addBatch();if(i%500==0) {//执行SQL语句ps.executeBatch();//清空SQL语句ps.clearBatch();}//提交数据if(i==1000000) {connection.commit();//恢复自动提交connection.setAutoCommit(true);}}System.out.println(System.currentTimeMillis()-time);} catch (Exception e) {e.printStackTrace();}//资源关闭try {connection.close();} catch (SQLException e) {e.printStackTrace();}try {is.close();} catch (IOException e) {e.printStackTrace();}}
}
4.总结
其实方式一前面还有一种方式是使用Statement类来进行批处理,但是由于PreparedStatement会进行预编译SQL语句,之后只要填充占位符即可,不用每次插入数据都进行SQL语句的声明,减少了内存开销和时间花费。
在方式二中,使用addBatch()、excuteBatch()、clearBatch()三个方法来对SQL语句进行“攒起来”的操作,攒够一定量后再进行插入,减少了与数据库之间的交互次数,减少了插入的时间,提高效率。
方式三中,在获取连接以后,关闭数据库的自动提交功能,在最后一次添加数据后再将所有数据进行统一提交,减少了数据提交的次数,进而减少提交数据的时间,提高了效率。
JDBC进行批量插入数据操作相关推荐
- JDBC:批量插入数据操作
批量插入操作 举例: 向数据表中插入20000条数据 数据库中提供一个goods表.创建如下: CREATE TABLE goods( id INT PRIMARY KEY AUTO_INCREMEN ...
- JDBC executeBatch批量插入数据
JDBC executeBatch批量插入数据 JDBC executeBatch批量插入数据 JDBC executeBatch批量插入数据 con.setAutoCommit(false); 项目 ...
- Java JDBC批处理插入数据操作
在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...
- java jdbc 批处理_Java JDBC批处理插入数据操作
在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...
- 【JDBC】PreparedStatement实现批量插入数据
题目:[JDBC]PreparedStatement实现批量插入数据 前言: PreparedStatement除了解决Statement的拼串.sql注入问题之外,还可以实现以下操作 Prepare ...
- JDBC 批量插入数据
当需要批量插入数据到数据库时,我们可以利用基础的Statement或PreparedStatement外加for循环来实现操作,但这种方式效率奇低. 因此,当需要成批插入或者更新记录时,我们可以利用J ...
- 用python操作mysql数据库(之批量插入数据)
#!/usr/bin/env python # -*- coding: utf-8 -*- import MySQLdb #建立连接 conn = MySQLdb.connect(host='127. ...
- jdbc高效的批量插入数据
一.Statement与PreparedStatement的选择 PrepardStatement继承于Statement,主要区别点是PreparedStatement实现了SQL预编译,从而一定程 ...
- MySQL批量插入数据的几种方法
最近公司要求测试数据库的性能,就上网查了一些批量插入数据的代码,发现有好几种不同的用法,插入同样数据的耗时也有区别 别的先不说,先上一段代码与君共享 方法一: package com.bigdata; ...
最新文章
- 【H2 Database】查看帮助信息
- json对象转换成string的方法
- rollup学习小记
- 5月17日 AJAX 之 XML
- mongoose 批量修改字段_WordPress图片路径批量替换方法
- 有限元python编程流行吗_Python进行有限元分析
- Java讲课笔记10:类的封装
- threejs引擎中 环境光线与管道流动
- UI Framework-1: Ash Color Chooser
- Python标准库 urllib
- android 拍照 对焦,在Android中设置相机对焦区域
- 纯代码蓝色理想的logo
- 【javaScript】原生实现窗口拖动效果
- ArcMap10.2 选项(Options)窗口显示不完整问题解决(以默认加载栅格数据去背景显示设置为例)
- python 3.6.0.tgz,如何在Ubuntu和LinuxMint上安装Python 3.6.0
- centos7分区挂载大容量数据盘
- 汇编实现乐曲演奏《两只老虎》
- ps2模拟器安卓版_安卓PS2模拟器游戏推荐:奥特曼格斗进化3
- 目标规划模型:求解思路、序贯式算法
- python 加法代码_python运行加法