Está en la página 1de 15

JDBC MySQL y Java

Julio 2004. Universitat de València

Índice
1. Introducción 1
1.1. JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Arquitecturas tı́picas con JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2. Programacion con JDBC 4


2.1. La clase con el controlador y el URL a la Base de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2. Realización de la conexión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3. Obtención de metadatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4. Ejecución de sentencias SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4.1. La interfaz Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4.2. La interfaz PreparedStatement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5. Obtención de los resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

1. Introducción

¿Qué vamos a necesitar?

Un sistema gestor de base de datos que permita la conexión mediante JDBC (MySQL)

Las clases del driver para JDBC

Una plataforma Java y su documentación (J2SE 1.4.2)

Un editor para Java (Eclipse 2.1.3 que es más que un editor para Java...)

¿Donde se pueden obtener?

J2SE: java.sun.com
Eclipse: www.eclipse.org
MySQL: www.mysql.org

Obtención de las clases que representan el driver.

En la dirección:

http://dev.mysql.com/downloads/connector/j/3.0.html

Se obtiene el archivo

mysql-connector-java-3.0.14-production.zip

Página: 1
JDBC MySQL y Java
Julio 2004. Universitat de València

Al descomprimirlo aparece (entre otros) el archivo

mysql-connector-java-3.0.12-production.jar

Este fichero debe estar en un sitio visible para Java tanto al compilar la aplicación como al ejecu-
tarla.

j a v a c − c l a s s p a t h mysql−c o n n e c t o r −ja va −3.0.12 − p r o d u c t i o n . j a r ; . A p l i c a c i o n . j a v a

j a v a − c l a s s p a t h mysql−c o n n e c t o r −ja va −3.0.12 − p r o d u c t i o n . j a r ; . A p l i c a c i o n

1.1. JDBC

JDBC: Java DataBase Connectivity (Conexión con Bases de Datos mediante Java).

¿Qué es JDBC? es una biblioteca de clases que permite la conexión con Bases de Datos que soporten
SQL utilizando Java.

Permite realizar operaciones (consultas, actualizaciones, ...) sobre bases de datos relacionales uti-
lizando SQL (Structured Query Language).

¿Que ventajas ofrece acceder a la base de datos utilizando JDBC y Java? Que la aplicación será in-
dependiente de la plataforma y que se puede mover la aplicación de un sistema gestor de bases de
datos a otro (por ejemplo de Oracle a MySQL o a Microsoft SQL Server o a...).

Los controladores JDBC se pueden clasificar como:

Controladores tipo 1: traducen JDBC a ODBC y se delega en ODBC para la comuni-


cación con la base de datos. Sun incluye uno de estos controladores con el J2SE.

Controlador tipo 2: está escrito parcialmente en Java y en código nativo.

Controlador tipo 3: es una biblioteca cliente escrita completamente en Java que utiliza
un protocolo independiente de la BD para comunicar las peticiones a un servidor que
las traduce a un protocolo especı́fico de la Base de Datos.

Controlador tipo 4: es una biblioteca escrita completamente en Java que traduce las
peticiones a un protocolo especı́fico de la Base de Datos.

Resumiendo:

Página: 2
JDBC MySQL y Java
Julio 2004. Universitat de València

Mediante JDBC se pueden escribir aplicaciones Java en las que se puede acceder a
Bases de Datos utilizando sentencias SQL estándar.

Las clases proporcionadas en los paquetes java.sql y javax.sql definen el API JDBC.

Sun ofrece únicamente un controlador del tipo 1 (puente JDBC/ODBC).

Los distribuidores de Bases de Datos pueden ofrecer los controladores optimizándolos


para sus productos.

1.2. Arquitecturas tı́picas con JDBC

El cliente se conecta directamente a la Base de Datos

Servidor
Cliente JDBC de la BD

Protocolo de la BD

La desventaja que tiene esta arquitectura es que la Base de Datos es directamente accesible y es
complicado el control sobre el tipo de consultas que se pueden realizar.

Página: 3
JDBC MySQL y Java
Julio 2004. Universitat de València

Arquitectura básica de tres capas:

Cliente Capa intermedia Servidor


