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";// db2String 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();}}}}