- 浏览: 978703 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
Mr.Cheney:
去掉 UUID字符串中的“-” 直接replaceAll(&q ...
JAVA生成全局唯一ID 使用 java.util.UUID -
呜哩喵:
楼主nice
java中的时间操作 -
zxs6587:
Thinking inJava我读着好像说要建立基类对象啊!请 ...
创建子类的对象时也要创建其所有父类的对象? -
just_Word:
getFullYear
date.getyear -
JamesQian:
我觉得楼上的synchronized(this),notify ...
notify() wait()
转载
实现Java批量插入数据库数据,在javaeye中看到过几篇关于实现Java批量插入数据库数据,转载时没有找到,就自己写一下,也算是对自己学习过程中所遇到过的问题做一个总结。
一般关于批量向数据库插入数据都采用PreparedStatement、Statement…………也包括直接使用JDBC API、框架…………
也看到过几篇关于这些内容的总结,及大家的评论,以下为我总结的关于批量向数据库插入数据。
1,使用JDBC API实现配量插入数据:有篇文章介绍过关于JDBC API、Hibernate实现批量插入数据,采用JDBC API 方式实现随着数据的增长,速度更胜于Hibernate。当然,对于这个测试的准确我并不保证,但是我也会优先选用JDBC API方式实现(原因:简单、易学、相对于框架更通用,不会过时)。
2,采用PreparedStatement对象实现批量插入数据:PreparedStatement是真正的批处理命令,不是其他的伪批处理命令可以相比的(个人意见),它相对于其他的实现批量处理是非常的强大,比如字段不断改变,每次都要从文件从新读取就只能使用PreparedStatement对象来实现。再有就是存在即合理,既然PreparedStatement对象可以多次高效地执行预编译的语句,就一定有其原因(JDk源码没有分析过,和Statement实现的区别不了解)。
3,实现批量插入数据库数据
Java代码
Class.forName("com.mysql.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://" +
"localhost:3306/excel2mysql", "wanle", "wanle");
// 关闭事务自动提交
con.setAutoCommit(false);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SS");
TimeZone t = sdf.getTimeZone();
t.setRawOffset(0);
sdf.setTimeZone(t);
Long startTime = System.currentTimeMillis();
PreparedStatement pst = (PreparedStatement) con.prepareStatement("insert into test04 values (?,'中国')");
for (int i = 0; i < 10000; i++) {
pst.setInt(1, i);
// 把一个SQL命令加入命令列表
pst.addBatch();
}
// 执行批量更新
pst.executeBatch();
// 语句执行完毕,提交本事务
con.commit();
Long endTime = System.currentTimeMillis();
System.out.println("用时:" + sdf.format(new Date(endTime - startTime)));
pst.close();
con.close();
Class.forName("com.mysql.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://" + "localhost:3306/excel2mysql", "wanle", "wanle");
// 关闭事务自动提交
con.setAutoCommit(false);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SS");
TimeZone t = sdf.getTimeZone();
t.setRawOffset(0);
sdf.setTimeZone(t);
Long startTime = System.currentTimeMillis();
PreparedStatement pst = (PreparedStatement) con.prepareStatement("insert into test04 values (?,'中国')");
for (int i = 0; i < 10000; i++) {
pst.setInt(1, i);
// 把一个SQL命令加入命令列表
pst.addBatch();
}
// 执行批量更新
pst.executeBatch();
// 语句执行完毕,提交本事务
con.commit();
Long endTime = System.currentTimeMillis();
System.out.println("用时:" + sdf.format(new Date(endTime - startTime)));
pst.close();
con.close();
插入10000条数据用时3141毫秒,对于我已经很理想了, 毕竟我们不会使用MySQL进行非常大型项目的开发,对于10000条数据3秒多点,已经可以了,我相信对于大家应该也足以应付了,我们不会每天都插入10000条吧,当然对于我的话如果有这样的需求,我不会选择MySQL。
以上所有内容均为对于我所学习使用过程中、实际项目开发中的总结,也应用于其中。对于批量插入,数据导入均采用这样的方式
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Read {
private static Connection con=null;
private static PreparedStatement pstmt=null;
public static void writeDb(Record r){
try {
pstmt.setString(1, r.item1);
pstmt.setString(2, r.item2);
pstmt.setDouble(3, r.frequency);
pstmt.addBatch();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void readFile(){
try {
String s=null;
String[] split=new String[3];
FileReader fr = new FileReader("E:\\eclipse-SDK-3.5-win32\\eclipse\\workspace\\exp\\sina_entertaiment.txt");
BufferedReader bf=new BufferedReader(fr);
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/experiment?useUnicode=true&characterEncoding=utf-8","root","12345");
//con.createStatement();
pstmt=con.prepareStatement("insert into sina_entertaiment(item1,item2,frequency) values (?,?,?)");
while((s=bf.readLine())!=null){
// if(s.trim()=="")
// continue;
split=s.split("\t");
System.out.println(s);
writeDb(new Record(split));
}
pstmt.executeBatch();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SQLException e)
{
}
catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
finally
{
try {
pstmt.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args){
Read.readFile();
}
}
实现Java批量插入数据库数据,在javaeye中看到过几篇关于实现Java批量插入数据库数据,转载时没有找到,就自己写一下,也算是对自己学习过程中所遇到过的问题做一个总结。
一般关于批量向数据库插入数据都采用PreparedStatement、Statement…………也包括直接使用JDBC API、框架…………
也看到过几篇关于这些内容的总结,及大家的评论,以下为我总结的关于批量向数据库插入数据。
1,使用JDBC API实现配量插入数据:有篇文章介绍过关于JDBC API、Hibernate实现批量插入数据,采用JDBC API 方式实现随着数据的增长,速度更胜于Hibernate。当然,对于这个测试的准确我并不保证,但是我也会优先选用JDBC API方式实现(原因:简单、易学、相对于框架更通用,不会过时)。
2,采用PreparedStatement对象实现批量插入数据:PreparedStatement是真正的批处理命令,不是其他的伪批处理命令可以相比的(个人意见),它相对于其他的实现批量处理是非常的强大,比如字段不断改变,每次都要从文件从新读取就只能使用PreparedStatement对象来实现。再有就是存在即合理,既然PreparedStatement对象可以多次高效地执行预编译的语句,就一定有其原因(JDk源码没有分析过,和Statement实现的区别不了解)。
3,实现批量插入数据库数据
Java代码
Class.forName("com.mysql.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://" +
"localhost:3306/excel2mysql", "wanle", "wanle");
// 关闭事务自动提交
con.setAutoCommit(false);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SS");
TimeZone t = sdf.getTimeZone();
t.setRawOffset(0);
sdf.setTimeZone(t);
Long startTime = System.currentTimeMillis();
PreparedStatement pst = (PreparedStatement) con.prepareStatement("insert into test04 values (?,'中国')");
for (int i = 0; i < 10000; i++) {
pst.setInt(1, i);
// 把一个SQL命令加入命令列表
pst.addBatch();
}
// 执行批量更新
pst.executeBatch();
// 语句执行完毕,提交本事务
con.commit();
Long endTime = System.currentTimeMillis();
System.out.println("用时:" + sdf.format(new Date(endTime - startTime)));
pst.close();
con.close();
Class.forName("com.mysql.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://" + "localhost:3306/excel2mysql", "wanle", "wanle");
// 关闭事务自动提交
con.setAutoCommit(false);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SS");
TimeZone t = sdf.getTimeZone();
t.setRawOffset(0);
sdf.setTimeZone(t);
Long startTime = System.currentTimeMillis();
PreparedStatement pst = (PreparedStatement) con.prepareStatement("insert into test04 values (?,'中国')");
for (int i = 0; i < 10000; i++) {
pst.setInt(1, i);
// 把一个SQL命令加入命令列表
pst.addBatch();
}
// 执行批量更新
pst.executeBatch();
// 语句执行完毕,提交本事务
con.commit();
Long endTime = System.currentTimeMillis();
System.out.println("用时:" + sdf.format(new Date(endTime - startTime)));
pst.close();
con.close();
插入10000条数据用时3141毫秒,对于我已经很理想了, 毕竟我们不会使用MySQL进行非常大型项目的开发,对于10000条数据3秒多点,已经可以了,我相信对于大家应该也足以应付了,我们不会每天都插入10000条吧,当然对于我的话如果有这样的需求,我不会选择MySQL。
以上所有内容均为对于我所学习使用过程中、实际项目开发中的总结,也应用于其中。对于批量插入,数据导入均采用这样的方式
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Read {
private static Connection con=null;
private static PreparedStatement pstmt=null;
public static void writeDb(Record r){
try {
pstmt.setString(1, r.item1);
pstmt.setString(2, r.item2);
pstmt.setDouble(3, r.frequency);
pstmt.addBatch();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void readFile(){
try {
String s=null;
String[] split=new String[3];
FileReader fr = new FileReader("E:\\eclipse-SDK-3.5-win32\\eclipse\\workspace\\exp\\sina_entertaiment.txt");
BufferedReader bf=new BufferedReader(fr);
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/experiment?useUnicode=true&characterEncoding=utf-8","root","12345");
//con.createStatement();
pstmt=con.prepareStatement("insert into sina_entertaiment(item1,item2,frequency) values (?,?,?)");
while((s=bf.readLine())!=null){
// if(s.trim()=="")
// continue;
split=s.split("\t");
System.out.println(s);
writeDb(new Record(split));
}
pstmt.executeBatch();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SQLException e)
{
}
catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
finally
{
try {
pstmt.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args){
Read.readFile();
}
}
发表评论
-
关于数组和List之间相互转换的方法
2011-04-14 21:04 13811.List转换成为数组。( ... -
java的几种对象(PO,VO,DAO,BO,POJO)解释
2011-03-24 10:13 1344java的几种对象(PO,VO,DAO,BO,POJO)解释 ... -
switch
2010-12-02 19:02 11441 public class Switch { 2 ... -
优化的冒泡排序
2010-09-25 14:18 1368public static void bubble_Sort( ... -
java变量命名规则
2010-08-13 23:15 23711. 大小写有别,例如 a 和 A是两个变量 2. 长度任意 ... -
String.getBytes()的问题
2010-08-13 22:46 1647转载 http://java.chinaitlab.c ... -
tomcat 修改端口
2010-08-09 22:41 2005Tomcat端口修改: 在Tomcat安装目录下的conf目 ... -
tomcat 中增加用户名和密码
2010-08-09 22:41 1914原来的tomcat-user.xml是 <?xml ... -
Eclipse is running in a JRE, but a JDK is required
2010-07-28 09:30 15271 安装了maven插件,使用的时候老是有这样的提示: 08- ... -
安装Eclipse的maven插件
2010-07-27 11:01 1822Installing m2eclipse Core To i ... -
Attach Library Sources and Javadocs
2010-07-26 13:41 1919Attach Library Sources and Java ... -
maven 安装jaxb插件
2010-07-18 15:10 65651. Put your schemas ( ... -
java接受控制台输入
2010-07-16 13:45 2710import java.io.*; public c ... -
将xsd文件转化为java类
2010-07-10 15:31 2513最近有一个需求是把xsd文件中定义的数据类型转化为java类 ... -
jconsole attache sun glassfish
2010-06-13 17:04 1352To Set Up JConsole Connectivity ... -
suse下lamp的安装
2010-05-31 16:45 1565首先卸载suse缺省安装的apache2 主要是在网上看到人家 ... -
java的property配置文件的用法
2010-05-30 15:04 1143在我们平时写程序的时候,有些参数是经常改变的,而这种改变不是我 ... -
让ubuntu下的eclipse支持GBK编码
2010-05-30 14:38 1516今天,把windows下的工程导入到了Linux下eclips ... -
java路径中/的问题
2010-05-18 17:23 1365windows支持两种文件分隔符“/”和“\” 且使用“/”时 ... -
java中serializable是可以继承的
2010-05-16 21:58 5508import java.io.FileInputStream; ...
相关推荐
在标题为“批处理执行mysql脚本”的主题中,我们聚焦于如何高效地运行一系列MySQL数据库操作。描述提到在处理大量SQL脚本时,常规工具可能不支持批量执行,因此需要自定义解决方案。下面,我们将深入探讨MySQL批处理...
MySQL批处理是JDBC提供的一种优化数据库操作的方法,它允许开发者一次提交多个SQL语句,从而提高数据处理效率。本文将深入探讨JDBC在MySQL数据库中的应用,以及如何实现批处理操作。 首先,理解JDBC的基础知识至关...
在MySQL 5.x版本中,JDBC驱动支持了基本的SQL操作、事务处理、批处理、预编译的SQL语句等。而随着MySQL 8.x版本的发布,引入了许多新特性,包括窗口函数、JSON支持、更好的并行查询优化、增强的加密功能、改进的复制...
Java JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,它提供了标准的方法来连接、查询和操作MySQL这样的关系型数据库。MySQL是一款开源、免费的SQL数据库,广泛...
总结,"mysql-connector-java"是Java与MySQL数据库之间的重要桥梁,它为开发者提供了方便的接口,以便在Linux环境中进行数据库操作。了解并熟练掌握其安装、配置和使用,是开发Java数据库应用的基础。随着技术的发展...
总的来说,“mysql-connector-java-8.0.13.jar”是Java开发者连接和操作MySQL数据库的关键组件,它提供了一套全面的接口和功能,帮助开发者高效、安全地实现数据库操作。配合“mysql-connector-java-8.0.13.jar.txt...
MySQL Connector/J 8.0.29 是MySQL数据库与Java应用程序之间通信的重要桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够方便地在Java应用中连接并操作MySQL数据库。...
这里我们使用JDBC连接MySQL,使用HBase Java API操作HBase。以下是一个简单的示例: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop....
在Java编程中,操作MySQL数据库通常需要借助于特定的API和库。这篇博客的作者提供了一个自封装的JAVA操作MySQL数据库的工具类,这有助于简化数据库的交互过程,提高代码的可读性和可维护性。这里我们将深入探讨这个...
这个jar文件是MySQL官方提供的,旨在允许Java开发者通过Java语言轻松地访问和操作MySQL数据库。在本文中,我们将深入探讨MySQL Connector/J的各个方面,以及如何在Java项目中使用它。 首先,让我们了解JDBC(Java ...
此外,还可以利用JDBC的批处理功能来提高批量操作的效率。 总的来说,Java连接MySQL驱动涉及到JDBC API的使用、MySQL JDBC驱动的加载和配置、数据库连接的建立与关闭,以及SQL语句的执行与结果处理。熟悉这些知识点...
MySQL JDBC驱动,也称为MySQL Connector/J,是实现JDBC规范的特定于MySQL的驱动程序,它允许Java应用程序通过网络连接到MySQL数据库,执行SQL查询,处理结果,并进行数据的增删改查操作。 首先,我们需要理解JDBC的...
6. **自动类型映射**: MySQL Connector/J自动将MySQL的数据类型映射到Java数据类型,简化了数据的读取和写入操作。 7. **XA分布式事务**: 对于需要跨多个数据库或资源管理器的事务,驱动程序支持X/Open XA分布式...
MySQL Connector/J支持多种特性,包括事务处理、批处理、预编译的SQL语句以及自动重连功能,对于开发高效、可靠的Java应用非常关键。同时,随着MySQL服务器版本的更新,驱动也会随之升级,以确保最佳的兼容性和性能...
MySQL Connector/J是MySQL官方提供的JDBC驱动程序,它实现了Java标准接口,使得Java开发者能够通过编写Java代码来访问和操作MySQL数据库。在本例中,我们关注的是版本5.1.35的MySQL Connector/J。 JDBC驱动主要有四...
通过深入学习这些知识点,你可以熟练掌握使用 Java 连接和操作 MySQL 数据库的方法,从而在实际项目中构建稳定、高效的数据库应用。记得始终关注官方文档和社区更新,以便获取最新的功能和安全改进。
3. **性能优化**:该驱动进行了大量的性能优化,如预编译的SQL语句、批处理操作和结果集缓存,以提高数据存取速度。 4. **SSL安全连接**:MySQL Connector/J支持SSL加密,确保了数据库连接的安全性,防止数据在传输...