You are on page 1of 21

EJERCICIO GUIADO. JAVA.

ACCESO A BASE DE DATOS


Acceso a Base de Datos desde una aplicacin Java
El objetivo de todas las hojas guiadas anteriores dedicadas a las bases de datos, es
finalmente aprender a crear un fichero que contenga toda la informacin que la empresa
necesita gestionar. Es decir, crear un fichero de base de datos.
Este fichero se incluir con el programa java que se realice. Nuestro programa java acceder
a este fichero continuamente para aadir nuevos datos, o modificar datos, eliminar datos, o
extraer datos segn lo ordene el usuario del programa.
En esta hoja guiada, se vern los pasos necesarios para conectar un proecto java con un
fichero de base de datos creado en !ccess.
Pasos Geneales paa pepaa una Aplicacin Java paa accede a una Base de Datos
"ara preparar nuestra aplicacin #ava para que pueda acceder a una $ase de %atos, es
necesario reali&ar tres pasos'
!. Ca"a el contolado de la #ase de datos.
El controlador define el tipo de base de datos que se va a usar (base de datos de !ccess, o
de )*+,, o de cualquier otro gestor de base de datos-
En nuestro caso, tendremos que indicar el controlador para base de datos de !ccess.
$. Cea un o#%eto cone&in 'Connection(
"ara crear este objeto ha que indicar la situacin del fichero de base de datos, el usuario
la contrasea de dicha base de datos. El objeto conexin abre el fichero de la base de datos.
). Cea un o#%eto sentencia 'Statement(
El objeto sentencia se crea a partir del objeto conexin anterior. ,os objetos sentencia
permiten reali&ar acciones sobre la base de datos usando instrucciones *+,.
Es decir, a trav.s del objeto sentencia introduciremos datos en la base de datos,
eliminaremos datos, haremos modificaciones, extraeremos datos de la base de datos.
!s/ pues, este objeto es vital. Este objeto es el que realmente permite el acceso a los datos
de la base de datos la manipulacin de dicha base de datos.
EJERCICIO GUIADO *+ !
PLANTEAMIENTO
En este ejercicio se pretende crear una pequea aplicacin de bases de datos que permita
simplemente mostrar los datos de los trabajadores almacenados en la base de datos
)!NE)"*!.
0. Entre en Net$eans. 1rea un nuevo proecto llamado AccesoBD. %entro de este
proecto crea un paquete principal llamado paqueteprincipal dentro de .l un
#2rame llamado ventanaprincipal'
3. En la parte superior de la ventana aade un botn con el texto Ver Datos
Trabajadores que se llame btnVerDatos.
4. *e pretende simplemente que al pulsar el botn btnVerDatos apare&can en un
#5ption"ane datos sobre los trabajadores almacenados en la base de datos.
SITUACIN DEL FICHERO DE BASE DE DATOS
6. !ntes de empe&ar con la programacin de nuestra aplicacin, introduciremos el
fichero de base de datos en la carpeta del proecto java que estamos haciendo. "ara
ello, accede a la carpeta del proecto AccesoBD. Esta carpeta se encontrar all
donde est.s guardando tus proectos'

