如何在不构建字符串的情况下使用 JDBC 进行扩展插入?

The*_*heo 5 java mysql sql jdbc

我有一个应用程序可以解析日志文件并将大量数据插入数据库。它是用 Java 编写的,并通过 JDBC 与 MySQL 数据库对话。我已经尝试了不同的方法来插入数据,以便为我的特定用例找到最快的方法。目前似乎表现最好的方法是发出扩展插入(例如具有多行的单个插入),如下所示:

INSERT INTO the_table (col1, col2, ..., colN) VALUES
(v1, v2, v3, ..., vN),
(v1, v2, v3, ..., vN),
...,
(v1, v2, v3, ..., vN);
Run Code Online (Sandbox Code Playgroud)

行数可以是数万。

我试过使用准备好的语句,但它远没有那么快,可能是因为每个插入仍然单独发送到数据库并且需要锁定表等等。在我之前处理代码的同事尝试使用批处理,但效果也不够好。

问题是,使用扩展插入意味着,据我所知,我需要自己构建 SQL 字符串(因为行数是可变的),这意味着我打开了各种我不知道的 SQL 注入向量哪里聪明到可以找到自己。必须有更好的方法来做到这一点。

显然,我对插入的字符串进行了转义,但只能使用类似str.replace("\"", "\\\"");(重复 '、? 和 \)之类的内容,但我确信这还不够。

dfa*_*dfa 4

准备好的语句+批量插入:

PreparedStatement stmt = con.prepareStatement(
"INSERT INTO employees VALUES (?, ?)");

stmt.setInt(1, 101);
stmt.setString(2, "Paolo Rossi");
stmt.addBatch();

stmt.setInt(1, 102);
stmt.setString(2, "Franco Bianchi");
stmt.addBatch();

// as many as you want   
stmt.executeBatch();
Run Code Online (Sandbox Code Playgroud)