“AÑO DE CONSOLIDACIÓN DEL MAR DE GRAU”
ESCUELA PROFESIONAL DE:
INGENIERÍA
DE SISTEMAS Y TELEMÁTICA
TEMA: PREPAREDSTATEMENT
DOCENTE: MARCO AURELIO PORRO CHULLI.
ASIGNATURA: DESARROLLO DE SOFTWARE l
NOMBRE DEL GRUPO:
“JAVA”
INTEGRANTES:
MALDONADO IDROGO BETZABETH YAMELI
PÉREZ SAUCEDO YORDIN ALBERTO
CICLO: V
GRUPO: “B”
AÑO: 2016
BAGUA GRANDE-UTCUBAMBA
Tema: PREPAREDSTATEMENT
Contenido

PreparedStatement nos
permite definir una sentencia SQL base, que nos sirve para
modificar/insertar/buscar uno o varios registros con sólo cambiar los valores
de los parámetros que especifiquemos.
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.

Ejecuta la instrucción SQL
determinada, que puede ser una instrucción INSERT, UPDATE o DELETE; o una
instrucción SQL que no devuelve nada, como una instrucción DDL de SQL. Desde el
controlador JDBC 3.0 de MicrosoftSQL Server, executeUpdate devolverán el número
correcto de filas actualizado en una operación MERGE.
Sintaxis:
public int executeUpdate(java.lang.String
sql)
Parámetros
sql
Un objeto String que
contiene la instrucción SQL.
Valor devuelto
Un valor int que
indica el número de filas afectadas o 0 si se usa una instrucción DDL.
Puede utilizar el
método Statement.executeUpdate para realizar las acciones siguientes:
Ejecutar
sentencias de definición de datos, tales como CREATE, ALTER, DROP, GRANT y
REVOKE
Ejecutar
sentencias INSERT, UPDATE, DELETE y MERGE que no contienen marcadores de
parámetros.
Con IBM® Data
Server Driver for JDBC and SQLJ, ejecutar la sentencia CALL para invocar
procedimientos almacenados que carecen de parámetros y no devuelven conjuntos
de resultados.
Procedimiento
Para ejecutar esas
sentencias de SQL, debe seguir estos pasos:
Invoque el método
Connection.createStatement para crear un objeto Statement.
Invoque el método
Statement.executeUpdate para ejecutar la operación de SQL.
Invoque el método
Statement.close para cerrar el objeto Statement.

Un objeto CallableStatement provee de una
forma estándar de llamar a procedimientos almacenados de la base de datos. Un
procedimiento almacenado se encuentra en la base de datos. La llamada al
procedimiento es lo que contiene el objeto CallableStatement. Esta llamada se
escribe en una sintaxis de escape que puede tomar una de dos formas: una
formato con un parámetro resultado y el otro sin el. (Ver la sección 4 para mas
información sobre la sintaxis de escape). Un parámetro resultado, un tipo de
parámetro OUT, es el valor devuelto por el procedimiento almacenado. Ambos
formatos pueden tener un número variable de parámetros de entrada (parámetros
IN), de salida (parámetros OUT) o ámbos (parámetros INOUT). Un interrogante
sirve como ‘anclaje’ para cada parámetro.
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.
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.
Parámetros IN y OUT
El paso de valor para cualquier parámetro IN
de un objeto CallableStatement se realiza mediante los métodos setXXX heredados
de PreparedStatement. El tipo de el valor a pasar se determina por el método
setXXX a usar (setFloat para pasar un valor float, y así).
Si el procedimiento almacenado devuelve
parámetros OUT, el tipo JDBC de cada parámetro OUT debe ser registrado antes de
que el objeto CallableStatement sea ejecutado (Esto es necesario porque algunas
DBMS necesitan el tipo JDBC). El registro del tipo JDBC se realiza mediante el
método registerOutParameters. Después que la sentencia ha sido ejecutada, los
métodos getXXX de CallableStatement recuperan los valores de los parámetros. El
método correcto getXXX a usar es el tipo Java que corresponde al tipo JDBC
registrado para el parámetro. En otras palabras registerOutParameter usa un
tipo JDBC (por tanto coincide con el tipo con el tipo JDBC que la base de datos
devolverá) y getXXX ‘casts’ este a un tipo Java.
Para ilustrar esto, el siguiente ejemplo
registra los parámetros OUT, ejecuta el procedimiento almacenado llamado por
cstmt y recupera los valores devueltos en los parámetros OUT. El método getByte
recupera un byte Java de el primer parámetro, y getBigDecimal recupera un
objeto BigDecimal (con tres dígitos después del punto decimal) del segundo
parámetro OUT:
CallableStatement cstmt = con.prepareCall(
"{call getTestData(?, ?)}");
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.registerOutParameter(2,
java.sql.Types.DECIMAL, 3);
cstmt.executeQuery();
byte x = cstmt.getByte(1);
java.math.BigDecimal n =
cstmt.getBigDecimal(2, 3);
De modo distinto a ResultSet,
CallableStatement no tiene un mecanismo especial para recuperar grandes valores
OUT incrementalmente.

