1 . CONTENIDO
PREPAREDSTATEMENT
La interface 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’.
• La
sentencia SQL contenida en un objeto PreparedStatement pueden tener uno o más
parámetros IN. Un parámetro IN es aquel cuyo valor no se especifica en la
sentencia SQL cuando se crea. En vez de ello la sentencia tiene un interrogante
(‘?’) como un ‘encaje’ para cada parámetro IN. Debe suministrarse un valor para
cada interrogante mediante el método apropiado setXXX antes de ejecutar la
sentencia.
Como
los objetos PreparedStatement están precompilados, su ejecución es más rápida
que los objetos Statement. Consecuentemente, una sentencia SQL que se ejecute
muchas veces a menudo se crea como PreparedStatement para incrementar su
eficacia.
Siendo
una subclase de Statement, PreparedStatement hereda toda la funcionalidad de
Statement. Además, se añade un set completo de métodos necesarios para fijar
los valores que van a ser enviados a la base de datos en el lugar de los
‘encajes’ para los parámetros IN. También se modifican los tres métodos
execute, executeQuery y executeUpdate de tal forma que no toman argumentos. Los
formatos de Statement de estos métodos (los formatos que toman una sentencia
SQL como argumento) no deberían usarse nunca con objetos PreparedStatement.
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’.
|
•
|
La sentencia SQL contenida en un
objeto PreparedStatement pueden tener uno o más parámetros
IN. Un parámetro IN es aquel cuyo valor no se especifica en la sentencia SQL
cuando se crea. En vez de ello la sentencia tiene un interrogante (‘?’) como
un ‘ancla’ para cada parámetro IN. Debes suministrar un valor para cada
interrogante mediante el método apropiado, que puede ser: setInt, setString,
etc, antes de ejecutar la sentencia.
|
Creada por el método prepareStatement -
Un objeto PreparedStatement se usa para sentencias SQL que toman uno
o más parámetros como argumentos de entrada (parámetros IN).
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.
Las Instancias de PreparedStatement extienden,
es decir, heredan de Statement y por tanto heredan los métodos
de Statement. Un objeto PreparedStatement es potencialmente más eficiente
que un objeto Statement porque este ha sido precompilado y almacenado
para su uso futuro.
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()
|
Creación
de objetos PreparedStatement
El siguiente ejemplo, donde con es un objeto Connection, crea un objeto
PreparedStatement conteniendo una sentencia SQL con dos ‘encajes’ para
parámetros IN.
PreparedStatement
pstmt = con.prepareStatement(
"UPDATE table4 SET m = ? WHERE x = ?");
"UPDATE table4 SET m = ? WHERE x = ?");
El
objeto pstmt contiene ahora la sentencia “UPDATE table4 SET m= ? WHERE x = ? “,
que ya ha sido enviada a la base de datos y ha sido preparada para su
ejecución.
Los métodos de interfaz PreparedStatement
A continuación, se dan los métodos
importantes de la interfaz PreparedStatement:
Uso del método
PreparedStatement.executeQuery
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.
7 Con el Controlador JDBC
universal de DB2, también puede utilizar el método 7 PreparedStatement.executeQuery para obtener un conjunto de 7 resultados de una llamada de
procedimiento almacenado, si ese 7 procedimiento
almacenado devuelve un solo conjunto de resultados y 7 tiene solamente parámetros de
entrada. 7 Si el procedimiento almacenado
devuelve varios conjuntos de 7 resultados,
debe utilizar el método Statement.execute. 7 Consulte el tema Obtención de 7 varios conjuntos de resultados
de un procedimiento almacenado en una 7 aplicación
JDBC para 7 obtener más
información.
Para obtener filas de una tabla utilizando una
sentencia SELECT con marcadores de parámetros, siga estos pasos:
- Invoque
el método Connection.prepareStatement para crear un objeto PreparedStatement.
- Invoque
métodos PreparedStatement.setXXX para pasar valores a los
parámetros de entrada.
- Invoque
el método PreparedStatement.executeQuery para obtener la tabla de resultados
de la sentencia SELECT en un objeto ResultSet.
- En un
bucle, posicione el cursor utilizando el método ResultSet.next y recupere datos de cada columna
de la fila actual del objeto ResultSet utilizando métodos getXXX.
- Invoque
el método ResultSet.close para cerrar el objeto ResultSet.
- Invoque
el método PreparedStatement.close para cerrar el objeto PreparedStatement cuando termine de utilizar ese
objeto.
USO DE
CALLABLESTATEMENT
Para el método executeUpdate, una sentencia se
completa cuando se ejecuta. En los raros casos en que se llama al método
execute, de cualquier modo, no se completa hasta que los result sets o update
counts que se generan han sido devueltos.
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=?");
"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);
ps.setString(1, dni);
ps.setString(2, nombre);
ps.setInt(3, edad);
//Ejecutamos
el PreparedStatement, en este caso con executeQuery()
ResultSet rs= ps.executeQuery();
ResultSet rs= ps.executeQuery();
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();
String consulta = "SELECT usuario FROM registro WHERE email like ?";
PreparedStatement pstmt = con.prepareStatement(consulta);
pstmt.setString(1 , campoTexto.getText());
ResultSet resultado = ps.executeQuery();
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();
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();
Ejemplo de interfaz PreparedStatement que inserta
el registro
En primer lugar, crear la tabla que figura a
continuación:
crear tabla EMP (número de identificación ( 10 ), nombre varchar2 ( 50 ));
Ahora insertar registros en esta tabla por el
código que figura a continuación:
importar java.sql. *;
clase InsertPrepared {
públicas estáticas void principales (args String []) {
tratar {
Class.forName
( "oracle.jdbc.driver.OracleDriver" );
Conexión
con = DriverManager.getConnection ( "jdbc: oracle:
thin: @localhost: 1521: xe" , "sistema" , "Oracle" );
PreparedStatement
prop = con.prepareStatement ( "insertar en
los valores Vac (,)??" );
stmt.setInt
( 1 , 101 ); // 1 especifica el primer
parámetro de la consulta
stmt.setString
( 2 , "Ratan" );
int i = stmt.executeUpdate ();
System.out.println
(i + "registros insertados" );
con.close
();
} Catch (Exception e) {System.out.println (e);}
}
}
2 .
RESUMEN
Este interfaz, al igual que el
interfaz Statement, 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.
Uso de callablestatement El
último tipo de sentencias que podemos utilizar en JDBC son las sentencias
CallableStatement.
Este interfaz hereda del interfaz
PreparedStatement y ofrece la posibilidad de manejar parámetros de salida y de
realizar llamadas a procedimientos almacenados de la base de datos. Un
procedimiento almacenado se encuentra dentro de una base de datos; la llamada a
un procedimiento es lo que contiene un objeto CallableStatement.
3 SUMARY
This interface,
like the Statement interface, allows us to execute SQL statements over a
connection established with a database.
But in this case
we will execute more specialized SQL statements, these SQL statements are going
to be called precompiled SQL statements and will receive input parameters.
The
PreparedStatement interface inherits from the Statement interface and differs
from it in two ways:
• The
PreparedStatement instances contain SQL statements that have already been
compiled.
This is what
makes a "prepared" statement.
The SQL
statement that contains a PreparedStatement object may contain one or more
input parameters.
An input
parameter is one whose value is not specified when the statement is created,
instead the statement will have a question mark (?) For each input parameter.
Using callablestatement
The last type of statements we can use in JDBC are the CallableStatement
statements.
This interface
inherits from the PreparedStatement interface and offers the possibility of
handling output parameters and making calls to database stored procedures. A
stored procedure is inside a database; The call to a procedure is what a
CallableStatement object contains.
4 . RECOMENDACIONES
Usar al máximo sentencias de
base de datos precompiladas a través de la clase PreparedStatement cuando ejecute sentencias SQL. Esto
evita que la base de datos compile varias veces la misma consulta y agiliza le
ejecución de la sentencia.
Los
PreparedStatement, también está el tema de seguridad. Con PreparedStatement
evitamos tener que chequear y "escapar" los caracteres conflictivos
en las cadenas de texto que vamos a insertar en base de datos. Si vamos a
insertar un nombre de usuario que pedimos al usuario y a este se le ocurre
poner una comilla simple, por ejemplo "O’Donnell", podemos meterla
tal cual, en un PreparedStatement, pero necesitamos "escapar" la
comilla antes de usarla en un Statement.
5 . CONCLUSIONES
La definición de PreparedStatement dice que es una sentencia SQL precompilada para
ser ejecutada muchas veces. Pero al crear el PreparedStatement cada vez, se
está precompilando y ejecutando. Perdiendo completamente la ventaja en
rendimiento que supone el precompilado de una sentencia SQL. Hay algunos
manejadores que inclusive crean un procedimiento almacenado temporal, cada vez
que se crea un PreparedStatement.
Un objeto PreparedStatement es
potencialmente más eficiente que un objeto Statement porque este ha
sido precompilado y almacenado para su uso futuro.
6 . APRECIACION DEL EQUIPO
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.
7. GLOSARIO DE TERMINOS
Sentencias: son los elementos básicos en los que se divide el código en un
lenguaje de programación. Al fin y al cabo, un programa no es más
que un conjunto de sentencias que se ejecutan para realizar
una cierta tarea.
Parámetros: es una variable utilizada para recibir valores de entrada en
una rutina o subrutina. Dichos valores, que serán enviados desde la rutina
invocante, son llamados argumentos.
Interfaz: es un conjunto de subrutinas, funciones y procedimientos (o
métodos, en la programación orientada a objetos) que ofrece
cierta biblioteca para ser utilizado por otro software como una capa de
abstracción.
Sentencias compiladas: puede contener sentencias de control SQL y
sentencias SQL. Las sentencias SQL compuestas (compiladas) se pueden utilizar
para implementar la lógica de procedimiento a través de una secuencia de
sentencias SQL con un ámbito local para variables, condiciones, cursores y
manejadores.
DBMS: database management system que permiten
almacenar y posteriormente acceder a los datos de forma rápida y estructurada.
8 . LINKOGRAFIA