(Presentacion) (Lógica empresarial) JDBC de la BD

HTTP, RMI, ... Protocolo de la BD

La ventaja es que la Base de Datos queda oculta tras la capa intermedia. Es mucho más fácil
controlar el tipo de consultas (ya que estas se realizan desde la capa intermedia sobre la que se
tiene pleno control).

2. Programacion con JDBC

Los pasos a realizar para utilizar JDBC en una aplicación Java son los siguientes:

1. Cargar la clase que representa al controlador

2. Establecer una conexión

3. Ejecución de sentencias SQL

4. Obtención de los resultados

5. Cerrar la conexión

2.1. La clase con el controlador y el URL a la Base de Datos

En el paquete java.sql se define la interfaz

public interface Driver

Esta es la interfaz que cualquier controlador que utilicemos debe implementar.

Página: 4
JDBC MySQL y Java
Julio 2004. Universitat de València

Lo primero que hemos de hacer es ver cual es la clase que implementa a esta interfaz en el contro-
lador JDBC que vamos a utilizar:

Por ejemplo, en el controlador proporcionado por MySQL la clase es


com.mysql.jdbc.Driver

En el controlador proporcionado para la conexión con DB2 la clase a utilizar es


COM.ibm.db2.jdbc.app.DB2Driver).

Una vez identificado el controlador debe ser registrado para poder ser utilizado en la aplicación.

Existen dos posibilidades:

Como un argumento pasado a la máquina virtual desde la lı́nea de órdenes


j a v a −Djdbc . d r i v e r s=com . mysql . j d b c . D r i v e r A p l i c a c i o n

En el código de la aplicación mediante la siguiente sentencia:


C l a s s . forName ( ”com . mysql . j d b c . D r i v e r ” ) ;

Por supuesto, al inicio de nuestra aplicación debe aparecer (al menos) la siguiente biblioteca de
clases:
import java . s q l . ∗ ;

El siguiente paso es construir una URL a la base de datos para JDBC.

El formato es el siguiente:

j d b c : nombre : o t r o s e l e m e n t o s

Estos otros elementos dependen del controlador.

Por ejemplo, el formato de URL para MySQL serı́a el siguiente:


j d b c : mysql : / / [ h o s t ] [ : p o r t ] / [ d a t a b a s e ] [ ? propName1 ] [ = propValue1 ] [ & propName2 ] [ = propValue2 ] . . .

Ejemplos:
j d b c : mysql : / / l o c a l h o s t : 3 3 0 6 / L i b r o s ? u s e r=u s u a r i o&password=c l a v e

Se especifica que la base de datos está en la máquina local, que el puerto donde escucha mysql es
el 3306, que la base de datos a utilizar es Libros, que el usuario es usuario y que el password es clave

Página: 5
JDBC MySQL y Java
Julio 2004. Universitat de València

j d b c : mysql : / / e p i . uv . e s : 3 3 0 6 / V i a j e s ? u s e r=admin&password=admin48

Se especifica que la base de datos está en la máquina cuyo nombre es epi.uv.es, que el puerto donde
escucha mysql en esa máquina es el 3306, que la base de datos a utilizar es Viajes, que el usuario es
admin y que el password es admin48

2.2. Realización de la conexión

Una vez que se ha registrado la clase del controlador se puede una instancia de Connection.

Para ello se utiliza el método estático getConnection() de la clase DriverManager.1

p u b l i c s t a t i c C o n n e c t i o n g e t C o n n e c t i o n ( S t r i n g u r l ) t h r o w s SQLException

Cuando se llama a este método, el DriverManager intentará localizar un controlador apropiado entre
los que se hayan registrado.

La siguiente porción de código muestra cómo se puede realizar esto:

