SlideShare una empresa de Scribd logo
1 de 13
PREPAREDSTATEMENT:
DEFINICIÓN:
El 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 definición de PreparedStatement 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.
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
PreparedStatement, un objeto de este tipo se usa para
sentencias SQL que se toman uno o más parámetros
como argumentos de entrada.
Son muy útiles cuando una sentencia SQL se ejecuta muchas veces cambiando solo de 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.
Prepared Statement 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 del preparedStatement se extienden, es
decir heredan del 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.
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. 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) .
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: un formato con un parámetro resultado y el otro sin él. 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.
USO DE CALLABLESTATEMENT:
Crear
objetos
CallableSta
tement:
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.
CallableStateme
nt 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
PreparedStatemen
t. El tipo del valor a
pasar se
determina por el
método setXXX a
usar (setFloat para
pasar un valor
float, y así).
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 del
primer parámetro, y getBigDecimal recupera un objeto BigDecimal (con tres dígitos después del punto decimal) del
segundo parámetro OUT:
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.
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.
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.
Parámetros
INOUT:
Son parámetros que
suministran entradas así como
aceptan salidas. Estos
requieren llamar a los métodos
apropiados setXXX (heredados
de PreparedStatement)
además de llamar al método
registerOutParameter. Los
métodos setXXX fijan los
valores como parámetros de
entrada y registerOutParameter
registra sus tipos JDBC como
parámetros de salida. El
método setXXX suminstra un
valor Java que el driver
convierte en un valor JDBC
antes de enviarlo a la base de
datos.
El tipo JDBC del valor IN y el tipo JDBC para suminstrado al método registerOutParameter
debe ser el mismo. Luego, para recuperar el valor de salida, se usa el método apropiado
getXXX. Por ejemplo, un parámetro cuyo tipo Java es byte debería usar el método setByte
para asignar el valor de entrada, debería suplir un TINYINT como tipo JDBC para
registerOutParameter, y debería usar getByte para recuperar el valor de salida (Sección 8,
da más información y contiene tablas de tipos mapeados).
El siguiente ejemplo asume que existe un procedimiento almacenado reviseTotal con un
único parámetro INOUT. El método setByte fija el valor del parámetro a 25 que es el que el
driver enviará a la base de datos como un JDBC TINYINT. Después registerOutParameter
registrará el parámetro como un JDBC TINYINT. Luego que el procedimiento sea ejecutado
se devolverá un nuevo JDBC TINYINT y el método getByte lo recuperará como un nuevo
valor byte Java.
CallableStatement cstmt = con.prepareCall(
"{call reviseTotal(?)}");
cstmt.setByte(1, 25);
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.executeUpdate();
byte x = cstmt.getByte(1);
Recuperar parámetros OUT después de resultados.
Dadas las limitaciones impuestas por algunas DBMS, se recomienda en aras de la máxima portabilidad, que todos
los resultados generados por la ejecución de un objeto CallableStatement deberían recuperarse antes que los
parámetros OUT usando los métodos CallableStatement.getXXX.
Si un objeto CallableStatement devuelve múltiples objetos ResultSet (mediante una llamada al método execute),
todos los resultados deben recuperarse antes que los parámetros OUT. En este caso, debe asegurarse de que
todos los resultados han sido accedidos, los métodos de Statement getResultSet, getUpdateCount y
getMoreResults necesitan ser llamados hasta que no haya más resultados.
Después de hecho esto, los valores de los parámetros OUT pueden ser recuperados mediante los métodos
CallableStatement.getXXX.
Recuperar valores NULL en parámetros OUT:
El valor devuelto en un parámetro OUT puede ser JDBC NULL. Cuando esto ocurre, le valor JDBC NULL se
convertirá de forma que el valor devuelto por el método getXXX sea null, 0 o false dependiendo del tipo del método
getXXX usado. Como con los objetos ResultSet, la única manera de saber si un valor de 0 o false fue originalmente
NULL JDBC es testear el método wasNull, que devuelve true si el último valor leído por un método getXXX fue
JDBC NULL y false en caso contrario. La sección 5 contiene más información al respecto.
EJEMPLO:
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:
Objeto que representa una instrucción SQL precompilada. Una instrucción SQL se precompila y se almacena en un objeto
PreparedStatement. Este objeto puede utilizarse para ejecutar esta sentencia de forma eficiente varias veces.
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);
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();

