Existe una manera de crear sentencias SQL una vez y usarla cada vez que quiera correrla
Esto se logra a través de preparedstatement de JDBC
Esta interfaz permite construir las sentencias SQL requeridas una vez y ejecutarlas cualquier número de veces en la aplicación
Cuando un objeto preparedstatement es creado, la sentencia SQL se da como argumento
La sentencia SQL debe ser enviada al DBMS inmediatamente donde es compilada una vez
3. PreparedStatement
Existe una manera de crear sentencias SQL una vez y usarla cada vez que quiera
correrla
Esto se logra a través de preparedstatement de JDBC
Esta interfaz permite construir las sentencias SQL requeridas una vez y
ejecutarlas cualquier número de veces en la aplicación
Cuando un objeto preparedstatement es creado, la sentencia SQL se da
como argumento
La sentencia SQL debe ser enviada al DBMS inmediatamente donde es
compilada una vez
4. PreparedStatement
En tiempo de construcción el preparedstatement no conoce los
valores que determinan el resultado de su ejecución
Solo las posiciones de dichos valores son conocidas en el momento
de su creación, las mismas son indicadas con el símbolo “?”
preparedstatement ps;
ps = conn.Preparedstatement("select * from tabla "+ "where c1=? ")
5. If(rs.Next())
system.Out.Println("encontrado");
else
system.Out.Println("no encontrado");
}catch(exception e){
system.Out.Println("error: "+e);
}finally{
try{
if(conn!=Null)
conn.Close();
}catch(exception e){}
}
}
}//fin de la clase PruebasJDBCprepared
Import java.Sql.*;
Public class pruebasjdbcprepared {
static string db="jdbc:db2:ibm";
Static string drv="com.Ibm.Db2.Jdbc.App.Db2driver";
Public static void main(string []args){
Connection conn = null;
Preparedstatement ps = null;
Try{
Class.Forname(drv);
Conn = drivermanager.
Getconnection(db,"db2admin","db2admin");
String sql = "select * from estudiante where
ci=?";
Ps = conn.Preparecall(sql);
Ps.Setint(1,123);
Resultset rs = ps.Executequery();
//Continúa...
E J E M P L O
6. Cuándo Utilizar Un Objeto Preparedstatement
Si queremos ejecutar muchas veces un objeto Statement, reduciremos el tiempo de
ejecución si utilizamos un objeto PreparedStatement, en su lugar.
La característica principal de un objeto PreparedStatement es que, al contrario que un
objeto Statement, se le entrega una sentencia SQL cuando se crea.
La ventaja de esto es que en la mayoría de los casos, esta sentencia SQL se enviará al
controlador de la base de datos inmediatamente, donde será compilado.
Como resultado, el objeto PreparedStatement no sólo contiene una sentencia SQL,
sino una sentencia SQL que ha sido recompilada.
Esto significa que cuando se ejecuta la PreparedStatement, el controlador de base de
datos puede ejecutarla sin tener que compilarla primero.
Aunque los objetos PreparedStatement se pueden utilizar con sentencias SQL sin
parámetros, probablemente nosotros utilizaremos más frecuentemente sentencias con
parámetros.
7. Crear Un Objeto Preparedstatement
Al igual que los objetos statement, creamos un objeto preparedstatement con un objeto connection.
Utilizando nuestra conexión con abierta en ejemplos anteriores, podríamos escribir lo siguiente para
crear un objeto preparedstatement que tome dos parámetros de entrada.
Preparedstatement updatesales = con.Preparestatement("UPDATE COFFEES SET SALES = ?
WHERE COF_NAME LIKE ?");
La variable updatesales contiene la sentencia SQL, "UPDATE COFFEES SET SALES = ? WHERE
COF_NAME LIKE ?", que también ha sido, en la mayoría de los casos, enviada al controlador de la
base de datos, y ha sido precompilado.
8.
9. MÉTODO EXECUTEUPDATE().
Para obtener datos de una tabla utilizando una sentencia SELECT con marcadores de
parámetros, utilice el método preparedstatement.Executequery. Este método devuelve
una tabla de resultados en un objeto resultset. Una vez obtenida la tabla de resultados, debe
utilizar métodos de resultset para desplazarse por la tabla de resultados y obtener los
valores de cada columna de cada fila.
Int executeupdate()
Ejecuta la instrucción sql en este objeto preparedstatement,que debe ser una declaración de
sqldata manipulation langueje (dml); como insert update o delete; o una declaración sql que no
devuelve nada, como una instruccion ddl.
11. USO DE CALLABLESTATEMENT.
La sintaxis para invocar un procedimiento almacenado en JDBC se muestra a continuación: notar que
los corchetes indican que lo que se encuenta contenido en ellos es opcional, no ofroma parte de la
sintaxis.
{Call procedure_name[(?, ?, ...)]}
La sintaxis para un procedimiento que devuelve un resultado es:
{? = Call procedure_name[(?, ?, ...)]}
La sintaxis para un procedimiento almacenado sin parámetros se parece a algo como:
{Call procedure_name}
Callablestatement hereda los métodos de statement, los cuales tratan sentencias SQL en general, y
también hereda los métodos de preparedstatement, que tratan los parámetros IN. Todos los métodos
definidos para callablestatement tratan los parámetros OUT o los aspectos de salida de los parámetros
INOUT: registro de los tipos JDBC (tipos genéricos SQL) de los parámetros OUT, recuperación de
valores desde ellos o chequear si el valor devuelto es un JDBC NULL.
12. CREAR OBJETOS CALLABLESTATEMENT:
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 dos
argumentos y no devuelve resultados.
CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
donde los encajes ‘?’ son parámetros IN, OUT ó INOUT dependiendo del
procedimiento getTestData. donde los encajes ‘?’ son parámetros IN, OUT ó
INOUT dependiendo del procedimiento getTestData.
CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
donde los encajes ‘?’ son parámetros IN, OUT ó INOUT dependiendo del
procedimiento getTestData.
13.
14. EJEMPLOS
Ejemplo1: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();
Ejemplo2:ejemplo de preparedstatement de consulta.
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();
15. Ejemplo3:Ejemplo de PreparedStatement de modificación.
En el siguiente ejemplo se va a insertar un nuevo registro en una tabla:
Connection con = DriverManager.getConnection(url);String insercion = "INSERT
INTO registro(usuario , email , fechaNac) values ( ? , ? , ? )");PreparedStatement
pstmt = con.prepareStatement(consulta);
String user = . . . ;String email = . . . ;Date edad = . . . ; //O int
edad;pstmt.setString(1 , user);pstmt.setString(2 , email);pstmt.setDate(3 , edad); //
setInt(3, edad);ps.executeUpdate();