...
try {

C l a s s . forName ( ”com . mysql . j d b c . D r i v e r ” ) ;

S t r i n g u r l = ” j d b c : mysql : / / l o c a l h o s t : 3 3 0 6 / e s t a n c i a s ? u s e r=u s u a r i o&password=c l a v e ” ;

C o n n e c t i o n conn = DriverManager . g e t C o n n e c t i o n ( u r l ) ;

// R e a l i z a r a l g o con l a c o n e x i o n

...
} c a t c h ( SQLException ex ) {
// h a n d l e any e r r o r s
System . out . p r i n t l n ( ” SQLException : ” + ex . g e t M e s s a g e ( ) ) ;
System . out . p r i n t l n ( ” SQLState : ” + ex . getSQLState ( ) ) ;
System . out . p r i n t l n ( ” VendorError : ” + ex . g e t E r r o r C o d e ( ) ) ;
}
...

2.3. Obtención de metadatos

Mediante la interfaz DatabaseMetaData es posible obtener información del sistema gestor de bases
de datos o de una determinada base de datos.
1
La interfaz DataSource, nueva en JDBC 2.0, proporciona otra forma de conectarse con una fuente de datos. El uso
de un objeto DataSource es el método recomendado para conectarse a una fuente de datos desde una aplicación web.

Página: 6
JDBC MySQL y Java
Julio 2004. Universitat de València

Utilizando esta clase se podrı́an obtener las capacidades de un determinado sistema gestor de bases
de datos.

Esta clase dispone de entre otros (consúltese el API para un listado completo) los siguientes
métodos:

p u b l i c S t r i n g getDatabaseProductName ( )
Nombre d e l SGBD

p u b l i c String getDatabaseProductVersion ( )
V e r s i ó n d e l SGBD

p u b l i c S t r i n g getDriverName ( )
Nombre d e l c o n t r o l a d o r

public String getDriverVersion ()


V e r s i ó n d e l c o n t r o l a d o r

p u b l i c R e s u l t S e t g e t C a t a l o g s ( ) t h r o w s SQLException
L i s t a d o de l a s b a s e s de d a t o s e x i s t e n t e s

p u b l i c R e s u l t S e t g e t T a b l e s ( S t r i n g c a t a l o g , S t r i n g schemaPattern , S t r i n g tableNamePattern ,
String [ ] types )
L i s t a d o de l a s t a b l a s en una b a s e de d a t o s
Ejemplo : r e f e r e n c i a . g e t T a b l e s ( ” e s t a n c i a s ” , ” %” , ” %” , n u l l ) ; }

p u b l i c R e s u l t S e t ge tT a bl eT yp e s ( ) t h r o w s SQLException
L i s t a d o con l o s t i p o s de t a b l a s s o p o r t a d a s por e l SGBD

A continuación se muestra un ejemplo completo:

import java . s q l . ∗ ;

p u b l i c c l a s s Metadatos {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

try {
S t r i n g URL = ” j d b c : mysql : / / l o c a l h o s t : 3 3 0 6 / e s t a n c i a s ? u s e r=u s u a r i o&password=c l a v e ” ;

C o n n e c t i o n conn = DriverManager . g e t C o n n e c t i o n ( u r l ) ;

DatabaseMetaData meta = conn . getMetaData ( ) ;

System . out . p r i n t l n ( ” El SGBD e s : ” ) ;

System . out . p r i n t l n ( meta . getDatabaseProductName ( ) ) ;


System . out . p r i n t l n ( meta . g e t D a t a b a s e P r o d u c t V e r s i o n ( ) ) ;

conn . c l o s e ( ) ;

} c a t c h ( SQLException ex ) {
System . out . p r i n t l n ( ” SQLException : ” + ex . g e t M e s s a g e ( ) ) ;
System . out . p r i n t l n ( ” SQLState : ” + ex . getSQLState ( ) ) ;
System . out . p r i n t l n ( ” VendorError : ” + ex . g e t E r r o r C o d e ( ) ) ;
}

}
}

Página: 7
JDBC MySQL y Java
Julio 2004. Universitat de València

Las instrucciones para compilar y ejecutar han sido2

j a v a c − c l a s s p a t h m y s q l j d b c . j a r ; . Metadatos . j a v a

j a v a −Djdbc . d r i v e r s=com . mysql . j d b c . D r i v e r − c l a s s p a t h m y s q l j d b c . j a r ; . Metadatos

Ejercicio 1
Realizar una conexión con la base de datos de otra máquina y mostrar la siguiente información:

El nombre del SGBD

La versión

El nombre del controlador

