Acceso a bases de datos con JDBC
Aplicaciones Web/Sistemas Web
Juan Pavn Mestras
Dep. Ingeniera del Software e Inteligencia Artificial
Facultad de Informtica
Universidad Complutense Madrid
Material bajo licencia Creative Commons, Juan Pavn 2013
JDBC
Java Database Connectivity
API Java para conectar las aplicaciones a bases de datos
Arquitectura modular
La misma interfaz para distintos tipos de bases de datos
Implementa un gestor de drivers de bases de datos
Aplicacin Java
JDBC API (aplicacin)
JDBC
JDBC API (controlador)
Driver
MySQL
Driver
Oracle
Driver
Sybase
Driver
DB2
MySQL
Oracle
Sybase
DB2
Juan Pavn - UCM 2012-13
JDBC
Paquete [Link]
Uso de controladores de las BD
Clase DriverManager
Permite establecer y gestionar conexiones a las BD
Clase SQLPermission
Proporciona los permisos para poder usar el DriverManager a cdigo
en ejecucin dentro de un Security Manager (por ejemplo applets)
Interfaz Driver
Metodos para registrar y conectar controladores basados en
tecnologa JDBC
Clase DriverPropertyInfo
Propiedades de un controlador
Excepciones
SQLException
SQLWarning
Juan Pavn - UCM 2012-13
JDBC
Paquete [Link]
Interfaz con la aplicacin
Envo de instrucciones SQL a la BD
Connection
Mtodos para crear instrucciones y para gestionar conexiones y sus
propiedades
Statement
Permite enviar instrucciones a la BD
PreparedStatement
Permite usar instrucciones preparadas o SQL bsicas
CallableStatement
Llamada a procedimientos almacenados en la BD
Savepoint
Puntos de recuperacin en una transaccin
Recuperacin de los resultados de la consulta a la BD
ResultSet
Conjunto de resultados que se devuelven de una query
ResultSetMetaData
Informacin sobre las columnas del objeto ResultSet
Juan Pavn - UCM 2012-13
JDBC
Paquete [Link]
Interfaz con la aplicacin
Correspondencia de tipos SQL con clases e interfaces de Java
Array SQL ARRAY
Blob SQL BLOB
Clob SQL CLOB
Date SQL DATE
NClob SQL NCLOB
Ref SQL REF
RowId SQL ROWID
Struct SQL STRUCT
SQLXML SQL XML
Time SQL TIME
Timestamp SQL TIMESTAMP
Clase Types constantes para tipos SQL
Correspondencia de tipos SQL definidos por el usuario a Java
SQLData
SQLInput
SQLOutput
Juan Pavn - UCM 2012-13
JDBC
Correspondencia de tipos SQL Java
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
Juan Pavn - UCM 2012-13
boolean
byte
short
int
long
double
float
double
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
byte []
byte []
JDBC
Paquete [Link]
Interfaz con la aplicacin
Para obtener informacin de la BD (metadatos)
DatabaseMetaData
Informacin sobre la BD
try{
DatabaseMetaData infoBD=[Link]();
[Link]("Basededatos:"+[Link]());
[Link]("Version:"+[Link]());
}catch(Exception ex){
//Tratarelerror
}
Juan Pavn - UCM 2012-13
JDBC
Programacin con JDBC
Secuencia normal:
Establecer la conexin con la BD
Cargar controladores (si se usa una versin de Java inferior a la 6)
Establecer la conexin
Crear un objeto Statement para hacer peticin a la BD
Asociar una sentencia SQL al objeto Statement
Proporcionar valores de los parmetros
Ejecutar el objeto Statement
Procesar los resultados
Liberar recursos (cerrar la conexin)
Si es necesario, se pueden ejecutar varias instrucciones dentro
de una transaccin (propiedades ACID)
Abrir transaccin
Crear y ejecutar instrucciones
Procesar resultados
Cerrar transaccin
Juan Pavn - UCM 2012-13
JDBC
Establecimiento de conexin con la BD
Registrar un controlador
Registro de un controlador para MySQL
Los DriverManager se encargan de gestionar la conexin y todas las
comunicaciones con la BD
Necesitan conocer los controladores especficos para las BD que se
vayan a utilizar
Utilizar el controlador MySQL Connector/J
Disponible en: [Link]
Cmo instalarlo:
[Link]
El controlador se puede registran con el Class loader de Java
La clase a cargar viene dada en la documentacin del controlador
try{
[Link]("[Link]").newInstance();
}catch(Exception ex){
//Tratarelerror
}
Juan Pavn - UCM 2012-13
JDBC
Establecimiento de conexin con la BD
Los controladores se identifican con un URL JDBC de la forma
jdbc:subprotocolo:localizadorBD
El subprotocolo indica el tipo de base de datos especfico
El localizador permite referenciar de forma nica una BD
Host y opcionalmente puerto
Nombre de la base de datos
La conexin a la BD se hace con el mtodo getConnection()
public static Connection getConnection(String url)
public static Connection getConnection(String url, String user, String
password)
public static Connection getConnection(String url, Properties info)
Todos pueden lanzar la excepcin SQLException
try{
conexion =[Link](
"jdbc:mysql://localhost/tienda","pruebas","pruebas");
}catch(SQLException ex){
//Tratarelerror
}
Juan Pavn - UCM 2012-13
JDBC
10
Crear y ejecutar operaciones en la BD
Statement
Encapsula las instrucciones SQL a la BD
Se crea a partir de la conexin
instruccion =[Link]();
Mtodos
executeQuery(String sql)
Ejecucin de consultas: SELECT
Devuelve un objeto ResultSet
executeUpdate(String sql)
Modificaciones en la BD: INSERT, UPDATE, DELETE
Devuelve el nmero de columnas afectadas
execute(String sql)
Ejecucin de instrucciones que pueden devolver varios conjuntos de
resultados
Requiere usar luego getResultSet() o getUpdateCount() para recuperar los
resultados, y getMoreResults() para ver los siguientes resultados
Juan Pavn - UCM 2012-13
JDBC
11
Crear y ejecutar operaciones en la BD
ResultSet
Encapsula el conjunto de resultados
Para obtener el valor de cada campo hay que usar el mtodo
getX("campo") correspondiente al tipo del valor SQL:
getInt
INTEGER
getLong
BIG INT
getFloat
REAL
getDouble
FLOAT
getBignum
DECIMAL
getBoolean
BIT
getString
VARCHAR
getString
CHAR
getDate
DATE
getTime
TIME
getTimesstamp
TIME STAMP
getObject
cualquier otro tipo
Para pasar al siguiente registro se usa el mtodo next()
Devuelve false cuando no hay ms registros
Juan Pavn - UCM 2012-13
JDBC
12
Crear y ejecutar operaciones en la BD
Ejemplo (se usa la BD tienda del tema de PHP y MySQL)
try{
Statement instruccion =[Link]();
String query ="SELECT*FROMclientesWHEREnombreLIKE\"Empresa%\"";
ResultSet resultados=[Link](query);
[Link]("Listadodeclientes:");
while ([Link]()) {
[Link]("Cliente"+[Link]("nif")
+",Nombre:"+[Link]("nombre")
+",Telfono:"+[Link]("telefono"));
}
}catch(Exception ex){
[Link]();
}
Juan Pavn - UCM 2012-13
JDBC
13
Crear y ejecutar operaciones en la BD
ResultSet
Por defecto solo se puede recorrer hacia delante
Se pueden prever otras formas de utilizarlo al crear el objeto
Statement:
createStatement(int resultSetType,int resultSetConcurrency)
resultSetType:
TYPE_FORWARD_ONLY: slo hacia delante con next()
TYPE_SCROLL_INSENSITIVE: mtodos de posicionamiento habilitados
TYPE_SCROLL_SENSITIVE: mtodos de posicionamiento habilitados pero
sensible a las operaciones que se puedan hacer a los datos del ResultSet
Movimiento hacia atrs: afterLast(), previous()
Posicionamiento absoluto: first(), last(), absolute(numFila)
Posicionamiento relativo: relative(num)
Recupera fila actual: getRow()
resultSetConcurrency
ResultSet.CONCUR_READ_ONLY: El objeto ResultSet no se puede modificar
ResultSet.CONCUR_UPDATABLE: El objeto ResultSet se puede modificar
Juan Pavn - UCM 2012-13
JDBC
14
Crear y ejecutar operaciones en la BD
ResultSetMetaData
Permite obtener informacin sobre un ResultSet: metadatos
try{
Statement instruccion =[Link]();
String query ="SELECT*FROMclientes";
ResultSet resultados=[Link](query);
ResultSetMetaData infoResultados =[Link]();
int col=[Link]();
[Link]("Estructuradelatablaclientes:");
for (int i=1;i<=col;i++){
[Link]("Campo"+[Link](i)+"\t"
+"Tipo:"+[Link](i));
}
}catch(Exception ex){
[Link]();
}
Juan Pavn - UCM 2012-13
JDBC
15
Crear y ejecutar operaciones en la BD
Se pueden consultar de forma genrica los resultados sin conocer
su estructura previamente
try{
Statement instruccion =[Link]();
String query ="SELECT*FROMclientes";
ResultSet resultados=[Link](query);
ResultSetMetaData infoResultados =[Link]();
int col=[Link]();
while ([Link]()){
for (int i=1;i<=col;i++)
[Link]([Link](i) +"\t");
[Link]("");
}
}catch(Exception ex){
[Link]();
}
Juan Pavn - UCM 2012-13
JDBC
16
Instrucciones preparadas
PreparedStatement
Cuando se van a ejecutar instrucciones repetidamente, se puede
precompilar en la BD y ganar eficiencia
Primero se define el modelo de instruccin preparada
PreparedStatement ps =
[Link]("INSERTINTOclientes VALUES(?,?,?,?)");
Cada parmetro se representan con el smbolo de interrogacin ?
Luego se puede utilizar repetidamente simplemente indicando los
parmetros con mtodos setX(posicin, valor)
El mtodo depende del tipo de parmetro
La posicin comienza en 1
executeUpdate devolver la cantidad de elementos insertados
[Link](1,nif);
[Link](2,nombre);
[Link](3,direccion);
[Link](4,email);
if([Link]()!=1)
thrownewException("ErrorenlaInsercin");
Juan Pavn - UCM 2012-13
JDBC
17
Excepciones
SQLException
Es obligatorio capturar estas excepciones
Se puede obtener informacin adicional sobre el error
getMessage()
Mensaje de error de la excepcin
getSQLState()
Texto de SQLstate segn la convencin X/Open o SQL:2003
getErrorCode()
Cdigo de error (entero) especfico del vendedor
Hay muchas subclases: BatchUpdateException, RowSetWarning,
SerialException, SQLClientInfoException, SQLNonTransientException,
SQLRecoverableException, SQLTransientException, SQLWarning,
SyncFactoryException, SyncProviderException
SQLWarning
No es obligatorio capturar estas excepciones
Errores leves de objetos Connection, Statement, o ResultSet
DataTruncation
Subclase de SQLWarning
Avisos de truncado de datos en operaciones de lectura o escritura
Juan Pavn - UCM 2012-13
JDBC
18
Liberar recursos
Normalmente en la clusula finally para asegurar que se ejecuta
Usando el mtodo close()
finally {
try{
if (resultados!=null){//liberarlosResultSet
[Link]();
}
if (instruccion !=null){//liberarlosStatement
[Link]();
}
if (conexion !=null){//liberarlaconexinalaBD
[Link]();
}
}catch(Exception e){
[Link]();
}
}
Juan Pavn - UCM 2012-13
JDBC
19
Transacciones
En entornos multiusuario (por ejemplo, para aplicaciones web)
hay que controlar el acceso concurrente a la BD para evitar
inconsistencias
Transaccin: unidad de trabajo lgica
La interfaz Connection ofrece mtodos para las transacciones
Un conjunto de instrucciones sobre la BD
Si algo va mal, hacer marcha atrs al estado anterior
Si todo va bien, hacer efectivos los cambios
commit()
Hace efectivos todos los cambios desde el ltimo commit/rollback
Libera los bloqueos de la BD que tuviera el objeto Connection
rollback()
Deshace todos los cambios realizados en la transaccin
Libera los bloqueos de la BD que tuviera el objeto Connection
Por defecto se funciona en modo autocommit
Cada instruccin sobre la BD va en su propia transaccin
Es seguro pero ineficiente
Juan Pavn - UCM 2012-13
JDBC
20
Transacciones
Por defecto se funciona en modo autocommit
Cada instruccin sobre la BD va en su propia transaccin
Es seguro pero ineficiente
Se desactiva con
[Link](false)
Para gestionar explcitamente las transacciones (con autocommit
false), la interfaz Connection ofrece los mtodos
commit()
Hace efectivos todos los cambios desde el ltimo commit/rollback
Libera los bloqueos de la BD que tuviera el objeto Connection
rollback()
Deshace todos los cambios realizados en la transaccin
Libera los bloqueos de la BD que tuviera el objeto Connection
Se pueden crear puntos de recuperacin (savepoints)
Savepoint setSavepoint(String name)
Permite hacer commit parciales para volver a este punto si fuera
necesario con rollback(savepoint)
Juan Pavn - UCM 2012-13
JDBC
21
Transacciones
setTransactionIsolation(int level)
Intenta establecer un nivel de aislamiento para la transaccin en una
conexin
Depender de lo que se haga que se elige un nivel u otro para evitar
problemas y permitir la mayor eficiencia
TRANSACTION_NONE
Otras transacciones no soportadas
TRANSACTION_READ_UNCOMMITED
Transaccin que puede ver los cambios de otra transaccin antes de commit
Permite lecturas sucias, no repetibles y fantasmas
TRANSACTION_READ_COMMITED
La lectura de datos antes de commit no est permitida
Permite lecturas no repetibles y fantasmas
TRANSACTION_REPEATABLE_READ
Indica que se pueda leer el mismo dato sin fallar
Permite lecturas fantasmas
TRANSACTION_SERIALIZABLE
Transaccin de nivel ms alto
No permite lecturas sucias, fantasmas ni no repetibles
La ms segura pero menor rendimiento
Juan Pavn - UCM 2012-13
JDBC
22
JDBC en aplicaciones Web
Es similar salvo que
Normalmente se genera cdigo HTML
Hay que gestionar la concurrencia (transacciones)
Hibernate
Tal como dicen en su web ([Link]
Inicialmente trataban de facilitar el almacenamiento y recuperacin
de objetos Java en BD relacionales con un Object/Relational Mapping
(ORM)
Actualmente son varios proyectos que permiten usar modelos de
objetos ms all de ORM
Juan Pavn - UCM 2012-13
JDBC
23
Bibliografa
The Java Tutorial. A practical guide to programmers.
[Link]
Trail: JDBC(TM) Database Access
Java API documentation
Juan Pavn - UCM 2012-13
JDBC
24