Un ejemplo típico es:
PreparedStatement pstmt =
con.prepareStatement(
"update empleado set sueldo = ? where
id_empleado = ?");
pstmt.setDouble(1, 153833.00);
pstmt.setInt(2, 110592);
Esto nos permite tener una sentencia SQL de
fácil lectura y sin tener que concatenar cadenas o hacer conversiones de tipos.
De la documentación de java:
An object that represents a precompiled SQL
statement.
A SQL statement is precompiled and stored in a
PreparedStatement object. This object can then be used to efficiently execute
this statement multiple times.
Supongamos que tenemos un mapa de empleados y
sueldos:
Map<Integer, Double> empleadoSueldo =
new HashMap<>();
empleadoSueldo.put(1, 1000.0);
empleadoSueldo.put(2, 2000.0);
empleadoSueldo.put(3, 3000.0);
Es muy común ver un código como el siguiente:
for(Map.Entry<Integer, Double> empleado
: empleadoSueldo.entrySet()) {
PreparedStatement pstmt = con.prepareStatement(
"update empleado set sueldo = ? where id_empleado = ?");
pstmt.setDouble(1, empleado.getValue());
pstmt.setInt(2, empleado.getKey());
pstmt.executeUpdate();
}
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.
Para aprovechar el precompilado, el código
debe cambiar a:
PreparedStatement pstmt = con.prepareStatement(
"update empleado set sueldo = ? where id_empleado = ?");
for(Map.Entry<Integer, Double> empleado : empleadoSueldo
.entrySet()) {
pstmt.setDouble(1, empleado.getValue());
pstmt.setInt(2, empleado.getKey());
pstmt.executeUpdate();
}
Así el SQL es interpretado una sola vez por el
manejador de base de datos, y de ahí en adelante sólo se ocupa de colocar
parámetros y ejecutar.
Ejemplo
Suponga que desea ejecutar esta sentencia de
SQL:
UPDATE EMPLOYEE SET PHONENO='4657' WHERE
EMPNO='000010'
El código siguiente crea el
objeto Statement denominado stmt, ejecuta la sentencia UPDATE y
devuelve en numUpd el número de filas que fueron actualizadas. Los
números que aparecen a la derecha de algunas sentencias corresponden a los
pasos descritos anteriormente.
Utilización de
Statement.executeUpdateConnection con;
Statement stmt;
int numUpd;
…
stmt = con.createStatement(); // Crear un objeto Statement 1
numUpd = stmt.executeUpdate("UPDATE
EMPLOYEE SET PHONENO='4657' WHERE EMPNO='000010'");
//
Ejecutar la actualización 2
stmt.close(); // Cerrar el
objeto Statement 3
1.
Resumen
Definición:
PreparedStatement nos
permite definir una sentencia SQL base, que nos sirve para
modificar/insertar/buscar uno o varios registros con sólo cambiar los valores
de los parámetros que especifiquemos.
Método executeUpdate()
Ejecuta la instrucción SQL
determinada, que puede ser una instrucción INSERT, UPDATE o DELETE; o una
instrucción SQL que no devuelve nada, como una instrucción DDL de SQL.
Uso de Callable Statement
Un objeto CallableStatement provee
de una forma estándar de llamar a procedimientos almacenados de la base de
datos. Esta
llamada se escribe en una sintaxis de escape que puede tomar una de dos formas:
un formato con un parámetro resultado y el otro sin él.
2.Summary
Definition:
PreparedStatement
allows us to define a base SQL statement, which allows us to modify / insert /
search one or more records by simply changing the values of the parameters we
specify.
ExecuteUpdate () method
Execute
the given SQL statement, which can be an INSERT, UPDATE or DELETE statement; Or
an SQL statement that does not return anything, such as a SQL DDL statement.
Callable Use Statement
A
CallableStatement object provides a standard way of calling stored procedures
from the database. This call is written in an escape syntax that can take one
of the forms: One form with one result of the parameter and the other without
it.
3.
Recomendaciones
Un objeto
PreparedStatement es necesario usar para ejecutar sentencias SQL precompiladas
con o sin parámetros IN.
Un objeto
CallableStatement se usa para ejecutar un procedimiento de base de datos
almacenado.
En EJBs marcar como transaccionales únicamente
los métodos necesarios.
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.
4.
Conclusiones
Como hemos visto la interfaz
CallableStatements nos permite ejecutar procedimientos almacenados e interactuar
con el resultado de una manera rápida y sencilla posicionándose como una buena
opción a la hora de trabajar con procedimientos almacenados. Espero que les
sirva de utilidad, hasta próximos tutoriales.
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.
5.
Apreciación del Equipo
Si la base de
datos soporta prepared statement y el driver/conector que
usemos para hablar con esa base de datos desde java los
soporta también, entonces podemos usar los prepared statement desde java.
6.
Glosario de Términos
DDL: Un Data Definition Language
o Lenguaje de descripción de datos (DDL)
es un lenguaje de programación para definir estructuras de datos.
ALTER: Utilice la instrucción ALTER JAVA para forzar la
resolución de un objeto de esquema de clase Java o la compilación de un objeto
de esquema de origen Java. (No puede llamar a los métodos de una clase Java
antes de que todas sus referencias externas a nombres Java estén asociadas con
otras clases.)
IN y OUT: Esta funcionalidad permite definir el tipo de
pasaje de parámetros, pudiendo elegir entre uno de los siguientes valores:
entrada (in), salida (out) o entrada/salida (inout). El
valor por defecto será inout.
7.
Linkografia
http://www.euskalnet.net/jaoprogramador/j2ee/JDBC/jdbc25.htm
DIAPOSITIVAS: http://es.slideshare.net/YordinAlbertoPrezSau/prepared-statement-69990980
FORO: http://www.forosperu.net/temas/prepared-statement.1011012/
VIDEO:
DIAPOSITIVAS: http://es.slideshare.net/YordinAlbertoPrezSau/prepared-statement-69990980
FORO: http://www.forosperu.net/temas/prepared-statement.1011012/
VIDEO:
No hay comentarios:
Publicar un comentario