Ya hemos visto como podemos insertar registros en una tabla mediante un BatchUpdate. Pero cual sería un ejemplo BatchUpdateException cuando ejecutemos estas sentencias. Veamos como simularlo.
Preparar una tabla
Lo primero que haremos será crear una tabla que permita insertar números del 0 al 9. Además sobre esta tabla crearemos un índice para que no se puedan repetir los números. De esta forma cuando intentemos insertar un número repetido generará un error, error que controlaremos mediante la BatchUpdateException.
La tabla la creamos mediante una sentencia SQL CREATE TABLE
.
PreparedStatement stmt = con.prepareStatement("CREATE TABLE temporal (numero TINYINT(1) NOT NULL)");
stmt.execute();
stmt.close();
Y su respectivo índice con la sentencia SQL CREATE UNIQUE INDEX
.
stmt = con.prepareStatement("CREATE UNIQUE INDEX indicenumero ON temporal(numero)");
stmt.execute();
stmt.close();
Insertar una lista de números
Ahora vamos a realizar una inserción en batch de números. En esta lista de números habrá números repetidos para que falle la inserción y se genere la BatchUpdateExcepcion.
int[] valores = {1,2,2,3,1,4,1,2};
PreparedStatement carga = con.prepareStatement("INSERT INTO temporal VALUES (?)");
for (int x=0;x
Controlar BatchUpdateException
Cuando lanzamos el método .excecuteBatch()
se lanzarán todas las inserciones, cuando se llegue a los números repetidos se irá lanzando la BatchUpdateException
, si bien, el resto de números serán insertados.
Para controrlar la BatchUpdateException
utilizamos el siguiente código
} catch (BatchUpdateException bue) {
int[] errores = bue.getUpdateCounts();
System.out.println("--Errores en el Batch--\n");
for (int x=0;x
Vemos que el método .getUpdateCounts()
nos devuelve un array de enteros que representan cada uno de los INSERT
que se han ejecutado. Los valores mayores de 0 representarán aquellos que se han insertado correctamente, y los que tengan un valo menor de 0 serán aquellos que hayan fallado.
Es por ello que recorriendo el array podemos listar aquellas sentencias que fallaron. Obteniendo por consola la siguiente salida:
Error insertando el valor 2 de la posición 2
Error insertando el valor 1 de la posición 4
Error insertando el valor 1 de la posición 6
Error insertando el valor 2 de la posición 7
Espero que este ejemplo BatchUpdateException haya servidor para ver como se maneja dicha excepción.