Uso correcto del PreparedStatement

Actualización: Esta entrada se revisó y actualizó el 29 de Diciembre de 2015

El PreparedStatement nos permite definir una sentencia SQL base, que nos sirve para modificar/insertar/buscar uno o varios registros con sólo cambiar los valores de los parámetros que especifiquemos.

Un ejemplo típico es:
PreparedStatement pstmt = con.prepareStatement(
"update empleado set sueldo = ? where id_empleado = ?");
pstmt.setDouble(1, 153833.00);
pstmt.setInt(2, 110592);
Esto nos permite tener una sentencia SQL de fácil lectura y sin tener que concatenar cadenas o hacer conversiones de tipos. De la documentación de java:
An object that represents a precompiled SQL statement.
A SQL statement is precompiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times.
Supongamos que tenemos un mapa de empleados y sueldos:
Map<Integer, Double> empleadoSueldo = new HashMap<>();
empleadoSueldo.put(1, 1000.0);
empleadoSueldo.put(2, 2000.0);
empleadoSueldo.put(3, 3000.0);
Es muy común ver un código como el siguiente:
for(Map.Entry<Integer, Double> empleado : empleadoSueldo.entrySet()) {
      PreparedStatement pstmt = con.prepareStatement(
   "update empleado set sueldo = ? where id_empleado = ?");

      pstmt.setDouble(1, empleado.getValue());
      pstmt.setInt(2, empleado.getKey());
      pstmt.executeUpdate();
  }
La definición de PreparedStatement dice que es una sentencia SQL precompilada para ser ejecutada muchas veces. Pero al crear el PreparedStatement cada vez, se está precompilando y ejecutando. Perdiendo completamente la ventaja en rendimiento que supone el precompilado de una sentencia SQL. Hay algunos manejadores que inclusive crean un procedimiento almacenado temporal, cada vez que se crea un PreparedStatement.

Para aprovechar el precompilado, el código debe cambiar a:
PreparedStatement pstmt = con.prepareStatement(
   "update empleado set sueldo = ? where id_empleado = ?");

  for(Map.Entry<Integer, Double> empleado : empleadoSueldo
          .entrySet()) {

      pstmt.setDouble(1, empleado.getValue());
      pstmt.setInt(2, empleado.getKey());
      pstmt.executeUpdate();
}
Así el SQL es interpretado una sola vez por el manejador de base de datos, y de ahí en adelante sólo se ocupa de colocar parámetros y ejecutar.

Hasta la próxima...

Nota: Si esta información te es de utilidad o piensas que se puede mejorar, por favor deja un comentario con tus observaciones.

Búsqueda

Síguenos