1. CONTENIDO.
1.1.
Definición.
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. Antes de ejecutarse la sentencia se debe especificar un
valor para cada uno de los parámetros a través de los métodos setXXX
apropiados. Estos métodos setXXX los añade el interfaz PreparedStatement.
Debido a que las sentencias
de los objetos PrepareStatement están precompiladas su ejecución será más
rápida que la de los objetos Statement. Por lo tanto, una sentencia SQL que va
a ser ejecutada varias veces se suele crear como un objeto PreparedStatement
para ganar en eficiencia. También se utilizará este tipo de sentencias para
pasarle parámetros de entrada a las sentencias SQL.
Al heredar del interfaz
Statement, el interfaz PreparedStatement hereda todas funcionalidades de
Statement. Además, añade una serie de métodos que permiten asignar un valor a
cada uno de los parámetros de entrada de este tipo de sentencias.
Los métodos execute(),
executeQuery() y executeUpdate() son sobrecargados y en esta versión, esdecir,
para los objetos PreparedStatement no toman ningún tipo de argumentos, de esta
forma, a estos métodos nunca se les deberá pasar por parámetro el objeto String
que representaba la sentencia SQL a ejecutar. En este caso, un objeto
PreparedStatement ya es una sentencia SQL por sí misma, adiferencia de lo que
ocurría con las sentencias Statement que poseían un significado sólo en el
momento en el que se ejecutaban.
Son muy útiles cuando una
sentencia SQL se ejecuta muchas veces cambiando sólo algunos valores.
· Se
utiliza para enviar sentencias SQL precompiladas 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().
1.1.1. El interfaz PreparedStatement.
A continuación se ofrece la
acostumbrada referencia rápida de los métodos del interfaz que nos ocupa.
· 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.
Como ya hemos adelantado el interfaz
PreparedStatement presenta una serie de métodos setXXX() que permiten asignar
valores a los parámetros de la sentencia SQL correspondiente.
Los distintos métodos setXXX() se muestran
a continuación, los argumentos comunes que presentan estos métodos es el índice
que indica el número de orden del parámetro y el valor que se le desea dar a ese
parámetro.
· void
setArray(int índiceParámetro, Array valor)
· void
setAsciiStream(int índiceParámetro, InputStream valor, int longitud)
· void
setBigDecimal(int índiceParámetro, BigDecimal valor)
· void
setBinaryStream(int índiceParámetro, InputStream valor, int longitud)
· void
setBlob(int índiceParámetro, Blob valor)
· void
setBoolean(int índiceParámetro, boolean valor)
1.1.2.
Creando
objetos PreparedStatement
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.
El objeto sentencia
contendrá la sentencia SQL indicada, la cual, ya ha sido enviada al DBMS y ya
ha sido preparada para su ejecución. En este caso se ha creado 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 =?");
1.1.2.
Utilizando
los parámetros de entrada
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. Por ejemplo, si el parámetro es de tipo
long, el método a utilizar será setLong().
El primer argumento de los
métodos setXXX es la posición ordinal del parámetro al que se le va a asignar
valor, y el segundo argumento es el valor a asignar. Por ejemplo el Código
fuente 109 crea un objeto PreparedStatement y acto seguido le asigna al primero
de sus parámetros un valor de tipo String y al segundo un valor de tipo int.
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(), aunque no es necesario llamar a
este método cuando se quieran modificar los parámetros de entrada, sino que al
lanzar los nuevos métodos setXXX los valores de los parámetros serán
reemplazados.
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();
}
Como ya se había comentado
anteriormente XXX en un método setXXX es un tipo de Java. Es implícitamente un
tipo JDBC (un tipo SQL genérico) ya que el driver transformará el tipo Java a
suvtipo JDBC correspondiente y acto seguido lo enviará a la base de datos. Así
por ejemplo, el siguiente fragmento asigna a un parámetro de entrada el valor
44 del tipo Java short:
sentencia.setShort(2,44);
El driver enviará 44 a la
base de datos como un SMALLINT de JDBC, que es la transformación estándar para
un short de Java. Se realiza la transformación inversa que realizaban los
métodos
getXXX.
Es responsabilidad del
programador asegurarse de que el tipo Java de cada parámetro de entrada se
corresponde con un tipo compatible JDBC que será esperado por la base de datos.
El programador puede
convertir explícitamente un parámetro de entrada a un tipo JDBC determinado
utilizando para ello el método setObject().
El driver transformará el
objeto de la clase Object al tipo JDBC específico antes de enviarlo a la base de
datos, si no se le indica el tipo JDBC el driver lo transformará al tipo JDBC
que le corresponda.
La diferencia entre el
método setObject() y los métodos setXXX es que los primeros realizan la
transformación de tipos Object de Java a tipos JDBC y los segundos de tipos de
Java a tipos de JDBC.
JDBC define una serie de
identificadores de tipos SQL genéricos en la clase java.sql.Types. Estos tipos
han sido diseñados para representar los tipos SQL más comunes. Normalmente
programando con JDBC se podrá referenciar tipos SQL genéricos usando estos
tipos de JDBC sin tener en cuenta el tipo SQL exacto.
La capacidad que posee el
método setObject() de aceptar cualquier objeto de Java permite que un programa
sea genérico y acepte parámetros de entrada en tiempo de ejecución. En esta
situación el tipo de objeto es desconocido en tiempo de compilación.
El método setNull() nos
permite enviar un JDBC NULL a la base de datos como un parámetro de entrada,
sin embargo, se debe especificar el tipo JDBC del parámetro.
En este caso la conversión
de tipos de datos se realiza al contrario que con los métodos getXXX del
interfaz ResultSet, la Tabla 7 muestra de conversión de tipos SQL genéricos o
tipos JDBC a tipos de datos de Java.
Tipos
Java
|
Tipos
JDBC
|
String
|
VARCHAR
or LONGVARCHAR
|
ava.math.BigDecimal
|
NUMERIC
|
boolean
|
BIT
|
byte
|
TINYINT
|
short
|
SMALLINT
|
int
|
INTEGER
|
long
|
BIGINT
|
float
|
REAL
|
double
|
DOUBLE
|
byte[]
|
VARBINARY,
LONGVARBINARY,
BINARY
|
java.sql.Date
|
DATE
|
java.sql.Time
|
TIME
|
ava.sql.Timestamp
|
TIMESTAMP
|
Clob
|
CLOB
|
Blob
|
BLOB
|
Array
|
ARRAY
|
Struct
|
STRUCT
|
Ref
|
REF
|
Clase
Java
|
JAVA_OBJECT
|
1.2.
Método executeUpdate
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.
1.3.
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
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. Esta llamada
está escrita con una sintaxis de escape, esta sintaxis puede tener dos formas
diferentes: una con un parámetro de resultado, es un tipo de parámetro de
salida que representa el valor devuelto por el procedimiento y otra sin ningún
parámetro de resultado. Ambas formas pueden tener un número variable de
parámetros de entrada, de salida o de entrada/salida. Una interrogación
representará al parámetro.
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}
1.3.2.
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 dosargumentos y no devuelve
resultados.
CallableStatement cstmt =
con.prepareCall(
"{call getTestData(?,
?)}");
donde los encajes ‘?’ son
parámetros IN, OUT ó INOUT dependiendo del
procedimiento getTestData.
1.4.
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();
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();
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();
Otro ejemplo:
ublic class InsertarDatos {
public static void main(String[] args) {
Connection con = null;
PreparedStatement stmt = null;
String sDriver = "com.mysql.jdbc.Driver";
String sURL = "jdbc:mysql://localhost:3306/lineadecodigo";
try{
Class.forName(sDriver).newInstance();
con = DriverManager.getConnection(sURL,"root","");
String sISBN = "84-9815-212-7";
String sTitulo = "Yo, Claudio";
String sDescripcion="Supuesta autobiografía de Claudio";
String sCategoria = "Novela Histórica";
int idAutor = 3;
stmt = con.prepareStatement("INSERT INTO libros VALUES
(?,?,?,?,?)");
stmt.setString(1,sISBN);
stmt.setInt(2,idAutor);
stmt.setString(3,sTitulo);
stmt.setString(4,sDescripcion);
stmt.setString(5,sCategoria);
int retorno = stmt.executeUpdate();
if (retorno>0)
System.out.println("Insertado correctamente");
}
catch (SQLException sqle){
System.out.println("SQLState: "
+ sqle.getSQLState());
System.out.println("SQLErrorCode: "
+ sqle.getErrorCode());
sqle.printStackTrace();
}
catch (Exception e){
e.printStackTrace();
}
finally {
if (con != null) {
try{
stmt.close();
con.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
}
}
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.
2. RECOMENDACIONES.
Para poder ejecutar un
objeto PreparedStatement, primero hay que establecer un valor en cada uno de
los marcadores de parámetro. El objeto PreparedStatement proporciona varios
métodos para establecer parámetros. Todos ellos tienen el formato
set<Tipo>, siendo <Tipo> un tipo de datos Java. Ejemplos de estos
métodos son setInt, setLong, setString, setTimestamp y setBlob.
se recomienda usar PreparedStatement por que representan sentencias SQL que se pueden
preparar, o precompilar, una sola vez para la ejecución y luego se pueden
ejecutar múltiples veces. Los marcadores de parámetro, representados mediante
el signo "?" en la serie SQL, permiten especificar en la
sentencia valores de entrada que pueden variar en el momento de la ejecución.
Se utiliza el método prepareStatement() de Connection para crear nuevos objetos PreparedStatement. A diferencia de lo que sucedía con los objetos Statement, la sentencia SQL se suministra en el momento de crear el objeto PreparedStatement. En ese momento, se precompila la sentencia SQL.
Se utiliza el método prepareStatement() de Connection para crear nuevos objetos PreparedStatement. A diferencia de lo que sucedía con los objetos Statement, la sentencia SQL se suministra en el momento de crear el objeto PreparedStatement. En ese momento, se precompila la sentencia SQL.
4. CONCLUCIONES.
Se ha concluido que
PreparedStatement 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. 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.
Tambien se a concluido acerca del Uso de
callablestatement ofrece la posibilidad de manejar parámetros de salida y 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
5. APRECIACION
DEL EQUIPO.
Al
realizar este trabajo se ha entendido acerca de cómo y cuándo usar preparedstetment también se ha comprendido que
para enviar sentencias sql no solo existe un método sino muchos más así como es
CallableStatement que es el último tipo de sentencias que
podemos utilizar en JDBC.se ha entendido que como en el mundo de la programación
es como la vida real que los hijos heredan genes de los padres así como la
interfaz de PreparedStatement hereda de
la interfaz de Statement y Callable statement hereda de preparedStatement.
6. 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.
DDL
de SQL: s
un lenguaje proporcionado por el sistema de gestión de base de datos que
permite a los usuarios de la misma llevar a cabo las tareas de definición de
las estructuras que almacenarán los datos así como de los procedimientos o
7. BIBLIOGRAFIA.
Si quieren ver las diapositivas de este trabajo
aquie les dejo la direccion para que lo
visualicen
