BAGUA GRANDE 06 DE DICIEMBRE DEL 2016 |
PREPAREDSTATEMENT
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.
Se utiliza el método prepareStatement() de Connection para crear nuevos objetos PreparedStatement.
Se utiliza el método prepareStatement() de Connection para crear nuevos objetos PreparedStatement.
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.
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.
6. GLOSARIO DE
TERMINOS.
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.
DBMS: database management system que
permiten almacenar y posteriormente acceder a los datos de forma rápida y
estructurada.
LINK DE LA DIAPOSITIVA ... AQUI ..
7. BIBLIOGRAFIA.
http://seduca.uaemex.mx/material/LIA/POO/materiales/PreparedStatement.htmlhttp:// www.forosdelweb.com/f45/diferencias-entre-preparestatement-statement- 612469/
http://www.vc.ehu.es/jiwotvim/ISOFT2009-2010/Teoria/BloqueIV/JDBC.pdf
http://www.euskalnet.net/jaoprogramador/j2ee/JDBC/jdbc25.htm
http://www.vc.ehu.es/jiwotvim/ISOFT2009-2010/Teoria/BloqueIV/JDBC.pdf
http://www.euskalnet.net/jaoprogramador/j2ee/JDBC/jdbc25.htm
No hay comentarios:
Publicar un comentario