Oracle中statement.executeUpdate()无法批量插入,求常规SQL替代方案
Oracle数据库批量插入的常规SQL方法
你原来的写法在H2中可行,是因为H2允许在单个Statement中执行多条分号分隔的SQL语句,但Oracle默认不支持这种方式,所以需要换用以下几种常规方法实现批量插入:
方法一:多值INSERT语法(Oracle 12c+支持)
这是接近标准SQL的写法,一次性插入多条记录,语法简洁:
INSERT INTO PERSON (NAME, AGE) VALUES ('张三', 25), ('Susan', 20)
对应的Java代码(推荐用PreparedStatement避免SQL注入):
// 预编译SQL,避免字符串拼接带来的注入风险 String sql = "INSERT INTO PERSON (NAME, AGE) VALUES (?, ?), (?, ?)"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setString(1, name); pstmt.setInt(2, age); pstmt.setString(3, "Susan"); pstmt.setInt(4, 20); int success = pstmt.executeUpdate();
方法二:INSERT ALL语法(Oracle特有)
适合批量插入到同一张或多张表的场景,灵活性更高:
INSERT ALL INTO PERSON (NAME, AGE) VALUES ('张三', 25) INTO PERSON (NAME, AGE) VALUES ('Susan', 20) SELECT * FROM DUAL;
对应的Java代码:
String sql = "INSERT ALL " + "INTO PERSON (NAME, AGE) VALUES (?, ?) " + "INTO PERSON (NAME, AGE) VALUES (?, ?) " + "SELECT * FROM DUAL"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setString(1, name); pstmt.setInt(2, age); pstmt.setString(3, "Susan"); pstmt.setInt(4, 20); int success = pstmt.executeUpdate();
方法三:JDBC批量执行(通用兼容)
这是JDBC标准的批量操作方式,兼容性强,适合大量数据插入,性能更优:
String sql = "INSERT INTO PERSON (NAME, AGE) VALUES (?, ?)"; PreparedStatement pstmt = connection.prepareStatement(sql); // 添加第一条记录到批量队列 pstmt.setString(1, name); pstmt.setInt(2, age); pstmt.addBatch(); // 添加第二条记录到批量队列 pstmt.setString(1, "Susan"); pstmt.setInt(2, 20); pstmt.addBatch(); // 执行批量更新,返回每条记录的执行结果 int[] successCounts = pstmt.executeBatch(); // 可遍历successCounts统计总成功条数
注意:避免直接拼接SQL字符串,这种写法存在严重的SQL注入风险,始终优先使用PreparedStatement预编译SQL。
内容的提问来源于stack exchange,提问作者ivoronline
相关产品推荐
相关产品推荐

