Supongamos que hay un tipo de sentencia que se repite con frecuencia. En nuestro ejemplo podemos necesitar un informe de los clientes en función de su edad:
El problema de esto es que para todas y cada una de estas sentencias el gestor de bases de datos debe analizar y compilar. Esto supone un consumo innecesario de recursos. Podriamos tener preparado un esquema de sentencia y parametrizarlo en función de las necesiades del usuario. En resumen, las sentencias preparadas resultan más eficientes y más cómodas.
En este ejemplo vamos a preparar un esquema de sentencia que es parametrizable, para obtener los clientes en función de su edad. Los parámetros se indican con un interrogante (?):
//// Sentencia preparada PreparedStatement st = con.prepareStatement( "select nombre,edad from cliente where edad >= ? and edad <=?"); //// El usuario nos da la edad minima y la máxima BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in)); System.out.print( "Edad mínima: "); int edadMin = Integer.parseInt( entrada.readLine() ); System.out.print( "Edad máxima: "); int edadMax = Integer.parseInt( entrada.readLine() ); //// Pongo los parámetros de la sentencia preparada (edad mínima y máxima) st.setInt(1, edadMin ); st.setInt(2, edadMax ); //// Ejecuto sentencia y recorro el conjunto de resultados ResultSet rs = st.executeQuery(); while ( rs.next() ) System.out.println( "Nombre: " + rs.getString( "nombre" ) + ", Edad: " + rs.getInt( "edad" ) ); st.close();
Con el primer argumento de setInt() indicamos el número de parámetro que estamos definiendo: el primero y el segundo