Más contenido relacionado

La actualidad más candente

Analisis Y DiseñO Orientado A Objetos
Analisis Y DiseñO Orientado A ObjetosAnalisis Y DiseñO Orientado A Objetos
Analisis Y DiseñO Orientado A Objetosyoiner santiago
 
Conclusiones sobre base de datos
Conclusiones sobre base de datos Conclusiones sobre base de datos
Conclusiones sobre base de datos yeisonarley17
 
Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.Giancarlo Aguilar
 
Programación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaProgramación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaAngel Vázquez Patiño
 
Programación Orientada a Objetos en JAVA
Programación Orientada a Objetos en JAVAProgramación Orientada a Objetos en JAVA
Programación Orientada a Objetos en JAVAMichelle Torres
 
ENTRADA Y SALIDA DE DATOS EN JAVA
ENTRADA Y SALIDA DE DATOS EN JAVAENTRADA Y SALIDA DE DATOS EN JAVA
ENTRADA Y SALIDA DE DATOS EN JAVAGabriel Suarez
 
Reporte metodos de busqueda y ordenamiento
Reporte metodos de busqueda y ordenamientoReporte metodos de busqueda y ordenamiento
Reporte metodos de busqueda y ordenamientoTAtiizz Villalobos
 
Metodologías Para AnáLisis Y DiseñO Orientado A Objetos
Metodologías Para AnáLisis Y DiseñO Orientado A ObjetosMetodologías Para AnáLisis Y DiseñO Orientado A Objetos
Metodologías Para AnáLisis Y DiseñO Orientado A Objetoshector_h30
 
Requerimiento funcional y no funcional
Requerimiento funcional y no funcional Requerimiento funcional y no funcional
Requerimiento funcional y no funcional CristobalFicaV
 

La actualidad más candente (20)

Modelo entidad
Modelo entidadModelo entidad
Modelo entidad
 
Analisis Y DiseñO Orientado A Objetos
Analisis Y DiseñO Orientado A ObjetosAnalisis Y DiseñO Orientado A Objetos
Analisis Y DiseñO Orientado A Objetos
 
Conclusiones sobre base de datos
Conclusiones sobre base de datos Conclusiones sobre base de datos
Conclusiones sobre base de datos
 
Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.
 
Clases y objetos en Java
Clases y objetos en JavaClases y objetos en Java
Clases y objetos en Java
 
Ejemplos acid
Ejemplos acidEjemplos acid
Ejemplos acid
 
Listas doblemente enlazadas
Listas doblemente enlazadasListas doblemente enlazadas
Listas doblemente enlazadas
 
Programación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaProgramación 3: Clases y objetos en Java
Programación 3: Clases y objetos en Java
 
Programación 3: listas enlazadas
Programación 3: listas enlazadasProgramación 3: listas enlazadas
Programación 3: listas enlazadas
 
16 Curso de POO en java - arreglos unidimensionales
16 Curso de POO en java - arreglos unidimensionales16 Curso de POO en java - arreglos unidimensionales
16 Curso de POO en java - arreglos unidimensionales
 
Programación Orientada a Objetos en JAVA
Programación Orientada a Objetos en JAVAProgramación Orientada a Objetos en JAVA
Programación Orientada a Objetos en JAVA
 
Modelo relacional
Modelo relacionalModelo relacional
Modelo relacional
 
Ejercicios normalizacion
Ejercicios normalizacionEjercicios normalizacion
Ejercicios normalizacion
 
Pilas y colas
Pilas y colasPilas y colas
Pilas y colas
 
ENTRADA Y SALIDA DE DATOS EN JAVA
ENTRADA Y SALIDA DE DATOS EN JAVAENTRADA Y SALIDA DE DATOS EN JAVA
ENTRADA Y SALIDA DE DATOS EN JAVA
 
Reporte metodos de busqueda y ordenamiento
Reporte metodos de busqueda y ordenamientoReporte metodos de busqueda y ordenamiento
Reporte metodos de busqueda y ordenamiento
 
Metodologías Para AnáLisis Y DiseñO Orientado A Objetos
Metodologías Para AnáLisis Y DiseñO Orientado A ObjetosMetodologías Para AnáLisis Y DiseñO Orientado A Objetos
Metodologías Para AnáLisis Y DiseñO Orientado A Objetos
 