La versión del controlador

2.4. Ejecución de sentencias SQL

La ejecución de sentencias en la base de datos a través de JDBC se realiza mediante las interfaces
Statement o PreparedStatement.

Los objetos de estos tipos se obtienen a partir del objeto de tipo Connection

2.4.1. La interfaz Statement

Mediante objetos de este tipo se pueden ejecutar sentencias SQL sencillas y obtener los resultados
mediante la clase ResulSet.

Para obtener un objeto del tipo Statement se llama al método createStatement() del objeto Connection.

Una vez que se dispone del objeto se pueden ejecutar sentencias SELECT (que no modifican las
tablas) utilizando el método
R e s u l S e t e x e c u t e Q u e r y ( S t r i n g SQL)

El resultado de la consulta se devuelve en un objeto del tipo ResultSet, es decir, para acceder a la
información habrá que utilizar los métodos de esta clase.

Para ejecutar sentencias que contengan UPDATE, INSERT o DELETE hay que utilizar el método
i n t e x e c u t e U p d a t e ( S t r i n g SQL)

Este método devuelve el número de filas afectadas por la sentencia.


2
Nota: he renombrado el fichero jar con el controlador para que tenga un nombre más corto.

Página: 8
JDBC MySQL y Java
Julio 2004. Universitat de València

Puede haber situaciones donde no se conoce de antemano si la sentencia SQL es de consulta o


de modificación (por ejemplo si se permite que el usuario introduzca la sentencia). En estos casos se
utiliza el método:
b o o l e a n e x e c u t e ( S t r i n g SQL)

Este método devuelve true si la sentencia contenı́a un SELECT y false en caso contrario.

Si la sentencia contenı́a un SELECT se pueden obtener los resultados llamando al método getRe-
sultSet() que devuelve un objeto del tipo ResulSet.

En caso contrario se puede obtener el número de filas afectadas llamando al método getUpdate-
Count().

Ejemplos:
...
Statement s = DriverManager . g e t C o n n e c t i o n ( u r l ) . c r e a t e S t a t e m e n t ( ) ;
ResulSet rs ;
S t r i n g s e n t e n c i a S Q L = ”SELECT ∗ FROM c a s a s ” ;
r s = s . executeQuery ( sentenciaSQL ) ;
...

...
Statement s = DriverManager . g e t C o n n e c t i o n ( u r l ) . c r e a t e S t a t e m e n t ( ) ;
i n t filasMod ;
S t r i n g s e n t e n c i a S Q L = ” update c a s a s s e t DispHasta = ’2004 −11 −30 ’ where IdCasa=7” ;
filasMod = s . executeUpdate ( sentenciaSQL ) ;
...

...
Statement s = DriverManager . g e t C o n n e c t i o n ( u r l ) . c r e a t e S t a t e m e n t ( ) ;
boolean tipoSentencia ;
B u f f e r e d R e a d e r br = new B u f f e r e d R e a d e r ( new InputStreamReader ( System . i n ) ) ;
s e n t e n c i a S Q L = br . r e a d L i n e ( ) ;
t i p o S e n t e n c i a = s . execute ( sentenciaSQL ) ;

i f ( tipoSentencia ){
ResulSet rs = s . getResultSet () ;
...
} else
i n t f i l a s M o d = s . getUpdateCount ( ) ;
...
}
...

2.4.2. La interfaz PreparedStatement

La interfaz PreparedStatement extiende a la interfaz Statement y utiliza una plantilla para crear la
sentencia SQL.

Se utiliza en aquellas situaciones en las que se necesita ejecutar varias veces una consulta en la
que pueden cambiar únicamente los parámetros. De esta forma (si el SGBD lo permite) se optimiza
la consulta una sola vez.

Página: 9
JDBC MySQL y Java
Julio 2004. Universitat de València

Par obtener un objeto del tipo PreparedStatement se llamará al método prepareStatement(.) del objeto
del tipo Connection.

A este método hay que pasarle la plantilla donde se especifican los lugares donde irán los paráme-
tros.

Los parámetros son después especificados utilizando los métodos setXXX(.) indicando el número de
parámetro y el dato a insertar en la sentencia.

