lunes, 27 de septiembre de 2010

Statement (addBatch, executeBatch, clearBatch): Ejecutar insert, update por lotes

Ejecutar sentencias por lotes.

Nos basaremos para el ejemplo en tres métodos de Statement:

  • addBatch(String sentencia). Añade una sentencia a la lista de sentencias por lotes.
  • executeBatch(). Ejecuta la lista de sentencias por lotes. Retorna un array de enteros con el resultado de cada sentencia.
  • clearBatch(). Limpia la lista de sentencias por lotes.
Si tenemos la intención de realizar varias sentencias INSERT o UPDATE consecutivas, es mucho más eficiente utilizar la ejecución de sentencias por lotes que enviar las sentencias una por una.

Creamos un método que reciba una lista de sentencias y las ejecuta por lotes:

public int[] ejecutaPorLotes(List sentencias) {
        Connection conn = getConnection();
        int[] resultado = null;
        Statement st = null;
        try {
            st = conn.createStatement();
            for (int i = 0; i < sentencias.size(); i++) {
                String sentencia = (String) sentencias.get(i);
                st.addBatch(sentencia);
            }
            resultado = st.executeBatch();
            st.clearBatch();
            return resultado;
        } catch (SQLException e) {
            e.printStackTrace();
            return resultado;
        } finally {
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }        

        }

    }

Vamos a probar el código:

public static void main(String[] args) {
        
        CaracteristicasJDBC car = new CaracteristicasJDBC();
        
        ArrayList lista = new ArrayList();
        lista.add("INSERT INTO USUARIOS VALUES ('Pepe',19)");
        lista.add("INSERT INTO USUARIOS VALUES ('Juan',21)");
        
        int[] resultado = car.ejecutaPorLotes(lista);
        
        for(int i=0;i
            System.out.println("resultado: "+resultado[i]);
        }

    }

Ejecutamos y vemos la consola:

Resultado

Comprobamos los datos en la tabla:

datos