PreparedStatement permite ejecutar sentencias SQL precompiladas con parámetros. Se crea un objeto PreparedStatement especificando la plantilla SQL y los lugares de los parámetros, los cuales son especificados después usando métodos set antes de ejecutar la sentencia. Esto es más eficiente que ejecutar sentencias SQL repetidamente solo cambiando valores, ya que la sentencia es compilada una sola vez.
3. DEFINICION
La interfaz PreparedStatement hereda de Statement y difiere de
esta en dos maneras.
Las instancias de PreparedStatement contienen una sentencia SQL
que ya ha sido compilada. Esto es lo que hace que se le llame
‘preparada’.
PreparedStatement tiene un grupo de métodos que fijan los valores
de los parámetros IN, los cuales son enviados a la base de datos
cuando se procesa la sentencia SQL.
4. Son muy útiles cuando una sentencia SQL se ejecuta muchas veces
cambiando sólo algunos valores.
Se utiliza para enviar sentencias SQL pre compiladas con uno o más
parámetros.
Se crea un objeto PreparedStatement especificando la plantilla y los lugares donde
irán los parámetros.
Los parámetros son especificados después utilizando los métodos setXXX(.) indicando
el número de parámetro y el dato a insertar en la sentencia.
La sentencia SQL y los parámetros se envían a la base de datos cuando se llama al
método: executeXXX()
5. USO
Cuando trabajamos con una base de datos es posible que haya
sentencias SQL que tengamos que ejecutar varias veces durante la
sesión, aunque sea con distintos parámetros. Por ejemplo, durante una
sesión con base de datos podemos querer insertar varios registros en
una tabla.
mysql> INSERT INTO person VALUES (null, 23, 'Pedro', 'Perez');
mysql> INSERT INTO person VALUES (null, 33, 'Rodrigo', 'Rodriquez');
6. El mecanismo que preven las bases de datos para hacer más eficiente este proceso es
que le indiquemos, previamente, el tipo de sentencia que vamos a usar, de forma que
la base de datos la "precompila" y la guarda en condiciones de ser ejecutada
inmediatamente, sin necesidad de analizarla en cada caso. Esto es lo que se conoce
como una prepared statement. En el caso de mysql, se haría de esta forma
mysql> PREPARE insertar FROM "INSERT INTO person VALUES (null, ?, ?, ?)";
mysql> SET @edad=23;
mysql> SET @nombre='Pedro';
mysql> SET @apellido='Perez';
mysql> EXECUTE insertar USING @edad,@nombre,@apellido
mysql> SET @edad=33;
mysql> SET @nombre='Rodrigo';
mysql> SET @apellido='Rodriguez';
mysql> EXECUTE insertar USING @edad,@nombre,@apellido;
mysql> DEALLOCATE PREPARE insertar;
7. Si tenemos una conexión a una base de datos y vamos a desplegar
nuestro código por diferentes entornos será muy útil el utilizar
propiedades de conexión JDBC. La idea es que en cada entorno de
ejecución: desarrollo, implantación y producción es probable que
tengamos información de acceso a la base de datos diferente.
PROPIEDADES
La idea es crear un fichero de propiedades. Para el ejemplo vamos a
hacerlo directamente por código:
8. atributos de configuración que esté esperando la base de datos. Por ejemplo
si utilizamos una base de datos MySQL podemos encontrar algunos como:
jdbcCompliantTruncation, para forzar truncado de campos en
inserción.
cachePrepStmts, cachear los PreparedStatement
enableQueryTimeouts, activar timeouts en la ejecución de las queries.
roundRobinLoadBalance, para balancear con nodos esclavos.
autoReconnect, para haver failover sobre un nodo esclavo.
.
9. EJEMPLO
.//Creamos un objeto PreparedStatement desde el objeto Connection
PreparedStatement ps = con.prepareStatement(
"select * from Propietarios where DNI=? AND NOMBRE=? AND EDAD=?");
//Seteamos los datos al prepared statement de la siguiente forma:
ps.setString(1, dni);
ps.setString(2, nombre);
ps.setInt(3, edad);
//Ejecutamos el PreparedStatement, en este caso con executeQuery()
ResultSet rs= ps.executeQuery();