Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Agenda
Conceptos de la tecnologa JDBC Drivers JDBC Siete pasos bsicos para usar JDBC Obteniendo datos de un ResultSet Declaraciones Excepciones SQL Transacciones
Ing. Julio Cesar Meza Garca 2
Introduccin a JDBC
Son libreras estndar para acceso a bases de datos relacionales
El API JDBC estandariza algunas funciones:
Como se realiza la conexin a la base de datos La ejecucin de consultas La creacin de declaraciones pre-compiladas La estructura de los resultados de una consulta
Filas, columnas Metadatos
El API no estandariza la sintaxis SQL Las clases JDBC estn en el paquete java.sql
Ing. Julio Cesar Meza Garca 3
Drivers JDBC
JDBC consta de dos partes:
El API JDBC, 100% basado en Java El DriverManager, especifico de cada proveedor y que proporciona la comunicacin real con la base de datos.
La traduccin al formato del proveedor es realizada en el cliente El driver se instala unicamente en el cliente.
Aplicacin Java
DBMS
DBMS
BIT
TINYINT SMALLINT INTEGER BIGINT REAL FLOAT DOUBLE BINARY VARBINARY LONGVARBINARY
boolean
byte short int long float double byte[]
NUMERIC DECIMAL
DATE TIME TIMESTAMP
BigDecimal
java.sql.Date java.sql.Timestamp
CLOB
BLOB ARRAY STRUCT
Clob
Blob Array Struct
REF String
Ref
executeUpdate
Para establecer el tiempo de espera mximo en la ejecucin de una consulta se utiliza el mtodo
setQueryTimeout
Ing. Julio Cesar Meza Garca 10
11
12
El objeto Statement
Que es?
El objeto Statement se utiliza para enviar sentencias SQL al DBMS
PreparedStatement
Para ejecutar sentencias SQL precompiladas con pase de parmetros
CallableStatement
Para ejecutar procedimientos almacenados
Ing. Julio Cesar Meza Garca 13
executeUpdate
Se utiliza para ejecutar sentencias SQL (INSERT, UPDATE y DELETE) Regresa un valor numrico que indica el nmero de filas afectadas Soporta sentencias DDL (CREATE TABLE, ALTER TABLE, etc)
Ing. Julio Cesar Meza Garca 14
execute
Mtodo genrico utilizado para ejecutar procedimientos almacenados o declaraciones precompiladas. Raramente usado (puede retornar mltiples ResultSet) Puede regresar o no un ResultSet. El mtodo getResultSet indica si existe o no un ResulSet (si el resultado es true pueden existir varios sets de resultados)
getMaxRows/setMaxRows
Determina el nmero mximo de filas que un ResultSet puede tener. Si el nmero de filas es ilimitado regresa 0
Ing. Julio Cesar Meza Garca 15
16
PreparedStatement
Tip
Si va ha ejecutar mltiples consultas similares, puede utilizar el objeto PreparedStatement y utilizar parmetros
El objeto PreparedStatement dispone de los mismos mtodos que el objeto Statement, solo que estos se ejecutan sin parmetros:
executeQuery() executeUpdate() execute()
Ing. Julio Cesar Meza Garca 17
Mtodos de PreparedStatement
setXxx
Escribe valor del parmetro indicado (?) en la sentencia SQL
clearParameters
Limpia todos los parmetros de la declaracin
18
19
CallableStatement
Tip
Permite ejecutar procedimientos almacenados en el DBMS
Ventajas
Los errores de sintaxis son detectados en tiempo de compilacin Los procedimientos almacenados se ejecutan ms rpido que las sentencias SQL dinmicas El programador solo requiere conocer los parmetros de E/S del procedimiento almacenado No se requiere conocer la estructura de las tablas o los detalles del procedimiento almacenado.
Ing. Julio Cesar Meza Garca 20
CallableStatement
(continua)
Sintaxis
Procedimientos sin parmetros
{ call procedure_name }
CallableStatement
(continua)
Parmetros de salida
Registre el tipo de dato JDBC de cada parmetro utilizando el mtodo registerOutParameter antes de llamar al mtodo execute
stmt.registerOutParameter(n,Types.Float);
Utilice el mtodo getXxx para acceder los resultados que regresa el procedimiento almacenado. Ing. Julio Cesar Meza Garca
22
ResultSet
Qu es?
Un ResultSet contiene los resultados de una consulta SQL
Representado por una tabla con filas y columnas En JDBC 1.0 nicamente puede avanzar utilizando el mtodo next()
Mtodos disponibles
Todos los mtodos pueden lanzar una excepcin de tipo SQLException
close
Libera los recursos JDBC y de la base de datos El ResultSet es cerrado automticamente cuando con el objeto Statement asociado se ejecuta una nueva consulta.
Ing. Julio Cesar Meza Garca 24
ResultSet
Mtodos disponibles
getMetaDataObject
Regresa un objeto ResultSetMetaData que contiene informacin acerca de las columnas en el ResultSet
next
Intenta mover a la siguiente fila en el ResultSet Si la operacin es exitosa regresa true; el caso contrario, false
La primera llamada posiciona el cursor en la primera fila Su llamada limpia la cadena SQLWarning
getWarning
Regresa el primer SQLWarning o nulo si no han ocurrido eventos.
Ing. Julio Cesar Meza Garca 25
ResultSet
Mtodos disponibles
findColumn
Regresa un valor numrico correspondiente a la posicin de la columna Los nmeros de columna en el ResultSet pueden no corresponder con los de la base de datos
getXxx
Retorna el valor de la columna especificada (por nombre o por ndice) como un tipo de datos Xxx Retorna null si el valor es un SQL NULL Los tipos de datos Xxx validos son:
Double, Byte, Int, Date, String, Float, Short, Long, Time, Object
Ing. Julio Cesar Meza Garca 26
ResultSet
Mtodos disponibles
wasNull
Se utiliza para verificar si la ultima llamada getXxx regreso un SQL NULL
27
Uso de cursores
Por defecto, el Driver recupera todos los resultados al momento de ejecutar la consulta. Para consultas que regresan grandes cantidades de datos esto puede ser un serio inconveniente. Con el uso de cursores podemos controlar la cantidad de registros que sern "cacheados" por el cliente. Ventajas:
Solo se transfieren al cliente los bloques que se requieren.
Ing. Julio Cesar Meza Garca 28
Aplicacin de un cursor
Connection conn = DriverManager.getConnection(URL,USUARIO,CLAVE); // poner autocommit en off conn.setAutoCommit(false); Statement st = conn.createStatement(); // habilitar el cursor st.setFetchSize(50); ResultSet rs = st.executeQuery("select * from empleados"); while (rs.next()) { out.print("a row was returned.<br>"); }
Ing. Julio Cesar Meza Garca 30
Mtodos MetaData
getColumnCount
Regresa el nmero de columnas del ResultSet.
getColumnDisplaySize
Regresa el tamao mximo de una columna de tipo carcter.
getColumnName/getColumnLabel
getColumnName regresa el nombre de la columna en la base de datos getColumnLabel regresa el nombre de la columna en el ResultSet
getColumnType
Regresa el tipo de dato de la columna
Ing. Julio Cesar Meza Garca 32
Mtodos MetaData
isNullable
Indica si la columna puede almacenar valores nulos Puede compara el valor retornado con las siguientes constantes del ResultSet: columnNoNulls, columnNullable, columnNullableUnknown
isSearchable
Indica si la columna puede ser utilizada en una clusula where
isReadOnly/isWritable
isReadOnly indica si la columna es definitivamente de solo lectura. isWritable indica si la columna puede ser accesada para escritura,
Ing. Julio Cesar Meza Garca 33
Mtodos MetaData
getColumnTypeName
Regresa una cadena con el nombre del tipo de dato de la columna
34
Manejo de errores
HTTP/1.1 500 Internal Server Error cuando el atributo isErrorPage="true"
IE muestra una pgina de error interno cuando la respuesta del servidor es menor a 512 bytes.
Solucin:
Crear el objeto exception a partir del atributo javax.servlet.jsp.jspException
El atributo vara con otras versiones de tomcat.
37
Ejemplo de SQLException
try { // Declaraciones JDBC } catch (SQLException e) { while (e != null) { System.out.println("Mensaje: "+e.getMessage()); System.out.println("SQLState: "+e.getSQLState()); System.out.println("Error: "+e.getErrorCode()); e = e.getNextException(); } }
39
Transacciones
Por defecto, una vez que una declaracin es ejecutada, los cambios son automticamente asentados. Para habilitar el uso de transacciones se debe desactivar la caracterstica autocommit connection.setAutoCommit(false)
Llamar el mtodo commit para hacer permanentes las modificaciones Llamar el mtodo rollback para deshacer los cambios si un error se presenta.
Ing. Julio Cesar Meza Garca 40
Transacciones: Ejemplo
Connection connection = DriverManager.getConnection(url, username, passwd); connection.setAutoCommit(false); try { statement.executeUpdate(...); statement.executeUpdate(...); ... } catch (Exception e) { try { connection.rollback(); } catch (SQLException sqle) { // reporte del problema } } finally { try { connection.commit(); connection.close(); } catch (SQLException sqle) { } Ing. Julio Cesar Meza Garca }
41
commit
Hace permanentes todos los cambios desde el ltimo commit Los bloqueos a la base de datos hechos desde esta conexin son liberados.
rollback
Deshace los cambios ocurridos desde el ltimo commit. Los bloqueos a la base de datos hechos desde esta conexin son liberados.
Ing. Julio Cesar Meza Garca 42
El problema de la concurrencia
El acceso a aplicaciones web frecuentemente enfrenta problemas de concurrencia. Cuando se incrementa el nmero de usuarios, es muy probable que se inicie una nueva peticin antes de terminar la que esta en proceso. Normalmente cada usuario genera una (o ms conexiones directamente al DBMS), abrindola y cerrndola con cada peticin.
43
El "pool" de conexiones
Un pool de conexiones crea y mantiene un grupo de conexiones al DBMS.
Las conexiones se realizan con un URL nico.
Tomcat abre las conexiones al iniciar la aplicacin Cuando una peticin requiere una conexin simplemente la toma del pool Cuando la peticin termina, la conexin regresa al pool y puede ser utilizada por otra peticin.
Ing. Julio Cesar Meza Garca 44
45
46
Resumen
Conexin a un DBMS y ejecucin de sentencias SQL Los MetaDataResultSet proporcionan detalles acerca de un ResultSet Puede incrementar el rendimiento utilizando declaraciones precompiladas Debe asegurarse de manejar adecuadamente los valores NULL regresados por los mtodos getXxx Por default las conexiones son abiertas en el modo
autocommit
48