“AÑO DE CONSOLIDACIÓN DEL MAR DE GRAU”
ESCUELA PROFESIONAL DE:INGENIERÍA DE SISTEMAS Y TELEMÁTICATEMA: PREPAREDSTATEMENTDOCENTE: MARCO AURELIO PORRO CHULLI.ASIGNATURA: DESARROLLO DE SOFTWARE lNOMBRE DEL GRUPO: “JAVA”INTEGRANTES:· MALDONADO IDROGO BETZABETH YAMELI· PÉREZ SAUCEDO YORDIN ALBERTOCICLO: VGRUPO: “B”AÑO: 2016BAGUA GRANDE-UTCUBAMBA
1.
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
2.
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.
3.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.
4.
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.
5.
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.
6.
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 y java los soporta también, entonces podemos usar
los prepared statement desde java).
7.
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.
8.
Linkografia
10. Video: https://www.youtube.com/watch?v=MWs-YwgE7Qc
11. Diapositivas: http://es.slideshare.net/YameliMaldonadoIdrog/prepared-statement-69991448



