Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Lote JDBC com PreparedStatement não funciona no MySQL


Parece que você está criando um novo PreparedStatement em cada iteração, então o executeBatch() só será aplicado ao último PreparedStatement objeto.

Além disso, PreparedStatement é usado para evitar injeção de SQL e cuida do escape de valores, quando você usa o ? sistema de espaços reservados.

O addBatch() O método que você está usando destina-se a trabalhar com parâmetros variáveis:

, não com consultas brutas como você tentou fazer (para isso, você usaria addBatch(java.lang.String query)

O exemplo a seguir deve fazer o que você deseja:
String[][] data = { { "first", "data" }, { "second", "data" }, { "third", "data" } };

String sql = "insert into abc(col1,col2) values (?, ?)";// use placeholders

PreparedStatement pst = connection.prepareStatement(sql);// create a single statement

for (String[] row : data) {

       // set parameters
       pst.setString(1, row[0]);
       pst.setString(2, row[1]);

       pst.addBatch();// validate the set
}

int[] chkSql = pst.executeBatch(); // execute the batch of commands
//check if chkSql consists of 0..rollback else commit for > 0