La sentencia se ejecuta cuando se llama a los métodos executeQuery() o executeUpdate()

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:

...
C o n n e c t i o n con = DriverManager . g e t C o n n e c t i o n ( u r l ) ;
S t r i n g c o n s u l t a = ”SELECT u s u a r i o FROM r e g i s t r o WHERE e m a i l l i k e ? ” ) ;
P r e p a r e d S t a t e m e n t pstmt = con . p r e p a r e S t a t e m e n t ( c o n s u l t a ) ;

pstmt . s e t S t r i n g ( 1 , campoTexto . g e t T e x t ( ) ) ;
R e s u l t S e t r e s u l t a d o = ps . e x e c u t e Q u e r y ( ) ;
...

PreparedStatement de modificación

En el siguiente ejemplo se va a insertar un nuevo registro en una tabla

...
C o n n e c t i o n con = DriverManager . g e t C o n n e c t i o n ( u r l ) ;
S t r i n g i n s e r c i o n = ”INSERT INTO r e g i s t r o ( u s u a r i o , e m a i l , f e c h a N a c ) v a l u e s ( ? , ? , ? ) ” ) ;
P r e p a r e d S t a t e m e n t pstmt = con . p r e p a r e S t a t e m e n t ( c o n s u l t a ) ;

String user = . . . ;
String email = . . . ;
Date edad = . . . ;

pstmt . s e t S t r i n g ( 1 , u s e r ) ;
pstmt . s e t S t r i n g ( 2 , e m a i l ) ;
pstmt . s e t D a t e ( 3 , edad ) ;

ps . e x e c u t e U p d a t e ( ) ;
...

2.5. Obtención de los resultados

Como hemos visto en los ejemplos anteriores el resultado de una consulta es devuelto en un objeto
del tipo ResultSet.

Página: 10
JDBC MySQL y Java
Julio 2004. Universitat de València

Podemos imaginar que el resultado se devuelve en forma de tabla donde las filas corresponden a
los registros y las columnas a los datos.

Primero hay que colocarse en una determinada fila y a continuación acceder a la columna deseada.

Para ello, la clase ResultSet dispone de métodos para moverse en filas y de métodos para seleccionar
una determinada columna.

Algunos de los métodos disponibles para recorrer los registros son3 :

void beforeFirst ()

Posición por defecto, coloca el cursor antes del primer resultado.

void f i r s t ()

Coloca el cursor en la primera fila del resultado

void afterLast ()

Coloca el cursor en la después de la última fila del resultado.

void l a s t ()

Coloca el cursor en la última fila del resultado.

boolean next ( )

Avanza el cursor una posición.

boolean previous ()

3
Por defecto los objetos del tipo ResultSet no son actualizables y tienen un cursor que sólo puede ir hacia adelante.
Por tanto, se puede iterar a lo largo de él una sola vez y desde el inicio hasta el final. Es posible crear ResultSet que se
puedan actualizar y/o que permitan libertad de movimientos. Se verá más adelante

Página: 11
JDBC MySQL y Java
Julio 2004. Universitat de València

Retrocede el cursor una posición.

Para seleccionar columnas una vez que nos hemos colocado en un determinado registro se dispone
de dos conjuntos de métodos.

Por un lado métodos que reciben un entero (que indica el número de la columna) y por otro
métodos que reciben el nombre de la columna.

Por ejemplo si se desea obtener el valor de una columna que es de tipo float se dispone de los dos
métodos:

f l o a t g e t F l o a t ( i n t numeroColumna )

f l o a t g e t F l o a t ( S t r i n g nombreColumna )

Si el valor de la columna es de tipo int entonces disponemos de

i n t g e t I n t ( i n t numeroColumna )

i n t g e t I n t ( S t r i n g nombreColumna )

Se pueden obtener metadatos relacionados con el ResultSet utilizando el método getMetaData() que
devuelve un objeto del tipo ResultSetMetaData

Algunos de los métodos disponibles en esta clase son:

i n t getColumnCount ( )

Devuelve el número de columnas que hay en el ResultSet.

S t r i n g getColumnName ( i n t column )