Procedimientos almacenados
Procedimientos almacenadosProcedimientos almacenados
Procedimientos almacenados
 
Requerimiento funcional y no funcional
Requerimiento funcional y no funcional Requerimiento funcional y no funcional
Requerimiento funcional y no funcional
 
Bases de datos orientadas a objetos
Bases de datos orientadas a objetosBases de datos orientadas a objetos
Bases de datos orientadas a objetos
 

Destacado

Jdbc session02
Jdbc session02Jdbc session02
Jdbc session02Niit Care
 
Actividades de quimica bloque ii
Actividades de quimica bloque iiActividades de quimica bloque ii
Actividades de quimica bloque iisec32
 
SUNY BROOME Veterans & Affairs
SUNY BROOME Veterans & AffairsSUNY BROOME Veterans & Affairs
SUNY BROOME Veterans & AffairsYanika Francis
 
igual a igual fotonovela
igual a igual fotonovelaigual a igual fotonovela
igual a igual fotonovelanatt27
 
Realidad aumentada
Realidad aumentada Realidad aumentada
Realidad aumentada Ximena Lopez
 
La ensenanza de la ciencia
La ensenanza de la cienciaLa ensenanza de la ciencia
La ensenanza de la cienciaJHONYLIBREROS
 
La sostenibilidad y la revolución energética
La sostenibilidad y la revolución energéticaLa sostenibilidad y la revolución energética
La sostenibilidad y la revolución energéticaNoelia del Valle Nebiolo
 
La historia de steven jobs
La historia de steven jobsLa historia de steven jobs
La historia de steven jobsgeannalmar
 
Scientometric analysis of contributions to the journal college and research l...
Scientometric analysis of contributions to the journal college and research l...Scientometric analysis of contributions to the journal college and research l...
Scientometric analysis of contributions to the journal college and research l...Ghouse Modin Mamdapur
 
Teoria d escalas
Teoria d escalasTeoria d escalas
Teoria d escalas123456fredy
 

Destacado (18)

Jdbc session02
Jdbc session02Jdbc session02
Jdbc session02
 
preparedStatement
preparedStatementpreparedStatement
preparedStatement
 
Nematelmintos
NematelmintosNematelmintos
Nematelmintos
 
Actividades de quimica bloque ii
Actividades de quimica bloque iiActividades de quimica bloque ii
Actividades de quimica bloque ii
 
SUNY BROOME Veterans & Affairs
SUNY BROOME Veterans & AffairsSUNY BROOME Veterans & Affairs
SUNY BROOME Veterans & Affairs
 
O que é o Dispensacionalismo!
O que é o Dispensacionalismo!O que é o Dispensacionalismo!
O que é o Dispensacionalismo!
 
igual a igual fotonovela
igual a igual fotonovelaigual a igual fotonovela
igual a igual fotonovela
 
Realidad aumentada
Realidad aumentada Realidad aumentada
Realidad aumentada
 
Farewell
FarewellFarewell
Farewell
 
La ensenanza de la ciencia
La ensenanza de la cienciaLa ensenanza de la ciencia
La ensenanza de la ciencia
 
6
66
6
 
La sostenibilidad y la revolución energética
La sostenibilidad y la revolución energéticaLa sostenibilidad y la revolución energética
La sostenibilidad y la revolución energética
 
Yeli.an
Yeli.anYeli.an
Yeli.an
 
Art05 huerta
Art05 huertaArt05 huerta
Art05 huerta
 
Kelemen gábor t1sepm
Kelemen gábor t1sepmKelemen gábor t1sepm
Kelemen gábor t1sepm
 
La historia de steven jobs
La historia de steven jobsLa historia de steven jobs
La historia de steven jobs
 
Scientometric analysis of contributions to the journal college and research l...
Scientometric analysis of contributions to the journal college and research l...Scientometric analysis of contributions to the journal college and research l...
Scientometric analysis of contributions to the journal college and research l...
 
Teoria d escalas
Teoria d escalasTeoria d escalas
Teoria d escalas
 

Similar a PreparedStatement: Sentencia SQL precompilada (20)

Preparedstatement
PreparedstatementPreparedstatement
Preparedstatement
 
Preparedstatemet
PreparedstatemetPreparedstatemet
Preparedstatemet
 
Prepared statement
Prepared statementPrepared statement
Prepared statement
 