7. Entra dentro de esta carpeta observars una serie de carpetas creadas por el
propio Net$eans. (Entre ellas, la ms interesante es la llamada src, la cual es la que
contiene los ficheros con el cdigo java-
8. "ara tener todo bien organi&ado, crearemos una carpeta llamada $ase dentro de la
carpeta de proecto, de manera que su contenido quede as/'
9. !hora lo nico que tiene que hacer es copiar el fichero de base de datos
)!NE)"*!.)%$ que se encuentra en )is %ocumentos dentro de la carpeta $ase.
(,a extensin de los ficheros de base de datos de !ccess es )%$-
:. %e esta manera, tenemos el fichero de base de datos que hemos creado con !ccess
guardado dentro de la misma carpeta de proecto java que usar dicha base de
datos. *e recomienda que esto lo haga cada ve& que programe una aplicacin de
bases de datos #ava.
;. !hora a podemos volver al Net$eans continuar con nuestro trabajo.
PREPARACIN DE LA APLICACIN JAVA PARA EL ACCESO A LA BASE DE
DATOS
0<. "ara poder acceder manipular una base de datos, es necesario tener dos objetos'
= >n objeto del tipo Connection, al que llamaremos conexion. Este objeto define la
conexin con la base de datos.
= >n objeto del tipo Statement, al que llamaremos sentencia. Este objeto permite
manipular la base de datos.
00. !s/ pues, lo primero que haremos ser definir estos objetos como globales en la
clase de la ventana principal, para as/ poderlos usar desde cualquier lado'
!parecern subraados a que ser necesario indicar el import para las clases
Connection Statement. Estos import son respectivamente'
java.sql.Connection

java.sql.Statement
!grega los import correspondientes para eliminar los errores.
03. >na ve& definidos los objetos conexin sentencia, necesarios para el acceso a la
base de datos, prepararemos nuestro programa para que pueda acceder a la base de
datos )!NE)"*!.)%$. Esto se har en el constructor.
04. En primer lugar, aade al constructor una llamada a una funcin PrepararBaseDatos'
06. 1rea el m.todo PrepararBaseDatos debajo del constructor empie&a a programar lo
siguiente'
El cdigo que acabas de programar es el primer paso a reali&ar para el acceso a una
base de datos' ,a Ca"a del Contolado.
?ecuerda que el controlador le indica a #ava que tipo de base de datos usaremos'
!ccess, )*+,, etc@
El controlador que le indica al java que usaremos una base de datos de !ccess viene
definido a trav.s de la siguiente cadena de texto'
sun.jdbc.odbc.JdbcOdbcDriver
A la forma de activar dicho controlador es a trav.s de la instruccin'
Class.forName(controlador).newInstance();
%onde controlador es una variable de cadena que contiene la cadena anterior.
$sicamente, lo que hacen estas dos l/neas de cdigo, es preparar a #ava para
poder usar !ccess.
En el caso de que se quisiera usar una base de datos reali&ada en otro programa que
no fuera !ccess, habr/a que cambiar la cadena de texto correspondiente a su
controlador.
"or ejemplo, para usar una base de datos creada con el gestor de base de datos
)*+, se usa la cadena' com.mysql.jdbc.Driver.
En nuestro caso siempre usaremos !ccess.
Bambi.n puedes observar que es obligatorio encerrar el cdigo de la carga del
controlador entre tr @ catch para capturar cualquier error imprevisto.
07. !hora aade el siguiente cdigo a continuacin del anterior'