Obtiene el nombre de la columna cuyo número de orden se pasa como parámetro.

S t r i n g getColumnTypeName ( i n t column )

Obtiene el tipo de dato que hay en una determinada columna.

Ejemplo:
import java . s q l . ∗ ;

p u b l i c c l a s s EjemploResultSet {

Página: 12
JDBC MySQL y Java
Julio 2004. Universitat de València

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

try {
S t r i n g u r l = ” j d b c : mysql : / / l o c a l h o s t : 3 3 0 6 / e s t a n c i a s ? u s e r=u s u a r i o&password=c l a v e ” ;

C l a s s . forName ( ”com . mysql . j d b c . D r i v e r ” ) ;

C o n n e c t i o n con = DriverManager . g e t C o n n e c t i o n ( u r l ) ;
Statement s = con . c r e a t e S t a t e m e n t ( ) ;
ResultSet resultado ;
S t r i n g s e n t e n c i a S Q L = ”SELECT Ciudad , DispDesde , DispHasta FROM c a s a s ” ;
r e s u l t a d o = s . executeQuery ( sentenciaSQL ) ;

ResultSetMetaData rsmd = r e s u l t a d o . getMetaData ( ) ;

System . out . println () ;


System . out . p r i n t l n ( ”Numero de columnas : ” + rsmd . getColumnCount ( ) ) ;
System . out . p r i n t l n ( ”Nombre de l a p r i m e r a columna : ” + rsmd . getColumnName ( 1 ) ) ;
System . out . p r i n t l n ( ” Tipo de l a p r i m e r a columna : ” + rsmd . getColumnTypeName ( 1 ) ) ;
System . out . println () ;

resultado . beforeFirst () ;

w h i l e ( r e s u l t a d o . next ( ) ) {
S t r i n g c i u = r e s u l t a d o . g e t S t r i n g ( ” Ciudad ” ) ;
j a v a . s q l . Date f e c h 1 = r e s u l t a d o . g e t D a t e ( ” DispDesde ” ) ;
j a v a . s q l . Date f e c h 2 = r e s u l t a d o . g e t D a t e ( ” DispHasta ” ) ;
System . out . p r i n t ( ” Casa en : ” + c i u ) ;
System . out . p r i n t ( ” Desde : ” + f e c h 1 ) ;
System . out . p r i n t ( ” Hasta : ” + f e c h 2 ) ;
System . out . p r i n t l n ( ) ;
}

con . c l o s e ( ) ;

} c a t c h ( SQLException ex ) {
System . out . p r i n t l n ( ” SQLException : ” + ex . g e t M e s s a g e ( ) ) ;
System . out . p r i n t l n ( ” SQLState : ” + ex . getSQLState ( ) ) ;
System . out . p r i n t l n ( ” VendorError : ” + ex . g e t E r r o r C o d e ( ) ) ;
} c a t c h ( ClassNotFoundException e ) {
System . out . p r i n t l n ( ”No s e e n c u e n t r a e l c o n t r o l a d o r ” ) ;
}
}
}

Equivalencia tipos de datos SQL y Java

Tipo de dato SQL Tipo de dato Java


INTEGER o INT int
SMALLINT short
NUMERIC(m,n), DECIMAL(m,n) o DEC(m,n) java.sql.Numeric
FLOAT(n) double
REAL float
DOUBLE double
CHARACTER(n) o CHAR(n) String
VARCHAR(n) String
BOOLEAN boolean
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
BLOB java.sql.Blob
ARRAY java.sql.Array

Ojo, puede que alguno de los tipos de la izquierda no estén soportados por todas las Bases de

Página: 13
JDBC MySQL y Java
Julio 2004. Universitat de València

Datos (y puede que añadan alguno más).

Ejercicio 2
Realizar una consulta en la que se muestren las familias del Reino Unido donde el precio de
estancia por dı́a sea menor o igual a 18 euros y que muestre por pantalla el nombre de la familia,
la ciudad y el tipo de casa.

Ejercicio 3
Debido a la devaluación de la libra esterlina respecto al euro se desea incrementar en un 5 por
ciento el precio por dı́a de todas las casas del Reino Unido. Realizar la actualización de los
precios.

