STATEMENT
STATEMENT:
Definición:
Un objeto Statement se usa para enviar
sentencias SQL a la base de datos y obtener los
resultados producidos por ella. Actualmente hay tres tipos de objetos
Statement, todos los cuales actúan como contenedores para la ejecución de
sentencias en una conexión dada: Statement, PreparedStatement que hereda de
Statement y CallableStatement que hereda de PreparedStatement. Estas están
especializadas para enviar tipos particulares de sentencias SQL, Un objeto
Statement se usa para ejecutar una sentencia SQL simple sin parámetros. Un
objeto PreparedStatement se usa para ejecutar sentencias SQL precompiladas con
o sin parámetros IN; y un objeto CallableStatement se usa para ejecutar un
procedimiento de base de datos almacenado.
La interface Statement
suminstra métodos básicos para ejecutar sentencias y devolver resultados. La
interface PreparedStatement añade métodos para trabajar con los parámetros IN;
y la interfase CallableStatement añade métodos para trabajar con parameters
OUT.
A continuación una breve
descripción sobre cada tipo de objeto:
El
objeto Statement (sentencia) sirve para procesar una sentencia SQL estática y
obtener los resultados producidos por ella. Solo puede haber un ResultSet
abierto para cada objeto Statement en un momento dado. Todos los métodos
statement que procesan una sentencia SQL cierran implícitamente el ResultSet
actual de una sentencia si existe uno abierto.
· Creación de objetos Statement:
Una vez establecida
la conexión con una base de datos particular, esta conexión puede usarse para
enviar sentencias SQL. Un objeto Statement se crea mediante el método de
Connection createStatement, como podemos ver en el siguiente fragmento de
código.
Connection con =
DriverManager.getConnection(url, "sunny", "");
Statement stmt = con.createStatement();
Statement stmt = con.createStatement();
La sentencia SQL
que será enviada a la base de datos, es alimentada como un argumento a uno de
los métodos de ejecución del objeto Statement. Por ejemplo:
ResultSet rs =
stmt.executeQuery("SELECT a, b, c FROM Table2");
· Ejecución
de sentencias usando objetos Statement:
La interface Statement nos suministra tres métodos
diferentes para ejecutar sentencias SQL, executeQuery, executeUpdate y execute.
El método a usar está determinado por el producto de la sentencia SQL
El método
executeQuery está diseñado para sentencias que producen como resultado un único
ResultSet tal como las sentencias SELECT.
El método executeUpdate se usa para ejecutar sentencias INSERT, UPDATE ó DELETE así como sentencias SQL DDL (Data Definition Language) como CREATE TABLE o DROP TABLE. El efecto de una sentencia INSERT, UPDATE o DELETE es una modificación de una o más columnas en cero o más filas de una tabla. El valor devuelto de executeUpdate es un entero que indica el número de filas que han sido afectadas (referido como update count). Para sentencias tales como CREATE TABLE o DROP TABLE, que no operan sobre filas, le valor devuelto por executeUpdate es siempre cero.
El método executeUpdate se usa para ejecutar sentencias INSERT, UPDATE ó DELETE así como sentencias SQL DDL (Data Definition Language) como CREATE TABLE o DROP TABLE. El efecto de una sentencia INSERT, UPDATE o DELETE es una modificación de una o más columnas en cero o más filas de una tabla. El valor devuelto de executeUpdate es un entero que indica el número de filas que han sido afectadas (referido como update count). Para sentencias tales como CREATE TABLE o DROP TABLE, que no operan sobre filas, le valor devuelto por executeUpdate es siempre cero.
El método Execute
se usa para ejecutar sentencias que devuelven más de un ResultSet, más que un
Update Count o una combinación de ambos. Como es esta una característica
avanzada que muchos programadores no necesitaran, nunca se verá en su propia
sección.
Todos los métodos
que ejecutan sentencias cierran los objetos Resultset abiertos como resultado
de las llamadas a Statement. Esto quiere decir que es necesario completar el
proceso con el actual objeto Resulset antes de reejecutar una sentencia
Statement.
Debe notarse que la
interface PreparedStatement, que hereda los métodos de la interface Statement,
tiene sus propias versiones de los métodos executeQuery, executeUpdate y
execute. Los objetos Statement en sí mismos no contienen una sentencia SQL, por
tanto, debe suministrarse como un argumento a los métodos Statement.execute.
Los objetos PreparedStatement no suministran una sentencia SQL como argumento a
estos métodos puesto que ya tienen la sentencia precompilada. Los objetos
CallableStatement heredan las formas de estos métodos de PreparedStatement.
Usar un parametro de query con las versiones de los métodos de
PreparedStatement o CallableStatement producirái una SQLException.
· Realización
de Statement:
Cuando una conexión está en modo auto-commit, las
sentencias ejecutadas son ‘comitadas’ o rechazadas cuando se completan. Una
sentencia se considera completa cuando ha sido ejecutada y se han devuelto
todos los resultados. Pare el método executeQuery, que devuelve un único result
set, la sentencia se completa cuando todas las filas del objeto ResultSet se
han devuelto. Para el método executeUpdate, una sentencia se completa cuando se
ejecuta. En los raros casos en que se llama al método execute, de cualquier
modo, no se completa hasta que los resultsets o updatecounts que se generan han
sido devueltos.
Algunos DBMS tratan
cada sentencia en un procedimiento almacenado como sentencias separadas. Otros
tratan el procedimiento entero como una sentencia compuesta. Esta diferencia se
convierte en importante cuando está activo el modo auto-commit porque afecta
cuando se llama al método commit. En el primer caso, cada sentencia individual
es commitada. En el segundo, se commiten todas juntas.
· Cerrar
objetos Statement:
Los objetos Statement se cerrarán automáticamente
por el colector de basura de Java (garbage collector). No obstante, se
recomienda como una buena práctica de programación que se cierren
explicitamente cuando no sean ya necesarios. Esto libera recursos DBMS
inmediatamente y ayuda a evitar potenciales problemas de memoria.
· Sintaxis
de Escape SQL en objetos Statement:
Los objetos Statement pueden contener sentencias SQL
que usen sintaxis de escape SQL. La sintaxis de escape señala al driver que el
código que lleva debe ser tratado diferentemente. El driver buscará por
cualquier sintaxis de escape y lo traducirá en código que entiende la base de
datos en particular. Esto hace que la sintaxis de escape sea independiente de
la DBMS y permite al programador usar características que de otro modo no
estarían disponibles.
ü PreparedStatements:
Las PreparedStatements amplían la interfaz Statement y proporcionan soporte para añadir parámetros a sentencias SQL.
Las PreparedStatements amplían la interfaz Statement y proporcionan soporte para añadir parámetros a sentencias SQL.
Las
sentencias SQL que se pasan a la base de datos pasan por un proceso de dos
pasos al devolver los resultados al usuario. Primero se preparan y, a
continuación, se procesan. Con los objetos Statement, estas dos fases aparecen
como una sola en las aplicaciones. Las PreparedStatements permiten independizar
estos dos procesos. El paso de preparación se produce cuando se crea el objeto,
y el paso de proceso se produce cuando se llama a los métodos executeQuery,
executeUpdate o execute en el objeto PreparedStatement.
La
posibilidad de dividir el proceso SQL en fases independientes no tiene sentido
sin la adición de marcadores de parámetro. Los marcadores de parámetro se
colocan en una aplicación para que esta pueda indicar a la base de datos que no
tiene un valor específico durante la preparación, pero que proporciona uno
durante el proceso. En las sentencias SQL, los marcadores de parámetro se
representan mediante signos de interrogación.
Los
marcadores de parámetro posibilitan la creación de sentencias SQL generales que
se utilizan para peticiones específicas. Por ejemplo, considere la siguiente
sentencia de consulta SQL:
SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME =
'DETTINGER'
Se
trata de una sentencia SQL específica que devuelve un solo valor; es decir, la
información relativa a un empleado llamado Dettinger.
Para crear objetos PreparedStatement nuevos, se utiliza
el método prepareStatement. A diferencia de en el método createStatement, la
sentencia SQL debe suministrarse al crear el objeto PreparedStatement. En ese
momento, la sentencia SQL se precompila para su utilización.
El proceso de sentencias SQL con un objeto
PreparedStatement se realiza mediante los métodos executeQuery, executeUpdate y
execute, al igual que el proceso de objetos Statement. A diferencia de las
versiones de Statement, no se pasan parámetros en estos métodos debido a que la
sentencia SQL ya se ha suministrado al crear el objeto. Dado que
PreparedStatement amplía Statement, las aplicaciones pueden intentar llamar a
versiones de los métodos executeQuery, executeUpdate y execute que toman una
sentencia SQL. Esta operación provoca el lanzamiento de una excepción
SQLException.
ü CallableStatements:
La interfaz CallableStatement de JDBC amplía PreparedStatement y proporciona soporte para parámetros de salida y de entrada/salida. La interfaz CallableStatement tiene también soporte para parámetros de entrada, que proporciona la interfaz PreparedStatement.
La interfaz CallableStatement de JDBC amplía PreparedStatement y proporciona soporte para parámetros de salida y de entrada/salida. La interfaz CallableStatement tiene también soporte para parámetros de entrada, que proporciona la interfaz PreparedStatement.
La interfaz CallableStatement permite la utilización de
sentencias SQL para llamar a procedimientos almacenados. Los procedimientos
almacenados son programas que tienen una interfaz de base de datos. Estos
programas tienen lo siguiente:
·
Pueden tener parámetros de entrada y de salida,
o parámetros que son tanto de entrada como de salida.
·
Pueden tener un valor de retorno.
·
Tienen la capacidad de devolver varios
ResultSets.
Conceptualmente, en JDBC una llamada de procedimiento almacenado es una
sola llamada a la base de datos, pero el programa asociado con el procedimiento
almacenado puede procesar cientos de peticiones de base de datos. El programa
de procedimiento almacenado también puede realizar otras diversas tareas
programáticas que no realizan habitualmente las sentencias SQL.
Las CallableStatements, debido a que siguen el modelo de
PreparedStatement (que consiste en desacoplar las fases de preparación y
proceso), permiten la reutilización optimizada (los detalles están en: PreparedStatements). Dado que las sentencias SQL de un procedimiento
almacenado están enlazadas a un programa, se procesan como SQL estático, y con
ello puede obtenerse un rendimiento superior. La encapsulación de gran cantidad
de trabajo de base de datos en una sola llamada de base de datos reutilizable
es un ejemplo de utilización óptima de procedimientos almacenados. Solo esta
llamada se transmite por la red al otro sistema, pero la petición puede
realizar gran cantidad de trabajo en el sistema remoto.
PROPIEDADES:
Una cláusula de escape se enmarca entre llaves y tiene una palabra clave:
{keyword . . . parameters . . .}. La palabra clave (keyword) indica el tipo de cláusula
de escape, según se muestra:
“Escape” para caracteres LIKE; Los caracteres “%” y “_” trabajan como wildcards
en la cláusula SQL LIKE (“%” significa cero o más caracteres y “_” significa
exactamente un carácter”. En orden a interpretarlos literalmente, pueden estar
precedidos por un backslash (‘\’), que es un carácter de escape especial en
cadenas. Se puede especificar un carácter que se use como carácter de escape
por la inclusión de la sintaxis siguiente al final de la consulta.
{escape
'escape-character'}
Por ejemplo, la siguiente
query, usando backslash como caracter de escape, encuentra nombres de identificador
que comiencen con ‘_’.
stmt.executeQuery("SELECT
name FROM Identifiers
WHERE Id LIKE `\_%' {escape `\'};
WHERE Id LIKE `\_%' {escape `\'};
“Fn” para funciones escalares;
Casi todas las DBMS tienen funciones numèricas, de cadena, de fecha y
conversión sobre valores escalares. Una de estas funciones puede usarse
colocándola en la sintaxis de escape con la clave fn seguida del nombre de la
función deseada y sus argumentos. Por ejemplo, para llamar a la función concat
con dos argumentos que serán concatenados:
{fn
concat("Hot", "Java")};
El nombre del usuario
actual de la base de datos puede obtenerse mediante:
{fn user()};
Las funciones escalares
pueden estar soportadas por diferentes DBMS con ligeras diferencias de sintaxis,
y pueden no estar disponibles en todos los drivers. Varios métodos de
DatabaseMetaData nos listarán las funciones que están soportadas. Por ejemplo,
el método getNumericFunctions devuelve una lista de los nombres de las
funciones numéricas separadas por comas, el método getStringFunction nos
devuelve los nombres de las funciones de cadena, y así varías más.
EL driver o bien mapeará
la llamada a la función ‘escapada’ en su propia sintaxis o implementará la
función el mismo.
“D,
T y TS” para literales de fecha y tiempo. Las DBMS difieren
en la sintaxis que usan para los literales de fecha, tiempo y timestamp. JDBC
soporta un formato estándar ISO para estos literales y usa una cláusula de
escape que el driver debe traducir a la representación del DBMS. Por ejemplo,
una fecha se especifica en SQL JDBC mediante la sintaxis:
{d `yyyy-mm-dd'}
En esta sintaxis, yyyy es
el año, mm es el mes y dd es el dia. El driver reemplazará la cláusula de
escape por la representación propia equivalente de la DBMS. Por ejemplo, el
driver reemplazaría {d 1999-02-28} por ’28-FEB-99’ si este es el formato
apropiado para la base subyacente.
Hay cláusulas de escape
análogas para TIME y TIMESTAMP
{t `hh:mm:ss'}
{ts `yyyy-mm-dd hh:mm:ss.f . . .'}
La parte fraccional de los segundos (.f . . .) del TIMESTAMP puede omitirse.
{ts `yyyy-mm-dd hh:mm:ss.f . . .'}
La parte fraccional de los segundos (.f . . .) del TIMESTAMP puede omitirse.
• call = call
para procedimientos almacenados.
Si una database soporta procedimientos almacenados,
estos pueden ser invocados desde JDBC mediante:
{call procedure_name[(….,…, . . .)]}
o, cuando el procedimiento devuelve como resultado
un parámetro
{.. = call procedure_name[(.., …, . . .)]}
Los corchetes indican que el material encerrado en
ellos es opcional. Estos no forman parte de la sintaxis.
Los argumentos de entrada pueden ser bien literales,
bien parámetros. Ver la sección 7 “CallableStatement” de esta guía.
Se puede llamar al método
DatabaseMetaData.supportsStoredProcedures para ver si la base de datos soporta
procedimientos almacenados.
• oj para joins de salida
La sintaxis para un outer join es:
{oj outer-join}
donde outer-join es de la forma:
Table LEFT OUTER JOIN
{table | outer-join} ON search-condition
Las Outer joins son una característica avanzada, y solo puede chequearse la gramática SQL mediente una explicación de ella. JDBC provee tres métodos de DatabaseMetaData para determinar que tipos de outer joins soporta un driver: supportsOuterJoins, supportsFullOuterJoins, y supportsLimitedOuterJoins.
El método Statement.setEscapeProcessing activa o desactiva el procesamiento de escape. Por defecto la característica se encuentra activada. Un programador debería desactivar esta característica en tiempo de ejecución cuando el rendimiento ha de ser máximo, pero normalmente debe estar activado. Debería notarse que setEscapeProcesing no trabaja con objetos PreparedStatement por que la sentencia ya está preparada para enviar a la base de datos antes de poder ser llamada.
Las Outer joins son una característica avanzada, y solo puede chequearse la gramática SQL mediente una explicación de ella. JDBC provee tres métodos de DatabaseMetaData para determinar que tipos de outer joins soporta un driver: supportsOuterJoins, supportsFullOuterJoins, y supportsLimitedOuterJoins.
El método Statement.setEscapeProcessing activa o desactiva el procesamiento de escape. Por defecto la característica se encuentra activada. Un programador debería desactivar esta característica en tiempo de ejecución cuando el rendimiento ha de ser máximo, pero normalmente debe estar activado. Debería notarse que setEscapeProcesing no trabaja con objetos PreparedStatement por que la sentencia ya está preparada para enviar a la base de datos antes de poder ser llamada.
Uso del método execute:
El método execute debería
usarse solamente cuando es posible que una sentencia nos devuelva más de un
objeto Resultset., más de un updatecount o una combinación de ambos. Estas
múltiples posibilidades para resultados, aunque raras, son posibles cuando se
ejecutan ciertos procedimientos almacenados o por la ejecución dinámica de una
string SQL desconocida (esto es, desconocida para el programador de la
aplicación en tiempo de compilación). Por ejemplo, un usuario podría ejecutar
un procedimiento almacenado (usando un objeto CallableStatement y este
procedimiento podría ejecutar una actualización, después una select, luego una
actualización, después una select y así. Normalmente, alguien que usa un
procedimiento almacenado sabrá que se le va a devolver.
Porque el método execute
maneja los casos que se salen de lo ordinario, no sorprende que los resultados
devueltos requieren algun manejo especial. Por ejemplo, supongamos que se sabe
que el procedimiento devuelve dos result sets.
Después de usar el método execute para ejecutar el procedimiento, se debe llamar al método getResultSet para conseguir el primer result set y después los métodos apropiados getXXX para recuperar los valores de él. Para conseguir el segundo result set, se necesita llamar al método getMoreResults y y despues a getResultSet de nuevo. Si se sabe que el procedimiento devuelve dos upadte counts, se llama primero al método getUpdateCount, seguido de getMoreResults y de nuevo getUpdateCount.
Después de usar el método execute para ejecutar el procedimiento, se debe llamar al método getResultSet para conseguir el primer result set y después los métodos apropiados getXXX para recuperar los valores de él. Para conseguir el segundo result set, se necesita llamar al método getMoreResults y y despues a getResultSet de nuevo. Si se sabe que el procedimiento devuelve dos upadte counts, se llama primero al método getUpdateCount, seguido de getMoreResults y de nuevo getUpdateCount.
Cuando el resultado de
una sentencia SQL no es un result set, el método getResultSet devolverá null.
Esto quiere decir que el resultado es un update count o que no hay más
resultados. La única manera de encontrar que significa el valor null en este
caso es llamar al método getUpdateCount, que devolverá un entero. Este entero
será el número de filas afectadas por la sentencia ejecutada o –1 para indicar
o bien que el resultado es un result set o bien que no hay más resultados. Si
el método getResultSet ya ha devuelto null, el resultado no puede ser un objeto
ResultSet, por lo que el valor devuelto de –1 tiene que ser que no hay más
resultados. En otras palabras, no hay más resultados cuando lo siguiente es
cierto:
((stmt.getResultSet() == null) &&
(stmt.getUpdateCount() == -1))
Si se ha llamado al método getResultSet y se ha
procesado el objeto ResultSet devuelto, es necesario llamar al método
getMoreResults para ver si hay más result sets o update counts.. Si
getMoreResults devuelve true, entonces es necesario llamar de nuevo a
getResultSet para recuperar el siguiente result set. Como ya se ha indicado
anteriormente, si getResultset devuelve null hay que llamar a GetUpdateCount
para buscar que significa ese null si un update count o que no hay más
resultados.
Cuando getMoreResults devuelve false quiere decir
que la sentencia SQL ha devuelto un update count o que no hay más resultados.
Por tanto es necesario llamar al método getUpdateCount para encontrar cual es
el caso. En esta situación, no habrá más resultados cuando lo siguiente es
cierto:
((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
El siguiente código muestra una forma de asegurarse
que se ha accedido a todos los result sets y update counts de una llamada al
método execute:
stmt.execute(queryStringWithUnknownResults);
while (true) {
int rowCount = stmt.getUpdateCount();
if (rowCount > 0) { // this is an update count
System.out.println("Rows changed = " + count);
stmt.getMoreResults();
continue;
}
if (rowCount == 0) { // DDL command or 0 updates
System.out.println(" No rows changed or statement was DDL
command");
stmt.getMoreResults();
continue;
}
// if we have gotten this far, we have either a result set
// or no more results
ResultSet rs = stmt.getResultSet;
if (rs != null) {
. . . // use metadata to get info about result set columns
while (rs.next()) {
. . . // process results
stmt.getMoreResults();
continue;
}
break; // there are no more results
while (true) {
int rowCount = stmt.getUpdateCount();
if (rowCount > 0) { // this is an update count
System.out.println("Rows changed = " + count);
stmt.getMoreResults();
continue;
}
if (rowCount == 0) { // DDL command or 0 updates
System.out.println(" No rows changed or statement was DDL
command");
stmt.getMoreResults();
continue;
}
// if we have gotten this far, we have either a result set
// or no more results
ResultSet rs = stmt.getResultSet;
if (rs != null) {
. . . // use metadata to get info about result set columns
while (rs.next()) {
. . . // process results
stmt.getMoreResults();
continue;
}
break; // there are no more results
EJEMPLOS:
·
Establecemos la conexión con la base de datos:
Connection conexion = DriverManager.getConnection ("jdbc:mysql://localhost/prueba","root", "la_clave");
Connection conexion = DriverManager.getConnection ("jdbc:mysql://localhost/prueba","root", "la_clave");
// Preparamos la consulta
Statement s = conexion.createStatement();
ResultSet rs = s.executeQuery ("select * from persona");
Statement s = conexion.createStatement();
ResultSet rs = s.executeQuery ("select * from persona");
// Recorremos el resultado, mientras haya registros
para leer, y escribimos el resultado en pantalla.
while (rs.next())
{
System.out.println (rs.getInt (1) + " " + rs.getString (2)+ " " + rs.getDate(3));
}
while (rs.next())
{
System.out.println (rs.getInt (1) + " " + rs.getString (2)+ " " + rs.getDate(3));
}
// Cerramos la conexion a la base de datos.
conexion.close();
conexion.close();
·
Para hacer consultas a la base de datos hacen falta una serie de clases
que colaboran para hacer acciones sucesivas: Connection, Statement, ResultSetMetaData
y SQLException.
ConsultasSQL.java
package
visorconsultas.controlador;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import
java.sql.ResultSetMetaData;
import java.sql.SQLException;
public class ConsultaSQL {
private Connection conexion;
private ResultSet resultadoConsulta;
private ResultSetMetaData metaDatos;
private String consulta;
//Crea dos arreglos
private String[][] datosDevueltos;
private String [] nombresColumnas;
private String error;
public ConsultaSQL(Connection conRecibida,
String consultaRecibida){
conexion=conRecibida;
consulta=consultaRecibida;
try
{
//Crea una instancia para
mandar sentencias al servidor MySQL
Statement
sentencia=conexion.createStatement();
//Ejecuta la consulta y
devuelve el ResultSet
resultadoConsulta=sentencia.executeQuery(consulta);
//Obtiene los metadatos del
ResultSet
metaDatos=resultadoConsulta.getMetaData();
error=null;
}catch (SQLException e) {
error=e.getMessage()}
}
public String[][] getDatosDevueltos(){
if(error==null){
try {
//Devuelve el número de
columnas del resultset
int
columnas=metaDatos.getColumnCount();
//Lleva el cursor a la última
fila del resultset
resultadoConsulta.last();
//Obtiene el número de fila actual(
que aquí es la última)
int
filas=resultadoConsulta.getRow();
//Dimensiona el arreglo
datosDevueltos con los enteros obtenidos
datosDevueltos=new
String[filas][columnas];
//Ubica el cursor antes del a
primera fila
resultadoConsulta.beforeFirst();
for(int i=0;i<filas;i++){
//Va a la siguiente fila
resultadoConsulta.next();
for(int
j=0;j<columnas;j++){
//Obtiene el valor de cada una
de las columnas en la fila actual
datosDevueltos[i][j]=resultadoConsulta.getString(j+1);
}
}catch (Exception e){
}
}return datosDevueltos;
}
public String[]
getNombresColumnas(){
if(error==null){
try{
//Devuelve el número de
columnas
int
columnas=metaDatos.getColumnCount();
nombresColumnas=new
String[columnas];
for(int
i=0;i<columnas;i++){
//Obtiene el nombre de cada
una de las columnas nombresColumnas[i]=metaDatos.getColumnLabel(i+1);}
}catch(SQLException ex){
}
}return nombresColumnas;
}
public String getMensajeError(){
return error;}
}
El constructor de la clase
ConsultaSQL recibe como parámetro un objeto de tipo Connection y otro de String;
éste contendrá una sentencia SELECT; Statement es una interfaz que puede ejecutar
sentencias en lenguaje SQL a través de una conexión; su método executeQuery()recibe
la cadena SELECT y devuelve un objeto de tipo ResultSet,
que contiene una imagen de los datos devueltos por el servidor MySQL en formato
de tabla, es decir, filas y columnas; además los ResultSet tienen un apuntador o cursor que sirve
para recorrer los registros de la tabla; el recorrido se hace con métodos como next().
No obstante, no toda la información necesaria está en los datos que ya se
obtuvieron (por ejemplo, falta el nombre de las columnas); para obtener dicha
información se usan los objetos del tipo ResultSetMetaData.
En la clase que acabamos de escribir, hay dos métodos: getDatosDevueltos() y getNombresColumnas() que darán la información solicitada con la consulta en dos arreglos, uno contiene la tabla y el otro la lista de los nombres de los atributos de dicha tabla. Con ellos se podrán mostrar los datos.
En la clase que acabamos de escribir, hay dos métodos: getDatosDevueltos() y getNombresColumnas() que darán la información solicitada con la consulta en dos arreglos, uno contiene la tabla y el otro la lista de los nombres de los atributos de dicha tabla. Con ellos se podrán mostrar los datos.
RESUMEN:
El objeto Statement se usa para enviar sentencias
SQL a la base de datos. Actualmente hay tres tipos de objetos Statement, todos
los cuales actúan como contenedores para la ejecución de sentencias en una
conexión dada:
El
objeto Statement (sentencia) sirve para procesar una sentencia SQL estática. Solo
puede haber un ResultSet abierto para cada objeto Statement en un momento dado.
Todos los métodos statement que procesan una sentencia SQL cierran
implícitamente el ResultSet actual de una sentencia si existe uno abierto.
ü PreparedStatements:
Las PreparedStatements amplían la interfaz Statement y proporcionan soporte para añadir parámetros a sentencias SQL.
Las PreparedStatements amplían la interfaz Statement y proporcionan soporte para añadir parámetros a sentencias SQL.
Las sentencias
SQL que se pasan a la base de datos pasan por un proceso de dos pasos al
devolver los resultados al usuario. Primero se preparan y, a continuación, se
procesan.
ü CallableStatements:
La interfaz CallableStatement de JDBC amplía PreparedStatement y proporciona soporte para parámetros de salida y de entrada/salida. La interfaz CallableStatement tiene también soporte para parámetros de entrada, que proporciona la interfaz PreparedStatement. La interfaz CallableStatement permite la utilización de sentencias SQL para llamar a procedimientos almacenados.
La interfaz CallableStatement de JDBC amplía PreparedStatement y proporciona soporte para parámetros de salida y de entrada/salida. La interfaz CallableStatement tiene también soporte para parámetros de entrada, que proporciona la interfaz PreparedStatement. La interfaz CallableStatement permite la utilización de sentencias SQL para llamar a procedimientos almacenados.
Además, el objeto Statement tiene sus
propiedades; por ejemplo:
Una cláusula de escape se
enmarca entre llaves y tiene una palabra clave: {keyword parameters}. La
palabra clave (keyword) indica el tipo de cláusula de escape, según se muestra:
“Escape” para caracteres LIKE: Los
caracteres “%” y “_” trabajan como wildcards en la cláusula SQL LIKE (“%”
significa cero o más caracteres y “_” significa exactamente un carácter”.
“Fn” para funciones escalares,
funciones numèricas, de cadena, de fecha yconversión sobre valores escalares.
“D, T y TS”
para literales de fecha y tiempo, por ejemplo, una fecha se especifica en SQL
JDBC mediante la sintaxis: {d `yyyy-mm-dd'}. En esta sintaxis, yyyy es el año,
mm el mes y dd el dia. El driver reemplazará la cláusula de escape por la
representaciòn propia equivalente de la DBMS. Por ejemplo, el driver reemplazaría
{d 1999-02-28} por ’28-FEB-99’ si este es el formato apropiado para la base
subyacente.
SUMMARY:
The Statement object is used to send SQL statements to the database.
There are currently three types of Statement objects, all of which act as containers
for the enforcement of judgments in a given connection:
ü Objects Statement:
The Statement
object (judgment) is used to process a static SQL statement. There can only be
an open ResultSet object for each Statement at any given time. All methods statement
processing an SQL statement implicitly close the current ResultSet of a
judgment if one is open.
ü PreparedStatements:
The
PreparedStatements extend the Statement interface and provide support to add
parameters to SQL statements.
SQL statements that
are passed to the database go through a two-step process to return the results
to the user. First prepared and then processed.
ü CallableStatements:
The JDBC interface
CallableStatement extends PreparedStatement and provides support for output
parameters and input / output. The CallableStatement interface also supports
input parameters, which provides the PreparedStatement interface.
The
CallableStatement interface allows the use of SQL statements to call stored
procedures.
In addition, the
Statement object has its own properties; for example:
An escape clause is
framed between keys and have a keyword: {keyword parameters}. The keyword
(keyword) indicates the kind of escape clause, as shown:
"Escape"
for characters LIKE: The characters "%" and "_" work like
wild cards in SQL LIKE clause ("%" means zero or more characters and
"_" means exactly one character ".
"Fn" for
scalar functions, numeric, string, date of yconversión on scalar values.
"D, T and
TS" for date and time literals, for example, a date specified in SQL JDBC
using the syntax: {d 'yyyy-mm-dd'}. In this syntax, yyyy is the year, mm the
month and dd day. The driver will replace the escape clause by its own visual
equivalent of the DBMS. For example, the driver would replace {d} by '28 02/28/1999
-FEB-99 'if this is the appropriate format for the underlying base.
RECOMENDACIONES:
Para aprender a
manejar el Statement o sentencias para hacer consultas y jalar información
hasta un formulario desde Java hay que tener en cuenta factores como:
ü Al momento de enviar la información
tener en cuenta el nombre de la base de datos, por ejemplo si mi base de datos
se llama “BDTIENDA” y dentro de dicha base de datos tenemos una tabla llamada
Registros entonces la consulta sería cnx.rs=cnx.stm.executeQuery
(“ Select * From Registros”);
ü La consulta anterior se realiza
cuando se quiere sacar todos los datos de una base de datos per si queremos
sacar determinados campos la consulta sería la siguiente cnx.rs=cnx.stm.executeQuery("SELECT
codactor,nombre,fechanac,sexo,nompa from Registros")
ü Al momento de ingresar todos los
campos de la tabla que queremos sacar de la tabla tenemos que tener en cuenta
el orden en los que están ingresados los datos y la forma correcta de cómo
están escritos, en las líneas de código en java les asignaremos una variable
para poder mostrarlo por ejemplo:
String cod=cnx.rs.getString("codactor");
Esas son las pautas
más importantes a tener en cuenta al momento de hacer una consulta desde Java
utilizando el statement.
CONCLUCIÓN:
Un objeto Statement se usa para enviar
sentencias SQL a la base de datos y obtener los resultados producidos por ella. Actualmente hay tres tipos de objetos Statement, todos los cuales actúan
como contenedores para la ejecución de sentencias en una conexión dada:
Statement, PreparedStatement que hereda de Statement y CallableStatement que
hereda de PreparedStatement. Estas están especializadas para enviar tipos
particulares de sentencias SQL, Un objeto Statement se usa para ejecutar una
sentencia SQL simple sin parámetros. Un objeto PreparedStatement se usa para
ejecutar sentencias SQL precompiladas con o sin parámetros IN; y un objeto
CallableStatement se usa para ejecutar un procedimiento de base de datos
almacenado.
APRECIACIÓN DEL GRUPO:
Es importante aprender a escribir sentencias
Sql desde un lenguaje de programación por múltiples razones, por ejemplo cuando
vas a la práctica, puedas desenvolverte haciendo cualquier tipo de
requerimientos que sean necesarios para mejorar y agilizar los procesos de
consultas, actualización, ingreso y eliminación de datos de una tabla en una
Base de Datos.
También es importante manejar estas sentencias
para facilitar el trabajo de los empleados que no están tan pegados a la
tecnología, para ellos sería muy difícil hacer operaciones requeridas
ingresando al mismo Sql, en cambio sería mucho más fácil hacerlo desde una
interfaz gráfica más amigable y amena que con solo al hacer click en un botón
se hagan todos los requerimientos deseados, entonces es trabajo del programador
hacer que ese botón responda a las expectativas.
GLOSARIO:
ü Suministra: Configurar y mantener el
acceso de un usuario a un sistema de la organización.
ü Interfaz:
Es lo que
conocemos en inglés como interface (“superficie de contacto”).
En informática se utiliza para nombrar a la conexión funcional entre dos
sistemas o dispositivos de cualquier tipo dando una comunicación entre
distintos niveles.
ü Precompilar:
Es el proceso por el cual se traducen las instrucciones
escritas en un determinado lenguaje de programación a lenguaje máquina. Además
de un traductor, se pueden necesitar otros programas para crear un programa
objeto ejecutable.
ü Query: Significa consulta. Es
decir, un query en base de datos es una búsqueda o pedido de datos almacenados
en una base de datos.
ü
DBMS: (Data Base Management System), Sistema de administración de base de datos.
ü Método
commit: (Acción de comprometer), se refiere a la idea
de consignar un conjunto de cambios "tentativos" de forma permanente.
Un uso popular es al final de una transacción de base de datos.
ü Keyword: Palabra clave. Palabras
importantes asociadas a un recurso. Por ejemplo,
las palabras claves asociadas a una página web son las que engloban el contenido de la misma.
ü Wildcards: (Comodines), es utilizada de
forma conjunta con una red de referencia (network), permite indicar el número de direcciones IP
que serán incluidas en el rango.
ü
Backslash: (barra
invertida)
ü Inclusión digital:
Es la democratización del
acceso a las tecnologías de la
información y la comunicación
para permitir la inserción de todos en la sociedad
de la información.
LINKOGRAFIA:
http://es.slideshare.net/LisbethOcaaBueno/statement-67906457
ü https://www.youtube.com/watch?v=OFMcraLulXU
ü http://www.euskalnet.net/jaoprogramador/j2ee/JDBC/jdbc17.htm
ü http://profesores.fi-b.unam.mx/sun/Downloads/Java/jdbc.pdf
Por favor plantear su FORO sobre el tema. Esta bien su PRESENTACION en SLIDESHARE. Replantear las CONCLUSIONES y RECOMENDACIONES . Además defina con sus propias palabras el APRECIACION DE EQUIPO. Gracias por su investigación. Saludos . Gracias
ResponderBorrar