Prepared statement
Prepared statementPrepared statement
Prepared statement
 
Ayuda la clase statement
Ayuda la clase statementAyuda la clase statement
Ayuda la clase statement
 
ee
eeee
ee
 
Statement
StatementStatement
Statement
 
Statement
StatementStatement
Statement
 
Statement
StatementStatement
Statement
 
Preparedstatemet
Preparedstatemet Preparedstatemet
Preparedstatemet
 
Preparestatement
PreparestatementPreparestatement
Preparestatement
 
PREPAREDSTATEMENT
PREPAREDSTATEMENTPREPAREDSTATEMENT
PREPAREDSTATEMENT
 
Statement
StatementStatement
Statement
 
Prepared Statement
Prepared StatementPrepared Statement
Prepared Statement
 
Prepared statement
Prepared statementPrepared statement
Prepared statement
 
Statement
StatementStatement
Statement
 
Statement
StatementStatement
Statement
 
Bases de Datos con JDBC para MySQL
Bases de Datos con JDBC para MySQLBases de Datos con JDBC para MySQL
Bases de Datos con JDBC para MySQL
 
Objeto prepared statement
Objeto prepared statementObjeto prepared statement
Objeto prepared statement
 
Prepared statement
Prepared statementPrepared statement
Prepared statement
 

Más de Lisbeth Ocaña Bueno (20)

OLAP - Procesamiento Analítico en Línea.
OLAP - Procesamiento Analítico en Línea.OLAP - Procesamiento Analítico en Línea.
OLAP - Procesamiento Analítico en Línea.
 
COPIA DE SEGURIDAD Y RESTAURACIÓN.
COPIA DE SEGURIDAD Y RESTAURACIÓN.COPIA DE SEGURIDAD Y RESTAURACIÓN.
COPIA DE SEGURIDAD Y RESTAURACIÓN.
 
TRANSACCIONES
TRANSACCIONESTRANSACCIONES
TRANSACCIONES
 
TRIGGERS O DISPARADORES
TRIGGERS O DISPARADORESTRIGGERS O DISPARADORES
TRIGGERS O DISPARADORES
 
CURSORES EN SQL SERVER
CURSORES EN SQL SERVERCURSORES EN SQL SERVER
CURSORES EN SQL SERVER
 
PROCEDIMIENTOS ALMACENADOS
PROCEDIMIENTOS ALMACENADOSPROCEDIMIENTOS ALMACENADOS
PROCEDIMIENTOS ALMACENADOS
 
Comandos DDL
Comandos DDLComandos DDL
Comandos DDL
 
VISTAS
VISTASVISTAS
VISTAS
 
LENGUAJE TRANSACT - SQL
LENGUAJE TRANSACT - SQLLENGUAJE TRANSACT - SQL
LENGUAJE TRANSACT - SQL
 
Ejecutables en Netbeans
Ejecutables en NetbeansEjecutables en Netbeans
Ejecutables en Netbeans
 
REPORTES
REPORTESREPORTES
REPORTES
 
Objeto sqlcommand
Objeto sqlcommandObjeto sqlcommand
Objeto sqlcommand
 
OBJETO CONNECTION
OBJETO CONNECTIONOBJETO CONNECTION
OBJETO CONNECTION
 
ESPACIO DE NOMBRES SYSTEM.DATA.SQLCLIENT
ESPACIO DE NOMBRES SYSTEM.DATA.SQLCLIENTESPACIO DE NOMBRES SYSTEM.DATA.SQLCLIENT
ESPACIO DE NOMBRES SYSTEM.DATA.SQLCLIENT
 
Ado.net
Ado.netAdo.net
Ado.net
 
Gestor de Base de Datos.
Gestor de Base de Datos.Gestor de Base de Datos.
Gestor de Base de Datos.
 
Programación orientada a objetos
Programación orientada a objetosProgramación orientada a objetos
Programación orientada a objetos
 
Aplicaciones n capas en visual.net
Aplicaciones n capas en visual.netAplicaciones n capas en visual.net
Aplicaciones n capas en visual.net
 
JTABLE
JTABLEJTABLE
JTABLE
 
RESULTSET
RESULTSETRESULTSET
RESULTSET
 

