setstring - prepared statement java definicion
java, mysql inserta en tablas mĂșltiples usando preparedStatement (1)
Ok, voy a reformular esta pregunta ya que la hice un poco complicada antes.
quiero tomar esto:
con.setAutoCommit(false);
String tempforbatch;
Statement stmt = con.createStatement();
for (int i = 0; i < tables.length; i++) {
tempforbatch = "INSERT INTO " + tables[i] + " VALUES (''" + values[i] + "'')";
stmt.addBatch(tempforbatch);
}
stmt.executeBatch();
y conviértalo en algo exactamente igual, solo usando:
PreparedStatement stmt = con.prepareStatement("INSERT INTO table_name VALUES (?, ?)");
donde ''table_name'' puede ser reemplazado en base a qué tablas [i] es cada vez a través del ciclo.
He intentado de todas las maneras posibles en las que puedo pensar hasta ahora y todo sale igual, ya sea inválido para sql, o simplemente faltando todo menos el último INSERT cada vez.
Al final quiero hacer un ciclo que agrupe todas las inserciones, tal vez 100, tal vez 1000, no sé. en cualquier caso, quiero que bucle y lote todas las inserciones y luego ejecutar el lote una vez que todo esté hecho. La otra forma es simplemente ejecutar cada inserto individual por sí mismo, lo que en primer lugar mata la razón de tener la función de proceso por lotes.
Si solo hubiera una manera de hacer esto:
PreparedStatement stmt = con.prepareStatement("INSERT INTO ? VALUES (?, ?)");
...loop code here....
stmt.setTable(1, "table1");
stmt.setString(2, "value1");
stmt.setString(3, "value2");
stmt.addBatch();
...end loop here....
stmt.executeBatch();
sin embargo, como todos sabemos, .setTable no existe :( si hubiera, entonces podría colocarse en un bucle y recibir un valor de tabla diferente para cada pasada a través del bucle. Este tipo de bucle funcionará bien en este momento, siempre que sea todo el misma mesa
A juzgar por otros ejemplos (como PreparedStatement.addBatch en java tiene alguna restricción? ) No puede usar una sola llamada para ejecutar Batch cuando realiza múltiples llamadas a prepareStatement. Cada llamada a prepareStatement, aunque puede tener varias llamadas a addBatch, debe tener su propia llamada para ejecutarBatch.
Por lo tanto, para minimizar la comunicación entre Java y MySQL, consideraría utilizar un procedimiento almacenado en MySQL. Y como es habitual con las optimizaciones, lo intentaría de la manera más sencilla antes de llegar a la conclusión de que la forma más compleja (el procedimiento almacenado) es realmente necesaria.
También veo que otras personas desactivan la confirmación automática cuando utilizan executeBatch.