0%

【JDBC】批量插入

Java实现数据库批量插入操作

一、介绍

  • (1)update、delete本身就具有批量操作的效果
  • (2)所以批量操作一般就指批量插入

二、实例

  • 下面出现的几个方法,一逐步优化,所以最终推荐使用最后一个方法
  • 代码演示的是插入1000条数据的速度
  • 演示使用表的格式

1.方式一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Test
public void test() throws Exception {
//1.连接数据库
Connection conn = JDBCUtils.getConnection();

//2.创建Preparedstatement对象
String sql = "insert into goods(name) values(?)";
PreparedStatement ps = conn.prepareStatement(sql);

//3.循环填充占位符,并执行;并记录循环开始,结束时间
long start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
ps.setObject(1, "name" + (i+1));
ps.execute();
}
long end = System.currentTimeMillis();
System.out.println("花费时间为:" + (end-start));//80903(本人花费时间)

//4.关闭连接
JDBCUtils.close(conn, ps);
}

2.方式二

  • 使用addBatch()、executeBatch()、clearBatch()进行批量插入,类似创建一个缓冲区,存够一定数据才在执行
  • mysql服务器默认关闭批量处理,需要在url后面添加?rewriteBatchedSatements=true,mysql8.0不需要此操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Test
public void test2() throws Exception {
//1.连接数据库
Connection conn = JDBCUtils.getConnection();

//2.创建PreparedStatement对象
String sql = "insert into goods(name) values(?)";
PreparedStatement ps = conn.prepareStatement(sql);

//3.填充占位符,循环执行,并记录开始,结束时间
long start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
ps.setObject(1, "name" + i);
//(1)攒sql语句
ps.addBatch();
//(2)攒够一定数量,开始一次性执行
if (i % 500 == 0){
ps.executeBatch();
ps.clearBatch();
}
}
long end = System.currentTimeMillis();
System.out.println("花费时间为:" + (end-start));//38537(本人花费时间)

//4.关闭连接
JDBCUtils.close(conn, ps);
}

3.方式三

  • 没执行一次sql语句都会提交一次数据,于是关闭自动提交数据,等全部数据执行完才一次性提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Test
public void test3() throws Exception {
//1.连接数据库
Connection conn = JDBCUtils.getConnection();

//2.创建PreparedStatement
String sql = "insert into goods(name) values(?)";
PreparedStatement ps = conn.prepareStatement(sql);

//3.设置不允许自动提交数据
conn.setAutoCommit(false);

///4.填充占位符,循环执行,并记录开始,结束时间
long start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
ps.setObject(1, "name" + i);
//(1)攒sql语句
ps.addBatch();
//(2)攒够一定数量,开始一次性执行
if (i % 500 == 0){
ps.executeBatch();
ps.clearBatch();
}
}

//5.手动提交数据
conn.commit();
long end = System.currentTimeMillis();
System.out.println("花费时间为:" + (end-start));//409(本人花费时间)

//6.关闭连接
JDBCUtils.close(conn, ps);
}