PreparedStatement: Sentencia SQL precompilada

  • 1.
  • 2. PREPAREDSTATEMENT: DEFINICIÓN: El 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 definición de PreparedStatement 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.
  • 3. 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 PreparedStatement, un objeto de este tipo se usa para sentencias SQL que se toman uno o más parámetros como argumentos de entrada.
  • 4. Son muy útiles cuando una sentencia SQL se ejecuta muchas veces cambiando solo de 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. Prepared Statement 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 del preparedStatement se extienden, es decir heredan del 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.
  • 5. 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. 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) .
  • 6. 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: un formato con un parámetro resultado y el otro sin él. 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. USO DE CALLABLESTATEMENT:
  • 7. Crear objetos CallableSta tement: 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. CallableStateme nt 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 PreparedStatemen t. El tipo del valor a pasar se determina por el método setXXX a usar (setFloat para pasar un valor float, y así).
  • 8. 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 del primer parámetro, y getBigDecimal recupera un objeto BigDecimal (con tres dígitos después del punto decimal) del segundo parámetro OUT: 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. 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.
  • 9. 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. Parámetros INOUT: Son parámetros que suministran entradas así como aceptan salidas. Estos requieren llamar a los métodos apropiados setXXX (heredados de PreparedStatement) además de llamar al método registerOutParameter. Los métodos setXXX fijan los valores como parámetros de entrada y registerOutParameter registra sus tipos JDBC como parámetros de salida. El método setXXX suminstra un valor Java que el driver convierte en un valor JDBC antes de enviarlo a la base de datos.
  • 10. El tipo JDBC del valor IN y el tipo JDBC para suminstrado al método registerOutParameter debe ser el mismo. Luego, para recuperar el valor de salida, se usa el método apropiado getXXX. Por ejemplo, un parámetro cuyo tipo Java es byte debería usar el método setByte para asignar el valor de entrada, debería suplir un TINYINT como tipo JDBC para registerOutParameter, y debería usar getByte para recuperar el valor de salida (Sección 8, da más información y contiene tablas de tipos mapeados). El siguiente ejemplo asume que existe un procedimiento almacenado reviseTotal con un único parámetro INOUT. El método setByte fija el valor del parámetro a 25 que es el que el driver enviará a la base de datos como un JDBC TINYINT. Después registerOutParameter registrará el parámetro como un JDBC TINYINT. Luego que el procedimiento sea ejecutado se devolverá un nuevo JDBC TINYINT y el método getByte lo recuperará como un nuevo valor byte Java. CallableStatement cstmt = con.prepareCall( "{call reviseTotal(?)}"); cstmt.setByte(1, 25); cstmt.registerOutParameter(1, java.sql.Types.TINYINT); cstmt.executeUpdate(); byte x = cstmt.getByte(1);
  • 11. Recuperar parámetros OUT después de resultados. Dadas las limitaciones impuestas por algunas DBMS, se recomienda en aras de la máxima portabilidad, que todos los resultados generados por la ejecución de un objeto CallableStatement deberían recuperarse antes que los parámetros OUT usando los métodos CallableStatement.getXXX. Si un objeto CallableStatement devuelve múltiples objetos ResultSet (mediante una llamada al método execute), todos los resultados deben recuperarse antes que los parámetros OUT. En este caso, debe asegurarse de que todos los resultados han sido accedidos, los métodos de Statement getResultSet, getUpdateCount y getMoreResults necesitan ser llamados hasta que no haya más resultados. Después de hecho esto, los valores de los parámetros OUT pueden ser recuperados mediante los métodos CallableStatement.getXXX. Recuperar valores NULL en parámetros OUT: El valor devuelto en un parámetro OUT puede ser JDBC NULL. Cuando esto ocurre, le valor JDBC NULL se convertirá de forma que el valor devuelto por el método getXXX sea null, 0 o false dependiendo del tipo del método getXXX usado. Como con los objetos ResultSet, la única manera de saber si un valor de 0 o false fue originalmente NULL JDBC es testear el método wasNull, que devuelve true si el último valor leído por un método getXXX fue JDBC NULL y false en caso contrario. La sección 5 contiene más información al respecto.
  • 12. EJEMPLO: 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: Objeto que representa una instrucción SQL precompilada. Una instrucción SQL se precompila y se almacena en un objeto PreparedStatement. Este objeto puede utilizarse para ejecutar esta sentencia de forma eficiente varias veces. 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);
  • 13. 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();