Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Prepared statement
1. Ingeniería de Sistemas y Telemática
PREPAREDSTATEMENT
Marco Aurelio Porro Chulli.
Erlin Darwin Herrera Cieza.
Yosmer Aguilar Cabrera.
:V
2. nos permite ejecutar sentencias SQL sobre una conexión establecida con una base
de datos. Pero en este caso vamos a ejecutar sentencias SQL más especializadas,
estas sentencias SQL se van a denominar sentencias SQL precompiladas y van a
recibir parámetros de entrada.
El interfaz PreparedStatement hereda del interfaz Statement y se diferencia de él
de dos maneras:
Las instancias de
PreparedStatement contienen
sentencias SQL que ya han sido
compiladas.
Esto es lo que hace a una
sentencia "prepared” (preparada).
La sentencia SQL que contiene un objeto
PreparedStatement puede contener uno o
más parámetros de entrada. Un parámetro de
entrada es aquél cuyo valor no se especifica
cuando la sentencia es creada, en su lugar la
sentencia va a tener un signo de interrogación
(?) por cada parámetro de entrada
3. A continuación se ofrece la acostumbrada referencia rápida de los métodos
void adBatch(): añade un conjunto de parámetros al conjunto de comandos
que se ejecutará en modo batch.
void clearParameters(): elimina los valores de los parámetros actuales.
boolean execute(): ejecuta cualquier tipo de sentencia SQL.
ResultSet executeQuery(): ejecuta la sentencia SQL representada por el
objeto PreparedStatement, devolviendo un objeto ResultSet con el resultado de
la ejecución de la consulta.
int executeUpdate(): ejecuta una sentencia SQL del tipo INSERT, UPDATE o
DELETE.
ResultSetMetaData getMetaData(): devuelve un objeto ResultSetMetaData
que contendrá el número, tipos y propiedades de las columnas de un objeto
ResultSet.
void setArray(int índiceParámetro, Array valor)
void setBoolean(int índiceParámetro, boolean valor),etc.
4. Para crear un objeto PreparedStatement se debe lanzar el
método prepareStatement() del interfaz Connection sobre el
objeto que representa la conexión establecida con la base de
datos.
En el siguiente ejemplo se puede ver como se crearía un objeto
PreparedStatement que representa una sentencia SQL con dos
parámetros de entrada.
Connection
conexion=DriverManager.getConnection(url,"pepe","xxxx");
PreparedStatement
sentencia=conexion.prepareStatement("UPDATE MiTabla SET
nombre =?"+"WHERE clave =?");
5. Antes de poder ejecutar un objeto PreparedStatement se debe asignar un valor
para cada uno de sus parámetros. Esto se realiza mediante la llamada a un método
setXXX, donde XXX es el tipo apropiado para el parámetro.
Del la siguiente forma
Connection conexion=DriverManager.getConnection(url);
PreparedStatement sentencia=conexion.prepareStatement("UPDATE MiTabla SET
nombre = ? "+"WHERE clave =?");
sentencia.setString(1,"Pepe");
sentencia.setInt(2,157);
Una vez que se ha asignado unos valores a los parámetros de entrada de una
sentencia, el objeto PreparedStatement se puede ejecutar múltiples veces, hasta
que sean borrados los parámetros con el método clearParameters(),
6. El Código muestra como una vez creado un objeto PreparedStatement
se ejecuta variasveces y se le cambian los parámetros.
Connection conexion=DriverManager.getConnection(url);
PreparedStatement sentencia=conexion.prepareStatement("UPDATE
MiTabla SET Id = ?"+"WHERE num=?");
for (int i=0;i<20;i++){
sentencia.setInt(1,i);
sentencia.setInt(2,i);
sentencia.executeUpdate();
}
7. Ejecuta la instrucción SQL determinada, que puede ser una instrucción INSERT,
UPDATE, MERGE o DELETE; o una instrucción SQL que no devuelve nada, como una
instrucción DDL de SQL.
Un objeto CallableStatement ofrece la posibilidad de realizar llamadas a
procedimientos almacenados de una forma estándar para todos los DBMS. Un
procedimiento almacenado se encuentra dentro de una base de datos; la llamada a
un procedimiento es lo que contiene un objeto CallableStatement.
La sintaxis para realizar la llamada a un procedimiento almacenado es la siguiente:
{call nombre_del_procedimiento[(?,?,...)]}
Si devuelve un parámetro de resultado:
{?=call nombre_del_procedimiento[(?.?...)]}
La sintaxis de una llamada a un procedimiento sin ningún tipo de parámetros sería:
{call nombre_del_procedimiento}
8. Los objetos CallableStatement se crean con el método prepareCall
de
Connection. El siguiente ejemplo crea una instancia de
CallableStatement que contiene una llamada al procedimiento
almacenado getTestData, con dosargumentos y no devuelve
resultados.
CallableStatement cstmt = con.prepareCall(
"{call getTestData(?, ?)}");
donde los encajes ‘?’ son parámetros IN, OUT ó INOUT dependiendo
del
procedimiento getTestData.
9. EJEMPLOS.
El siguiente fragmento de código, donde con es un objeto Connection,
crea un objeto PreparedStatement que contiene una instrucción SQL:
//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();
10. Por ejemplo supongamos que hay un campo de texto en el que el usuario
puede introducir su dirección de correo electrónico y con este dato se desea
buscar al usuario:
Connection con = DriverManager.getConnection(url);
String consulta = "SELECT usuario FROM registro WHERE email like ?";
PreparedStatement pstmt = con.prepareStatement(consulta);
pstmt.setString(1 , campoTexto.getText());
ResultSet resultado = ps.executeQuery();