Cuando estamos tratando con consultas a bases de datos en Java, sobre todo en un proyecto Enterprise, podemos llegar a hablar de consultas kilométricas que acceden a varias tablas con una cantidad ingente de campos. Y si pretendemos hacer las cosas bien, utilizando los PreparedStatement, por temas de seguridad , legibilidad y reutilización, seguramente, si tenemos que hacer algún cambio en una sentencia, añadiendo o eliminando algún parametro, nos podemos encontrar con que deberemos cambiar bastantes líneas de código, en vez de la que debemos añadir/quitar solamente.

Vamos a poner un ejemplo práctico, si tenemos la siguiente sentencia de consulta a una base de datos:


SELECT usuarios.*, roles.descripcion, posts.entrada, posts.titulo FROM usuarios,descripcion,posts
WHERE usuarios.rolId=roles.id AND posts.userId=usuarios.id AND posts.fecha BETWEEN ? AND ?
AND usuarios.userId = ? AND posts.id = ? AND posts.isVisible = ? AND posts.visitas > ?

Esta consulta no es muy extensa, pero nos valdrá para ilustrar el supuesto práctico.  Ahora tendríamos el siguiente código Java para realizar la consulta:


String consulta = //la consulta de arriba;
PreparedStatement stmt = conexion.prepareStatement(consulta);
stmt.setDate(1,desde);
stmt.setDate(2,hasta);
stmt.setInt(3,userId);
stmt.setInt(4,postId);
stmt.setBoolean(5,isVisible);
stmt.setInt(6,numVisitas);

ResultSet result = stmt.executeQuery();

Esta sería la forma normal de trabajar, pero si en un futuro tenemos que realizar alguna modificación a la consulta,
por ejemplo, quitamos la necesidad de las dos fechas en la condición. Nos encontramos conque deberemos eliminar dos lineas de código
y modificar las otras 4, para que cuadre el número del parámetro. Esto no nos llevaría mucho tiempo en una sola consulta, pero si hubiera que modificar más consultas (porque se haya eliminado un campo que se utilizaba en todas las consultas como condición),  o si tratamos de una consulta con 20 parámetros por ejemplo, ya requeriría más tiempo empleado en el mantenimiento.

Así, que para ahorrar en tiempo de mantenimiento futuro, lo que podemos hacer, es insertar una variable que vaya aumentando con cada inserción de un nuevo parámetro, de esta forma,  no  tenemos que estar trabajando con el número de parámetro que se le pasa a los métodos set… y nos ahorraremos más de un dolor de cabeza. El código resultante, sería algo así:

int parameter=1;
String consulta = //la consulta de arriba;
PreparedStatement stmt = conexion.prepareStatement(consulta);
stmt.setDate(parameter++,desde);
stmt.setDate(parameter++,hasta);
stmt.setInt(parameter++,userId);
stmt.setInt(parameter++,postId);
stmt.setBoolean(parameter++,isVisible);
stmt.setInt(parameter++,numVisitas);

ResultSet result = stmt.executeQuery();

De esta forma, ya nos podemos despreocupar, de que el número de un parámetro coincida
con el de la consulta, y si hacemos alguna modificación en la consulta, no tendremos que realizar demasiado
cambio en el código y por último, nos facilita el copy & paste que tanto gusta a algunos.
Para finalizar, solo hay que recordar que el número de parametros, empieza con 1, no con 0 como los arrays, y que el número
de parametros que requiere la consulta, debe ser igual al número de parámetros que le pasamos, uno más o uno menos
resultará en una excepción.

« »