mybatis可以批量插入或更新数据,不过mybatis底层也是基于jdbc来实现的,如何使用jdbc批量操作数据?本文给出demo。
/**
* JDBC分批次批量插入
*
* @throws IOException
*/
public static void testJDBCBatchInsertUser() throws IOException {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
// lib添加了驱动db2jcc4.jar这一步可以注释
// Class.forName("com.ibm.db2.jcc.DB2Driver");
// mysql
// String databaseURL = "jdbc:mysql://localhost:3306/test";
// db2
String databaseURL = "jdbc:db2://131.252.100.200:60001/testdb";
String user = "root";
String password = "123456";
connection = DriverManager.getConnection(databaseURL, user, password);
/**
* 关闭自动提交事务,改为手动提交,如果需要事务支持
* connection commit相关的注释请打开
*/
// connection.setAutoCommit(false);
System.out.println("===== 开始插入数据 =====");
long startTime = System.currentTimeMillis();
String sqlInsert = "INSERT INTO T_TEST_USER (NAME,AGE) VALUES (?,?)";
preparedStatement = connection.prepareStatement(sqlInsert);
Random random = new Random();
for (int i = 1; i <= 30000; i++) {
preparedStatement.setString(1, "user" + i);
if (i == 8000) {
preparedStatement.setString(1, "user01234567890123456789012345678901234567890 " + i);
}
preparedStatement.setInt(2, random.nextInt(100));
// 添加到批处理中
preparedStatement.addBatch();
/**
* 1000条每次,30万条记录,耗时14252毫秒 5000条每次,30万条记录,耗时7773毫秒 10000条每次,30万条记录,耗时6482毫秒
* 50000条每次,30万条记录,耗时6159毫秒 50000条每次,30万条记录,耗时5822毫秒 根据机器性能来选择最优,实验下来5000笔每批最优
*/
try {
if (i % 5000 == 0) {
// 每1000条数据提交一次
preparedStatement.executeBatch();
// connection.commit();
System.out.println("成功插入第 " + i + " 条数据");
}
} catch (Exception e) {
// try {
// if(connection!=null)
// {
// connection.rollback();
// }
// } catch (Exception e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
e.printStackTrace();
}
}
// 处理剩余的数据
preparedStatement.executeBatch();
// connection.commit();
long spendTime = System.currentTimeMillis() - startTime;
System.out.println("成功插入 30 万条数据,耗时:" + spendTime + "毫秒");
} catch (Exception e) {
// try {
// if(connection!=null)
// {
// connection.rollback();
// }
// } catch (Exception e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
System.out.println("Error: " + e.getMessage());
} finally {
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}