Saltar la navegación

5.8.- Sentencias preparadas.

A veces es útil usar un objeto PreparedStatement para enviar sentencias de SQL a la base de datos. Este tipo especial de declaración se deriva de la clase más general Statement.

Una Prepared Statement es una sentencia SQL de base de datos precompilada. Al estar precompilada, su ejecución será más rápida que una SQL normal, por lo que es adecuada cuando vamos a ejecutar la misma sentencia SQL (con distintos valores) muchas veces. 

Veamos como se usa :

Símplemente ponemos interrogantes donde irán los valores concretos que vayamos a insertar. Cada interrogante se identifica luego con un número, de forma que el primer interrogante que aparece es el 1, el segundo el 2, etc. Luego, con los métodos set() correspondientes rellenamos esos valores. El primer parámetro es el número del interrogante y el segundo el valor que queremos insertar. Finalmente llamamos a executeUpdate(). Luego, con la misma PreparedStatement, ponemos otros valores volviendo a llamar a los métodos set() y volvemos a llamar a executeUpdate()

Fíjate que a la hora de poner los interrogantes, no nos hemos preocupado de poner comillas en los valores de texto ni conversiones de ningún tipo. Las llamadas a setInt(), setString(), ya hacen todas las conversiones adecuadas para nosotros.

El siguiente ejemplo utiliza un único objeto PreparedExpresion, dándole valores a los parámetros:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class actualizaSentenciaPreparada {
	public static void main(String[] args) throws SQLException {
		String urljdbc = "jdbc:oracle:thin:@localhost:1521:XE";
		Connection conexion = DriverManager.getConnection(urljdbc, "scott", "tiger");
		PreparedStatement pstmt = conexion.prepareStatement("UPDATE EMP " + "SET SAL = ? WHERE empno = ?");
		pstmt.setInt(1, 1);
		pstmt.setInt(2,7844 );
		pstmt.executeUpdate();
		pstmt.close();
		conexion.close();
	}
}
Los métodos que permiten pasar parámetros a  la sentencia empiezan por set:
setBigDecimal(int parameterIndex, BigDecimal x)
setBinaryStream(int parameterIndex, InputStream x)
setDate(int parameterIndex, Date x)
setDouble(int parameterIndex, double x)
setInt(int parameterIndex, int x)
setString(int parameterIndex, String x)
etc...