El cdigo que acabas de aadir se corresponde con el segundo paso para acceder a una base de
datos' Cea el o#%eto Cone&in.
El objeto conexin es el que efecta la conexin real con la base de datos. *e podr/a decir que es el
objeto que permite abrir la puerta del fichero de base de datos para entrar en .l. "ara construir este
objeto conexin (el cual a est declarado en la parte global de la clase- hacen falta tres datos'
El nombre del usuario que manipular la base de datos. En el caso de !ccess no necesitamos
indicar ningn nombre de usuario, por eso vers la instruccin'
Strin! user " #$;
El passCord del usuario que manipular la base de datos. En el caso de !ccess tampoco
necesitaremos ningn passCord, por eso vers la instruccin'
Strin! %assword " #$;
,a %*N de la base de datos. %*N significa Dnombre del origen de datosE es una cadena de texto
algo compleja que contiene informacin sobre el fichero de base de datos que queremos usar. ,a
parte inicial de la cadena de la %*N siempre ser igual para las bases de datos de !ccess'
&jdbc'odbc'Driver"()icrosoft *ccess Driver (+.mdb),;D-."&
*in embargo, lo que nos interesa realmente de esta cadena es su parte final, donde ha que indicar el
camino del fichero de base de datos al que accederemos. En nuestro caso, indicaremos el camino de
)!NE)"*!.)%$, el fichero de la base de datos.
5bserva como indicamos el camino del fichero' -ase//)*N0)1S*.)D-
$ase es la carpeta donde hemos guardado el fichero, dentro de nuestro proecto java,
)!NE)"*!.)%$ como a sabes es el fichero de !ccess que contiene la base de datos. 5bserva la
necesidad de escribir dos barras.
En el cdigo podrs ver la creacin de la %*N'
Strin! DSN " &jdbc'odbc'Driver"()icrosoft *ccess Driver (+.mdb),;D-."&2
&-ase//)*N0)1S*.)D-&;
2inalmente se usa la instruccin
cone3ion"Driver)ana!er.!etConnection(DSN4user4%assword);
para crear la conexin. *er necesario aadir un import para la clase DriverManager.
!l igual que con el primer paso, es necesario rodear la creacin de la conexin con un try5catc6
para capturar cualquier error inesperado que se pueda producir en este paso.
08. !hora aade el siguiente cdigo a continuacin del anterior'
Este cdigo que acabas de aadir se corresponde con el tercer paso necesario para poder
acceder a una base de datos' Ceacin del o#%eto Sentencia.
El objeto sentencia ser el que nos permita ejecutar rdenes *+, sobre la base de datos. Es
decir, el objeto que nos permite actuar manipular la base de datos. Este objeto es vital,
es el objetivo de toda esta preparacin.
El objeto sentencia se crea a partir del objeto conexin creado en el paso anterior, usando la
siguiente instruccin'
sentencia"cone3ion.createStatement(
7esultSet.8910:SC7O;;:INS0NSI8I<04
7esultSet.CONC=7:70*D:ON;9);
A como sucedi en los dos pasos anteriores, es necesario rodear esta instruccin con un
tr@catch para capturar cualquier tipo de error inesperado que se pudiera producir.
09. !s/ pues a tenemos preparado nuestro programa para acceder a la base de datos.
Esta preparacin se reali&a en el momento en que se ejecuta el programa, a que
hemos introducido este cdigo en el constructor.
Es cierto que este cdigo puede resultar bastante abstracto complejo, pero tiene la
gran ventaja de que siempre es igual.
"ara nuestros ejercicios, solo tendremos que cambiar el nombre de la base de datos
que se est. usando en ese momento. El resto del cdigo queda igual.
5bserva'
0:. El objetivo de todo este cdigo de preparacin para el acceso al fichero de la base de
datos es obtener un objeto llamado sentencia que nos posibilitar la manipulacin de
los datos de la base de datos, usando rdenes *+,.
En este ejercicio guiado usaremos el objeto sentencia para averiguar informacin
acerca de los trabajadores.
El m.todo PrepararBaseDatos
siempre ser igual, solo cambiar el
nombre de la base de datos a usar.
REALIZAR CONSULTAS SQL USANDO EL OBJETO SENTENCIA
0;. 1uando se pulse el botn Ver Datos de Trabajadores tendremos que extraer los
datos de la tabla trabajadores para poder mostrarlos. "ara ello, escribe el siguiente
cdigo dentro del evento actionPerormed del botn btnVerDatos'
5bserva el cdigo'
7esultSet r " sentencia.e3ecute.uery(#select + from trabajadores order by nombre$);
El objeto sentencia se usa para dar rdenes a la base de datos. Esas rdenes se dan
usando el lenguaje de consulta *+,.
*e usa el m.todo execute!uer" del objeto sentencia para ejecutar la consulta *+,
Dselect * from trabajadores order by nombreE. Esta consulta extraer
todos los datos de la tabla trabajadores ordenados por nombre.
El m.todo execute!uer" recibe como parmetro una cadena representando la
consulta *+,. No es necesario indicar el punto coma final de la consulta *+,.
El resultado de la consulta se guarda en un objeto del tipo #esultSet al que se ha
llamado simplemente DrE. ,os objetos #esultSet almacenan el resultado de una
consulta *+,. (*er necesario incluir el import necesario para la clase #esultSet-
A como puedes observar, es necesario rodear la ejecucin de una consulta *+, con
un tr@catch para capturar errores inesperados al reali&ar la consulta.
LOS OBJETOS RESULTSET
3<. %ebes imaginarte el objeto #esultSet r como una tabla que contiene el resultado de
la consulta *+, que se ha ejecutado. En nuestro caso, la consulta *+, que hemos
ejecutado ha extra/do toda la tabla trabajadores. "or tanto nuestro #esultSet contiene
toda la tabla trabajadores.
El objeto r por tanto podr/a representarse as/'
Ta#a%adoes
D*I *o-#e Apellidos Sueldo .ec/a 0aticula
BO.
30.034.034=! !na ?ui& 03<< <3F<4F3<<34433=!*?
33.444.666=1 2rancisco ,pe& 0<<< <0F<8F3<<80066=$$$
03.430.789=$ #uan ".re& 003< <6F<7F3<<36644=!$$
EO.
30. ,a fila $52 significa Dcomien&o de ficheroE representa una fila anterior al primer
registro del #esultSet.
,a fila E52 significa Dfinal de ficheroE representa una fila posterior al ltimo registro
del #esultSet.
,a flecha indica la posicin actual donde estamos situados dentro de la tabla del
#esultSet.
33. !ade la siguiente l/nea al cdigo del actionPerormed'
El m.todo next del ?esult*et har que avancemos una fila en el #esultSet. Es decir,
ahora estaremos situados en la primera fila del #esultSet (la flecha avan&a una
posicin-
Ta#a%adoes
D*I *o-#e Apellidos Sueldo .ec/a 0aticula
BO.
30.034.034=! !na ?ui& 03<< <3F<4F3<<34433=!*?
33.444.666=1 2rancisco ,pe& 0<<< <0F<8F3<<80066=$$$
03.430.789=$ #uan ".re& 003< <6F<7F3<<36644=!$$
EO.
34. !hora que estamos situados en la posicin del primer trabajador (!na-, podemos
extraer informacin referente a sus campos. !ade el siguiente cdigo al
actionPerormed del botn'
,o que se ha hecho primero es declarar una variable de cadena llamada ino.
,uego, a esta variable se le ha asignado una concatenacin de cadenas'
info"&0l trabajador se llama &2r.!etStrin!(&nombre&)2& &2r.!etStrin!(&a%ellidos&)2
& y cobra &2r.!etStrin!(&sueldo&);
,o interesante de esto es el m.todo getString del objeto #esultSet r. El m.todo
getString permite extraer una cadena con el valor del campo indicado como
parmetro.
En nuestro caso'
r.get*tring(DnombreE- Extrae el nombre del trabajador actual (D!naE-
r.get*tring(DapellidosE- Extrae los apellidos del trabajador actual (D?ui&E-
r.get*tring(DsueldoE- Extrae el sueldo del trabajador actual (D03<<E-
,uego se muestra la cadena info en un simple #5ption"ane.
36. Aa puedes ejecutar el programa.
37. *igamos haciendo cambios en el cdigo del botn para entender mejor el
funcionamiento de los #esultSet. !ade la siguiente l/nea'
"ulsa el botn@
A aparecer
informacin sobre el
primer trabajador de la
base de datos
38. *e ha aadido un segundo next. Esto producir que la flecha avance dos posiciones
en el #esultSet, por tanto se coloque en la segunda fila'
Ta#a%adoes
D*I *o-#e Apellidos Sueldo .ec/a 0aticula
BO.
30.034.034=! !na ?ui& 03<< <3F<4F3<<34433=!*?
33.444.666=1 2rancisco ,pe& 0<<< <0F<8F3<<80066=$$$
03.430.789=$ #uan ".re& 003< <6F<7F3<<36644=!$$
EO.
39. Esto quiere decir que si se ejecuta el programa se mostrar informacin sobre
$rancisco %pe&. 1ompru.balo'
3:. ,os objetos #esultSet poseen diversos m.todos para cambiar la posicin actual en la
tabla del #esultSet. %icho de otro modo' Dpara mover la flechaE. Geamos algunos de
estos m.todos (se supone que el objeto #esultSet se llama r-'
r.ne&t'(1 )ueve la flecha a la siguiente fila
r.pevious'(1 )ueve la flecha a la fila anterior
r.2ist'(1 )ueve la flecha a la primera fila
r.last'(1 )ueve la flecha a la ltima fila
r.#e2oe.ist'( )ueve la flecha a la fila $52
r.a2te,ast'( )ueve la flecha a la fila E52
r.a#solute'n( )ueve la flecha a la fila n del #esultSet.
,as filas se empie&an a numerar por 0.
3;. Haga el siguiente cambio en el actionPerormed simplemente para experimentar'
En este caso la flecha se coloca en E52 (ater%ast- luego retrocede una fila
(previous-. "or tanto, al ejecutar el programa se mostrarn los datos del ltimo
trabajador. 1ompruebalo.
Ta#a%adoes
D*I *o-#e Apellidos Sueldo .ec/a 0aticula
BO.
30.034.034=! !na ?ui& 03<< <3F<4F3<<34433=!*?
33.444.666=1 2rancisco ,pe& 0<<< <0F<8F3<<80066=$$$
03.430.789=$ #uan ".re& 003< <6F<7F3<<36644=!$$
EO.
4<. 5tro experimento. 1ambie ahora el cdigo de esta forma'
Este cdigo coloca la flecha en la fila 3 ( absolute(2) -, luego avan&a una fila
(next-, luego retrocede una fila (previous- finalmente retrocede una fila
(previous-
!s/ pues, finalmente, la flecha queda colocada en la primera fila. "or lo tanto se
muestran los datos del primer trabajador. 1ompru.balo.
Ta#a%adoes
D*I *o-#e Apellidos Sueldo .ec/a 0aticula
BO.
30.034.034=! !na ?ui& 03<< <3F<4F3<<34433=!*?
33.444.666=1 2rancisco ,pe& 0<<< <0F<8F3<<80066=$$$
03.430.789=$ #uan ".re& 003< <6F<7F3<<36644=!$$
EO.
40. 1omo ves, podemos movernos dentro del contenido del #esultSet gracias a todos
estos m.todos, para luego poder extraer los datos de la fila correspondiente.
!hora, estudiaremos la forma de recorrer todas las filas del #esultSet para as/ extraer
la informacin de todos sus registros.
43. Gamos a modificar nuestro cdigo para que se muestren todos los trabajadores del
#esultSet. "ara ello, reali&a el siguiente cambio'
En este cdigo se ha iniciali&ado la variable ino a la cadena vac/a DE luego se ha
aadido un bucle bastante interesante'
r.before>irst();
w6ile (r.ne3t()) (
info"info2r.!etStrin!(&nombre&)2& &2r.!etStrin!(&a%ellidos&)2&
&2r.!etStrin!(&sueldo&)2&/n&;
,
!nalicemos este bucle'
= ,o primero que se hace es colocar expl/citamente la flecha en la fila $52, es decir,
antes del primer trabajador'
r.before>irst();
= ,uego tenemos un bucle mientras que comien&a as/'
w6ile (r.ne3t()) (
El m.todo next intenta colocar la flecha en la siguiente fila, si lo hace bien, devuelve
el valor verdadero. 1uando no se puede avan&ar ms, el m.todo next devolver
also.
!s/ pues, este '(ile significa Dmientras se (a"a podido avan&ar una ila) (a& lo
siguienteE. 5 dicho de otro modo, este bucle se repetir para cada fila de la tabla del
#esultSet.
= *i anali&amos el contenido del bucle, bsicamente veremos una concatenacin de
cadenas dentro de la variable ino. En cada vuelta del bucle se concatenar el
nombre, apellidos sueldo de cada trabajador.
info"info2r.!etStrin!(&nombre&)2& &2r.!etStrin!(&a%ellidos&)2&
&2r.!etStrin!(&sueldo&)2&/n&;
= 2inalmente se visuali&a la variable ino en un #5ption"ane.
44. Ejecuta el programa comprueba su funcionamiento.
46. El bucle que acabas de programar es un cdigo DclsicoE para manipular un
#esultSet. *iempre que quieras recorrer todas las filas del #esultSet hars algo
como esto'
r.before>irst();
w6ile (r.ne3t()) (
mani%ulaci?n de la fila
,
47. *e ha visto que para obtener un dato de la fila actual se usa el m.todo getString
indicando como parmetro el dato que se quiere obtener.
"or ejemplo'
r.!etStrin!(#sueldo$);
5btiene el sueldo del trabajador sealado actualmente con la flecha. Este sueldo se
obtiene convertido en cadena.
!l pulsar el botn@
!parecen los datos de todos
los trabajadores de la base
de datos.
48. ,os #esultSet poseen otros m.todos para obtener los datos convertidos en nmeros
como son'
!etInt(#cam%o$)

!etDouble(#cam%o$)
para obtener el dato en entero o double, respectivamente.
Esto nos permite el reali&ar operaciones con los datos extra/dos del #esultSet.
49. 1omo ejemplo de esto ltimo, realice la siguiente mejora al programa'
En este nuevo cdigo se ha aadido una variable double acumuladora llamada
totalsu, donde sumaremos todos los sueldos.
%entro del bucle, se van acumulando el sueldo de cada trabajador. 5bserva el uso de
getDouble para obtener el campo sueldo de forma num.rica, en ve& de usar
getString'
totalsu"totalsu2r.getDouble("sueldo");
A finalmente usamos otro #5ption"ane para ver la suma de los sueldos calculada.
Ejecuta el programa comprueba su funcionamiento.
4:. >na ve& finali&ado el programa, es una buena costumbre cerrar la base de datos que
estamos manejando. Esto se hace cerrando la DconexinE con la base de datos.
"ara hacer esto se usa el m.todo close del objeto conexin.
Esto se har en el momento en que se finalice el programa, es decir, en el evento
'indo'Closing de la ventana principal'
1omo ves, tambi.n ha que encerrar este cdigo entre tr@catch para evitar posibles
errores.
CO*C,USI3*
Paa cea un po"a-a Java 4ue pueda usa una #ase de datos se5 necesaio
eali6a los si"uientes pasos7
8 Coloca el 2ic/eo de #ase de datos en una su#capeta de la capeta del po9ecto
%ava.
8 Pepaa el acceso a la #ase de datos 'en el constucto(
: Se cea5n dos o#%etos7 conei!n "Connection# $ %entencia "Statement#
: Se ca"a5 el contolado del tipo de #ase de datos a usa
: Se cea5 el o#%eto cone&in indicando el 2ic/eo de la #ase de datos.
: Se cea5 el o#%eto sentencia a pati del o#%eto cone&in
8 Se usa5 el o#%eto %entencia paa e%ecuta consultas S;, en la #ase de datos.
8 ,as consultas S;, e%ecutadas en la #ase de datos se al-acenan en o#%etos del tipo
Re%&'tSet
8 Un o#%eto Re%&'tSet tiene 2o-a de ta#la conteniendo el esultado de la consulta S;,
: ,os o#%etos Re%&'tSet tienen -<todos paa selecciona el e"isto de la ta#la
: ,os o#%etos Re%&'tSet tienen -<todos 4ue pe-iten e&tae el dato de un
ca-po en conceto.

You might also like