Las versiones anteriores a JDBC 2.0 devolvı́an los resultados con cursores que sólo podı́an ir hacia
adelante. Cada elemento se obtenı́a llamando al método next().

A partir de JDBC 2.0 se puede recorrer el resultado en las dos direcciones y se puede actualizar el
resultado si esta operación está soportada por la base de datos.

Una ventaja es que se pueden actualizar una serie de columnas sin necesidad de enviar ninguna
llamada executeUpdate(). La actualización se realiza de forma automática.

A la hora de obtener tanto un Statement como un PreparedStatement es posible especificar (si la


base de datos lo acepta) el tipo de desplazamiento deseado y si se desea que las modificaciones en el
resultado se reflejen en la base de datos.
// Supongo que conn e s d e l t i p o Connexion

// Para c r e a r un S t a t e m e n t
Statement stmt = conn . c r e a t e S t a t e m e n t ( i n t t i p o R e s u l t a d o , i n t t i p o A c t u a l i z a c i o n ) ;

// Para c r e a r un P r e p a r e d S t a t e m e n t
P r e p a r e d S t a t e m e n t pstmt = conn . p r e p a r e S t a t e m e n t ( S t r i n g s q l , i n t t i p o R e s u l t a d o , i n t
tipoActualizacion ) ;

El valor para el tipo de resultado puede ser:

ResultSet.TYPE FORWARD ONLY sólo se puede avanzar

ResultSet.TYPE SCROLL SENSITIVE se puede recorrer en cualquier dirección y las actua-


lizaciones se reflejan en cuanto se producen.

ResultSet.TYPE SCROLL INSENTITIVE se puede recorrer en cualquier dirección pero las


actualizaciones no son visibles hasta que no vuelva a realizar una consulta.

El valor para el tipo de actualización puede ser

Página: 14
JDBC MySQL y Java
Julio 2004. Universitat de València

ResultSet.CONCUR READ ONLY el resultado es únicamente de lectura

ResultSet.CONCUR UPDATABLE el resultado es acutalizable

Es posible verificar si la Base de Datos soporta estos tipos utilizando el siguiente método

// Supongo que conn e s d e l t i p o Connexion


i n t tipoResultado = ResultSet . . . . ;
i n t tipoActualizacion = ResultSet . . . . ;
b o o l e a n e s P o s i b l e = conn . getMetaData ( ) . s u p p o r t s R e s u l t S e t C o n c u r r e n c y ( t i p o R e s u l t a d o ,
tipoActualizacion ) ;

En cuanto a la actualización del resultado se pueden utilizar los métodos updateTIPO(.) (donde
TIPO es el tipo de dato a actualizar) que ofrece la interfaz ResultSet.

A continuación se envı́a el mensaje updateRow() al objeto del tipo ResultSet para que actualice la
fila en la base de datos.

Por ejemplo, el siguiente código se puede utilizar para modificar el valor de la fecha en el resultado
y actualizar la base de datos:

// Asumo que r s e s una r e f e r e n c i a d e l t i p o R e s u l t S e t

r s . a b s o l u t e ( 5 ) ; // mueve e l c u r s o r a l a fila 5

// a c t u a l i z a l a f e c h a en e l R e s u l t S e t
r s . updateDate ( ” Fecha ” , ”2004−04−01” ) ;

// A c t u a l i z a l a f e c h a en l a b a s e de d a t o s para e l
// r e g i s t r o s e l e c c i o n a d o
r s . updateRow ( ) ;

Ejercicio 4
Realizar la actualización de los precios del ejercicio 3 del siguiente modo:
Crear un Statement en el que se permita el movimiento en cualquier dirección y en el que las
actualizaciones se reflejan en cuanto se producen y además que el resultado sea actualizable.
Ejecutar una sentencia de consulta en la que se seleccione el pais y el precio de todas las casas.
Recorrer el ResultSet obtenido mostrando el pais y el precio y si además el pais es el Reino Unido
actualizar el precio por dı́a subiéndolo un 5 por ciento.

Finalmente antes de abandonar la aplicación se cierra la conexión utilizando el método close() de


Connection.

Página: 15

También podría gustarte