阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

JDBC批处理

29次阅读
没有评论

共计 1556 个字符,预计需要花费 4 分钟才能阅读完成。

使用 JDBC 操作数据库的时候,经常会执行一些批量操作。

例如,一次性给会员增加可用优惠券若干,我们可以执行以下 SQL 代码:

INSERT INTO coupons (user_id, type, expires) VALUES (123, 'DISCOUNT', '2030-12-31');
INSERT INTO coupons (user_id, type, expires) VALUES (234, 'DISCOUNT', '2030-12-31');
INSERT INTO coupons (user_id, type, expires) VALUES (345, 'DISCOUNT', '2030-12-31');
INSERT INTO coupons (user_id, type, expires) VALUES (456, 'DISCOUNT', '2030-12-31');
...

实际上执行 JDBC 时,因为只有占位符参数不同,所以 SQL 实际上是一样的:

for (var params : paramsList) {PreparedStatement ps = conn.preparedStatement("INSERT INTO coupons (user_id, type, expires) VALUES (?,?,?)");
    ps.setLong(params.get(0));
    ps.setString(params.get(1));
    ps.setString(params.get(2));
    ps.executeUpdate();}

类似的还有,给每个员工薪水增加 10%~30%:

UPDATE employees SET salary = salary * ? WHERE id = ?

通过一个循环来执行每个 PreparedStatement 虽然可行,但是性能很低。SQL 数据库对 SQL 语句相同,但只有参数不同的若干语句可以作为 batch 执行,即批量执行,这种操作有特别优化,速度远远快于循环执行每个 SQL。

在 JDBC 代码中,我们可以利用 SQL 数据库的这一特性,把同一个 SQL 但参数不同的若干次操作合并为一个 batch 执行。我们以批量插入为例,示例代码如下:

try (PreparedStatement ps = conn.prepareStatement("INSERT INTO students (name, gender, grade, score) VALUES (?, ?, ?, ?)")) {// 对同一个 PreparedStatement 反复设置参数并调用 addBatch():
    for (Student s : students) {ps.setString(1, s.name);
        ps.setBoolean(2, s.gender);
        ps.setInt(3, s.grade);
        ps.setInt(4, s.score);
        ps.addBatch(); // 添加到 batch
    }
    // 执行 batch:
    int[] ns = ps.executeBatch();
    for (int n : ns) {System.out.println(n + "inserted."); // batch 中每个 SQL 执行的结果数量
    }
}

执行 batch 和执行一个 SQL 不同点在于,需要对同一个 PreparedStatement 反复设置参数并调用addBatch(),这样就相当于给一个 SQL 加上了多组参数,相当于变成了“多行”SQL。

第二个不同点是调用的不是 executeUpdate(),而是executeBatch(),因为我们设置了多组参数,相应地,返回结果也是多个int 值,因此返回类型是 int[],循环int[] 数组即可获取每组参数执行后影响的结果数量。

练习

使用 Batch 操作。

下载练习

小结

使用 JDBC 的 batch 操作会大大提高执行效率,对内容相同,参数不同的 SQL,要优先考虑 batch 操作。

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计1556字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中