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.

ClipDiary y ATnotes sácale provecho al portapapeles

Cuando se está echando código, a menudo se necesita copiar varios fragmentos consecutivamente de un fuente a otro. O desde otro programa como Excel. Es tedioso tener que pasar al sitio desde donde se quiere copiar un pedazo, copiarlo, pasar al destino, pegar y luego repetir la operación. Sin hablar cuando se quiere copiar algo y uno se acuerda que algo importante ya está en el portapapeles. Bueno combinando dos herramientas (ClipDiary y ATnotes) se puede hacer el trabajo super sencillo.

Clipdiary es simplemente un almacenador del portapapeles. Todo lo que entra en el portapapeles, este programa lo almacena. Entonces lo que uno puede hacer es pasar al sitio desde donde se quiere copiar, y copiar todos los fragmentos que se necesitan dándole repetidamente Copiar. Luego en el sitio de destino abrir clipdiary e ir pegando todo lo que se copió. Recomiendo aprenderse o asignar un acceso directo al clipdiary. Ya que el pegado se reduce a presionar el acceso directo y decir pegar. El contenido de clipdiary además persiste después de apagar el PC.

Cuando se quiere ver a la vez dos piezas de código, o ver y copiar datos a un fuente mientras se están viendo ambos, tanto el fuente como los datos e ir copiando poco a poco, ahí es donde entra ATnotes. Éste es un programa de notas de recordatorio y esas cosas, que se pegan en el escritorio. Pero la idea no es usarlo de esa manera, sino la capacidad que tiene de quedarse flotando sobre las ventanas y de crear una nota proveniente del portapapeles.

Para usarlo lo primero que hay que hacer es seleccionar la opción "Always on top". Luego copiar todo el texto que se quiere ver y presionar el acceso directo Win+C. Ésto crea una nota flotante con el contenido del portapapeles. Lo que falta por hacer es ir al programa destino y poder trabajar con ambos textos, e inclusive copiar porciones de la nota.

Aquí están los enlaces para descargarlos:

  • Clipdiary
  • ATnotes (Ellos dicen que el programa está descontinuado, pero funciona perfectamente inclusive en Windows Vista SP1)

Yo descubrí éstos programas después de haber probado sus equivalentes que vienen en KDE (LINUX) Klipper y Knotes. Sólo que Klipper tiene además una fantástica opción de búsqueda y una característica llamada acciones que permite abrir programas dependiendo del contenido en el portapapeles. Así por ejemplo si un copia http://direccion/, klipper permite con un comando abrir el navegador con esa dirección.

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

CodeWeavers