Java a fondo 212. édicion
ESTUDIO DEL LENGUAJE Y DESARROLLO DE APLICACIONES
ACTUALIZADO A JAVA 7 / INCLUYE INTRODUCCION A HIBERNATE Y SPRING
ING. PABLO AUGUSTO SZNAJDLEDER
oe Inge
&
g &
oe olContenido - XI
7.8 Remote Method Invocation MI)
75.1 Componentes de una apical
7.52 Bemplo de una aplcacion qo utiza RMA
7.53. Complary secur la apicacion
7.54 RMly sofalzaoen de cbjtos
7.8 Resumen
7.7. Gontenido de la pagina Vieb de apoyo
77.1 Mapa conceptual
722 Aoerekncon
773 \Wdcuteral
774 Presentaciones™
Gleason lion Pat
11 Introduccion
8.2 Repaso dela apicacon de esucio
8.3 Capas lgieas vs. capas tseas
83.1 Desveniaas de un model basado on das
capas tseas
882 Modelo de tes caoas fc
8.4 Desarole de ia aoicacion on tos canst fsleas
Ba) Deseo oa serace
842 Desarelo deun cents de prucba
8.43 Blaentoe lector wieador de sencios)
Ad —_Iniagracén con a capa depreseracion
8.5. Implementacion del servidor con tecnologia RM
eS) Boers AM
85.2 8 ServeeLocatory os obftos dltrbuitos
858 Decarolle do un cents de pnusba
54 Iniagracen ean a eapa da presertacion
55 Elaieshess daegate
88 Concuroncia y acceso ala base de datos
BB.1 B pod de conenanes wenn
852 —_Implementaciin da un poo de consxones
83 _Intagacien canoe seidotes TOP y Pl
87 Resumen
188 Contenido de la pana Web de apoyo
BEI Mapa conceptual
B82 AgooWEAAGON sarc
883 Presentacionee!
9 Estructuras de datos dinamicas
8.4 Introduccion
912 Estructura dinamicas
92.1 Brow
922 Lista oniazada (irkedtia
923° Pia
924 Cola
825. mplreracien do Una cla Sobre una sta cout
82.6 Classe inked, Stacy Gusus
82,7 Tabas de dspesion Hashtable)
92.8 Esuctas de culos combradas
829 AIDES vesvsrmnnn
9.2.10 Avbolbinats de basquoda
92.11 Lackee Tecset
93. Resumen
8.4 Contenido de la pagina Web de apoyo
94.1 Mapa conceptual
8.42 Autoeeahiactn
Java a fondo - Ing. Pablo A. Sznajdleder
aT
215
a7
278
10
104
102
103
10.4
105
"
m4
2
ns
ma
18.
2
124
122
123.
124
126
126
128
129
13
131
132
9.43 Presertacones”
Parametrizacién mediante archivos XML
Intredueeién
DML - "Extensible Markup Languag
Estructuary define paramos on un archive XML
AOS Dainicin del exnactura de paramattos
1032 Leer porsssr el conterico de un arte XE
4033 _Acooder al niermacien contenida
Greta XM
Resumen
‘Contenido dels pagina Web de apoyo
308.1" Mapa conceptual
3052 Afooraactn
1053 Presomacines”
Introspeccion de clases y objetos
Introduccion
‘Comenzande a introspectar
F121" eitear matesoe consinicioes
112.2 Acceso al protaipa de un méiogo
‘Annotations
Resumen
‘Contsnio de la pagina Web de apoyo
TIBI Mapa concept
1152. Afoerauacten
1183 Presentacionee
Generalizaciones y desarrollo de frameworks
Invoduecioa os
Que es un framework?
4221” [Framewerks propios o tamenorks 0 trees?
322.2 Rerwomtar areca
Un framework para aoceder a archivos XML
123.1" Dero dela API cal ramawork
4232 Ace del bamanto a generalzar
123.3 Paw ol reno xMLycagar iota
‘de datee
Un ramework para acceder a bases de datos
324.1 Woriieacion doa tea epettva
3242 Dieeha dela API cel araware
1243 Java Bees
3244 Tansscconee
32.455 _Mappeo de tables usando annotations
1 bean factory
Integracion
21 Los coins de ces a dos
3282 Btacada
3262 Barco de confguracon
1264 Blclene
Reoumen
‘Contenido dela pagina Web de apoyo
2B Mapa concept nnn
3282. Avtowrauacen
3203 Preceniacionee"
Entrada/Salida
Intvoduscion
VO streams (ujos de entrada y saa)
088
28
208
236
az
237
239)
2
eEee
01
2
303
a8
‘07
210
310
310
310
a
$2
512
313
aia
314
315,
317
318
28
206
or
2
35,
sr
ear
28
350
351
351
23)
51
82
358
‘54
AlfaomegaAlfaomega
2 Programacién orientada a objetos
“ea
7/ viene do mas arriba...
public void agregar (Object ela)
‘
ansertar (elm, Jen);
3
Uf sigue.
Wi .
Por titimo, veremos el cédigo del método
es
public void inset
Eublic T obtener {i
1
Telm int a)( ve.)
Cee)
Laclase recibe el parametra y de este mismo tipo de datos debe serel parametro elm
del método insertar y el valor de retorno del método chitener.
‘A continuacién, veremos la version genérica de la clase MiColeccion,
package Libro.cap02.colecciones;
public class MiColeccionct>
{
private Object datos!
private int lei
ud?
public MiCoLeccion(int capacidadinicial)
{
>
datos-new Object [eapacidadiniciall :
public void agregar |? elm)
{
3
public void insertar(? elm, int 2)
{
insertar (elm, len! +
Java a fondo - Ing. Pablo A. Sznajdieder2.3 Herenciay polimorfiemo
7
i €( lensdatos. length )
c
Object aux{] - datos:
datos = new object (datos. lenuth*2] ;
for(int j=0; j ml = nev MiColeccion (9):
/¢-twna coleccion de Integer con capacidad inicial de 5 elenentos
MicoleccioncInteger> a1 = new MiColeccioncInteger> (5) 7
Java a fondo - Ing. Pablo A. Sznajdleder
Alfaomega8 2 Programacién orientada a objetos
‘Anora podemos ver la nueva versién del programa de la coleccién de nombres con et que
probamos laclase uiColeccion.
package Libro. cap02. colecciones;
import java.util.Scanner;
public cls
4
public static void sain(string[] arse)
v
Testificoleccion
Scanner scanner = new Scanner system.
System. ove.print1n|"Ingrese Nombre: "
String now-scenner.next ();
Uf instancio una micoleccion Tespecializada” on string
wWicoleccion mo = new NiColeccion (3);
while( inom, equals{"zN") )
c
me. insertar (nom, 0);
somecannes. next [)7
}
string aut;
for (int
t
; ieme.cantidad(); itt }
// no 28 nacesario castear porque el metodo obtener
/f tetorna un String
aux = me, obtener (i) 7
Systen-ovt.printIn(aux +" - "taux, lengthi)+ cazacteres")+
}
) .
Goma vemos, el métode chteney dela clase MiColeccicn retoma un
g String por lo que ya no es necesario castear. Por otto lado, el método insertar
recibe un. String. El lector puede intentar insertar un objeto de otro tipo y obtendrd
un error de compilacisn ya que las clases genéricas proveen una validacién de tipos en
as cases pnrcas proven via. | Teme de complacion
in de tips en tempo de compli.
2.3.18 Implementacion de una pila (estructura de datos)
Lamamos ‘pila (stack) @ una coleccién de objetos que restringe la manera en la que se
le pueden agregar y eliminar elementos. En una pila solo se pueden apliar y desapllar
Objetos y tiene la caracteristica de que el ultimo elemento en apliarse sera el primero en
desapilarse. A este tipo de estructuras se las lama LIFO (Last In First Out).
‘Aquelios lectores que no cuentan con conocimientos basicos de estructuras de datos,
pueden imaginar una “pila de libros”. Supongamos que tenemos tres libros esparcidos
‘en una mesa (los llamaremos A, B y C). Temamos uno de ellos (eupongamos que toma:
mos el libro C} y la colocamas frente a nosotras. Luego tomamos oto (al ibro 8) y lo
‘colacamos encima del primera (Jo apilames). Por timo, tomamos el tercer libro (el libro
{Ay lo colocamos encima del anterior conformando asi una pil de libros,
Alfaomega Java a fondo - Ing. Pablo A. Sznajdieder2.3 Herenciay polimorfiemo
Luego, si tomamos el primer libro de Ia pila (el que esta encima de todos) resultaré ser
el libro A porque este fue el vitime que apilames. Si luego tomamos otro libro de la pila
ros encontraremos con e! Hiro B ya que este [ue el anteitima libro que apilamos y si
‘tomamos un libro mas entonces encontraremos el primer libro que aplamos: el libro C.
Vamos a utilizar 1iCoLeccion para desaroliarla clase 1iPila y asi repasar algunos
de los conceptos expuestos hasta el momento. Laclase 1iPila sera genérica en Ty
mantend los datos en una instancia de uiColeccisn.
Analizaremos entonces la clase 1{1Pi1a que tendré una variable de instancia de tipo
MiColeccioncT> ydos métodos: apilar y desapilar.
Para programar el método api lar, la estrategia sera insertar el elemento que vamos &
apiiaren la posicisn cero de la coleccicn en la que mantendremos los datos de la pila
‘Asi, cada vez que se apile un elemento este estaré ubicado en la primera posicion de la
colaccién y desplazara hacia las posiciones eubsiguientes a los elementos que se apila-
ron con anterioridad,
Para desapilar simplemente tendremos que tomar el primer elemento de la coleccién,
(que siempre seré e!iltimo que se asi), eliminarlo y retomar su valor.
package Libro.cap0?. calecciones;
public class 1 Pilact>
‘
‘// 1a capacidad iniciat 1a nardeodeamos en esta constante
private static final int capscidadinicial = 5;
{7 instancio 1a coleccion que mantendra los datos de 1a pila
private NiColeccion coll = new UiColeccion (capacidadinicial);
/é el metodo apiler recibe un paxanetzo de tipo T
public void spilar(? ©ln)
‘
eoll.insertarjeln, 0):
)
Y/ el metodo desapilar retorna va elemento de tipo T
public 7 desapslar()
‘
)
return coll,eliminar (0):
}
Ejemplo: pila de nimeros enteros.
Enel siguiente programa, instanciamos una pila de enteros (Int eye) sobre la que apila
‘mos y desapilamos elementos para veriicar que los times en apiiarse son los primeros:
que se desapiian,
package Libro.cap02, colecciones:
public class TestPila
t
public static void nain(String[] args)
// utilizaremos una pila de Integer
MiFilacInteger> c = new MiPilacinteger>();
Java a fondo - Ing. Pablo A. Sznajdleder
AlfaomegaAlfaomega
2 Programacién orientada a objetos
cvapilar (1);
clapilar (2);
ccapiler (3);
systen.out.printin{c.deaapilar())1 // saca ef 3
Syaten.out.printinic.desapilar()); // saca el 2
coapilar (4);
system. out.printin|c.desapilar()}: // saca et
System avesprintin|crdesspilar()}; // saca el 1
3
}
‘Ademés de probar la funcionalidad de Mii 1a en este cédigo podemos ver que Java
ermite pasar iterales de tipo int como argumentos de métodos que reciben paréme-
tos de tipo Integer. Esta caracteristca se lama autoboxing
2.3.19 Implementacion de una cola (estructura de datos)
Una “cola” (queue) es una coleccién de objetos en aque ol ingreso y egreso de datos os
restringido de forma tal que el primer elemento que ingresa a la cola debe ser el primero
fen egresar. A este tipo de estructuras se las llama FIFO (First In First Out
‘Aquellos lectores que nunca han oido hablar de este tipo de estructura de datos solo
{
private static final int capacidadinicial ~ 5,
Private 1icolecclon coll = new Nicolecclon | capacidadinicial) ;
public void encolar|? ln)
{
J/ agrega @1 slenento al final de ta coleccion
coll.agregar (elm! :
}
public 7 desencolar |)
{
U/ xetorna y elimina de 1a coleccion ed primer elemento
return coll. eliminar (0
}
Java a fondo - Ing. Pablo A. Sznajdieder2.4 Interfaces:
4
Ejemplo: utiliza una cola de niimeros enteros,
package Libro.cap02,caleccionss;
public class TextCola
t
public static void ssin|Steing|) srg)
Hicolactnteger> ¢ = new MiGola (7
evencolar (1);
e.encolar (2);
e.encolar (3);
Systen. out.printIn(c.desencolar(]]z // saca el
Systen,ouf.printIn(c.deaencolar(}|; // saca el
c.encolar (4);
Systen.out.printIn(c.desencolar()|; // saca el 2
Systen. out. printin(c.desencolar{)]; // saca el 4
,
3 .
2.4 Interfaces
Mas arriba comentamos que Java no permite definir herencia mdtiple, por lo tanto, cada
clase tendrd un Gnico "padre". Esto de ninguna manera debe ser considerado como una
limitacion, ya que en un cisefio de clases y objetos bien planteado, una clase nunca de-
beria necesitar heredar métodos y/o aributos de mas de una Unica clase base,
Sin embargo, como Java es un lenguaje fuertemente tipado los objetos se manipulan a
través de variables cuyos tipos de dates deben ser definides con anticipacian y esto, en
casicnes, puede imitar el disefo y la programacion de nuestras aplicaciones.
Para comprender esto formularemas la siguiente pregunta: zqué tienen en comin un
telefono celular, un telégrafo y una paloma mensajera? La respuesta es que los tres per-
mmiten enviar mensajes.
Si lo planteamos en términos de clases entonces deberiamos pensar en una cla-
se base Comunicador con un método abstracto enviatttensaje y las clases
Telefonacelular, Palonallensajera y Telegrafo heredande de Comunicador,
Elhecho de que Telefonccelular herede de Comunicador limita seriamente su
{uncionalidad ya que este probablemente deberia heredar de la clase base ‘TeLe Ton:
Analogamente ja clase 2alonallensa=ra deberia heredar de Paloma y la clase
Telegrato podria heredar de la clase FeLiquia
Las interfaces proveen una solucién a este tipo de problemas y constituyen uno de los
recursos fundamentales para el disefo de aplicaciones Java,
En principio podriamos decir que “una interface es una clase abstracta con todos sus
metodos abstractos". Sin embargo, esto no es exactamente asi ya que existe una die
rencia fundamental entre una interface y una clase abstracta: las clases (abstractas 0 no)
se “heredan’” mientras que las interfaces se "implementan.
Por ejemplo, la clase x puede heredar de la clase base Y @ implementar las interfaces
2, Ty Ui. Claro que si una clase implementa una o mas interfaces entonces “heredara
dle estas sus métodos abstractos los debera sobrescribir adecuadamente para no que-
dar como una clase abstracta,
Java a fondo - Ing. Pablo A. Sznajdleder
p
Las clases (abstractas 0 no) se “he-
Fedan" mientras que las ineraces se
implementan’.
Alfaomega2
2 Programacién orientada a bjetos
Alfaomega
Conesto, volviendo al ejemplo de los elementos de comunicacién, podriamos replantear-
(0 de la siguiente manera: primero las clases base: Telefono, Paloma y Religuia.
public class Telefons
4
Uf atributos y netodos..
}
public class Palona e
1
/f atrimutos y metodos.
}
nds Ave
public class Reliquia
4
Uf atriputos y metodos.
)
‘Anora una interface Ccmmmicads: eon sumétode enviarencaye,
public interface comunicador
{
public void enviaritensaje (string mensaje)?
)
Por titimo, las clases TelefonoCelular, Palomallensajera y Telegrato.
Cada una extiende a una clase base diferente, pero todas implementan la inerface
Cominicador. Porlo tanto, todas heredan y sobrescriben el método env/iarlensaje.
public class TelefonoCelwlar extends Telefono
implements Comunicador
4
public void enviartiensaje (String mensaje)
1
>
}
// hacer 10 que corresponda aqui...
public class PaloaaMensajera extend: Faloma
‘implements Comunicador
4
public void enviarifensaje (String mensaje)
1
// nacer Jo que corresponds aqui...
}
}
public class Telegrato extenis Reliquia
implements Comunicador
4
public void envisrtensaje (String mensaje)
W/ hacer 1o que corresponda aqui...
Java a fondo - Ing. Pablo A. Sznajdieder2.4 Interfaces: @
‘Ahora los objetos telétono celular, paloma mensajera y telégrafo tienen una base comin:
‘todos son Comunicadot y, por lo tanto, pueden ser asignados en varlables de este tipo
de datos:
Comunicador tl = new TelefonoCelular();
Comunicador t2 = new Palomatlensajera(|;
Comunicador 13 = new Telegrafo()7
Claro que a los objetos ti, t2 y t3 Gnicamente se les podra invocar el método
enviatlfensaje ya que este es el Unico métode definido en la interface Camunicador
[el tipo de datos de esios objatos)
La verdadera importancia da todo esto la veremos a continuacién,
2.4.1 Desacoplamiento de clases
Supongamos que tenemos una clase utiitaria llamada. Comunicadoeta
metodo estético: ceearComunicador:
public class Cominicadortanager
1
ager con un
public static Commicador crearcomunicador
‘//wna "paloma mensajera” es un “comunicador”
return new PalonaMensajera)
,
}
Utiizando esta clase podriamos escribir un programa como el que sigue:
public class MiaplicacionDotfensajes
1
public static void main(String args{])
Comunicador © = ComunicadosManager. creatComunicador |);
cvenviartlensaje("iicla, este ee mi nenst
jase ComunicadorManager para obtener “un
través del cual enviar nuestro mensaje, Lo interesante de esto 0s
que en el método main no hardcodeamos ninguna de las clases que implementan
la interface Comunicadioe. Simplemente, creamos un objeto comunicador ullizando el
metodo creazCominicacor yle invocamos su método env iarlensale.
Ahora bien, evidentemente enviar un mensaje a través de un telsfono celular debe
ser (supongo) mucho mas eficiente que ervierlo a través de una paloma mensajera
2Qué sucederd si modificamos el método crearcomunicador de la clase
ComunicadorManager y en lugar de retornar una instancia de Palomalfensajeza
retornamos una nstancia de Tel=fon2Celular?
public class ComunicadorHanager
1
public static Conmicador crearComumica
// return new Patomatiensayerad) +
// ahora retorno un telefono celular
// cuya clase tambien implenenta comunicador
return new TelefonoCelular |}
}
)
Java a fondo - Ing. Pablo A. Sznajdleder AlfaomegaXII- Contenido
1921 Erivaday sates eatandar
1322 Rexdreocona la enraday sis eaéndor
19.29 Conor cortectamento oe steams =
3824 Steams de bites (noutSieam y QuiputSiream)
19.25 Stour de caracteres (ead WE).
3826. Steams buferizacos
1927 Stearns de datos OstainputSrear
y DataOuputseam)
1328 Steams de cbjeios Gbjecinputsvean
y ObjectOutputstea)
32. Resumen
18.4 Contenido do la pagina Web de apoyo
134.1 Mapa conceptual
1342 Autoradio. =
1849 Presentacionas"
14 Consideraciones finales
14.4 Intecuccion
14.2 Coneiceracionos eobre multthreacing y eoncurreneia
142.1 Oises con o'ain metogos shewonzacos|
142.2 _B sigleton patio on contextos muttircaded
14.9 Consideraciones sobre clases “legacy”
1431 Lacace StingToxenzery el mtedo gplt
144 Resumen
14.5 Contenido de la pagina Web de apoyo
145.1 Mapa conceptual
145.2 Autoorskacen
1458 Prosentacores
18 Object Relational Mapping (ORM)
y persistencia de datos
18.1 Intreduccion
152 Hibernate tramewor
1521 Bmoddo de dace rend
1522 ORM (ect Peat’ Merona)
152.3 Coniguracion de MoMA wenn
1824 Mappoo detablas
152.5 Lassen de Hberste
158 Asociaciones y relaciones
153.1 Asoct00n many-o-one
1582 Asociscén one-tomnany
1833 PESpy
153.4 Lay ang vs aagar bang
184 Recuperarcolecciones de objetos
1541 Crierios de Boxqueda vs. HOL.
1542 Nemed ques
1543 Fecuar SOL rato
1544 Quotes parmetizados
185 Insertar, modifica’ y liminar fas
1551 Transaccones
1552 hoorar wa ta ate
15.55 Esatogia de goreracion do das pamaras
1554 Moles Ura 1
1555 Multiples updates y deletes
18.6 Cacos avanzados
1561 Andi yprosetacén del meds do datos
1562 Asoowoenes many-to-many
1563 Caves prmarias compuestas (Compost i
Alfaomega
qenee geuee
18.7 Disono de apteactoN88 eons enon 92
"bit Factonas do cbpice a9
188 Resumen 28
159 Contre dela pai eb do aore 409
158.1 Mapa concert. eee)
1592 Autooalvecln 400
1892 Preeemacionss 00
16 Inversion det contol por inyeccion
dodependencies 401
4184 Intodceén 02
1622 Spring tamework - 402
3621 Desscalr Sl pisssariers a0
3622 Corcusonyrepano 0B
463 Spring y JDBC 09
16.4 Interacion Spring + Hbomate 42
185 Resumen 418
16.6 Conteneo dea pagina Web do apoye 416
681 Mapa concept! a6
1852 Aooaiocon 6
1052 Preeetaconee 6
17 Actuatzacion a Java a7
174 trveduecten nn 48
1722 Novedades en Java 7 2
S721 Lierstnwros 8
1722 eres rumencos seperados por (gen bo) 478
3723 Uso de cateras ona sortenca wich 0
1724 rors do p08 denee08 we nenvnncsncnnsnne 419
47255 Seniencia ty con reuse reid 420
VRS Aecrmoen ocmsores dre dein mao
Bogie aon a #20
472.7 Nuevos mdacios ena dase Fe 20
17.8 Contenido deta pagina Web de apoyo a2
5731 Mapa conceptual 21
1782 Aso EON wen Senet
1733. Presentasones: 21
-Apéndice A Nociones basieas de programacién 423
[AS troduocion 404
‘AZ Concepts inci 2 424
zi Ellenguae oa rogramacn ‘4
422 Eleamplador ‘8
23° Losinerprotas 24
A24 Las maura vues 25
428 Javayau magna ve 25
‘A3- Recursos de programacin 225
Agi Laavarabie 25
32 Tos de cstos 25
‘ASS Operacors aration. 26
AG Estustuas oe doosion ar
‘838 Estuctras de ropotlen ar
‘Apendice B Applets sos 429
By Inteducelén 490
2. Comenzando con Applats 490
Bt Eleciode va de un appt 2
B22 Boontoto de app aa
23 Pasa parameton aun opps 03
Bibliogratia 495
Java a fondo - Ing. Pablo A. Sznajdieder2 Programacién orientada a bjetos
Alfaomega
{Qué cambios tendremos que hacer en el método rain? La respuesta es: ninguno.
En el método main, trabajamos con un objeto comunicador y nos desentendemos:
de la necesidad de conocer qué tipo de comunicador es. No necesitamos saber
si este objeto es una paloma mensajera, un teléfono celular o un telégrafo, ya que
todos estos objetos son comunicadores porque sus clases implementan la interface
Comunicador.
Nusstro programa quedé totalmente desacoplado de la implementacién puntual que
utlizamos para enviar e! mensaje. El cambio de “tecnologia” que implica pasar de una
paloma mensajera a un teléfono celular no tuvo ningun impacto negativo en nuestro pro-
‘grama (el método main), no fue necesario adaptario ni reprogramario.
Para tener una visién més global de las clases que intervienen en este ejemplo, analiza-
remos eu diagrama de clases.
aaa
‘Saute weajers || TteREAES
Fg. 23 Dagrama de clases de los elementos de corunicacin
Este diagrama debe interpretarse de la siguiente manera’
La clase TeLefonocelular hereda dela clase TeLefons, La clase Pal omaliensajera
hhereda de la clase Palcma y esta a su vez hereda de Ave, La clase TeLegzats hereda
de Pel iguia, Todas astas clases directa o indirectamente heredan de la clase Object
(que esté en el paquete java. lang).
Las clases TelefonoCelular, Palomaensajera y Telegraco implementan
la interface Comunicador de la que heredan el método enviarlfensaje. La clase
ComunicadoxManager crea una instancia de Comunicada® (que en realidad sera
luna instancia de cualquiera de las clases que implementan esta interface, ya que las
Interfaces no se pueden instanciar).
Java a fondo - Ing. Pablo A. Sznajdieder2.4 Interfaces:
2.4.2 El patron de disefio: factory method
Elmétodo crearComunicador de la clase Comunicadorianager nos permité obte-
ner una instancia de Comimicador sin tener que hardeodear un tipo de comunicader en
particular.
Gracias a este método nuestro programa el método main) quedé totalmente desacoplado
de Ia implementacién concreta del comunicador y, como vimios més arriba, la migracién
de tecnologia que implica dejar de utiizar una paloma mensajera para pasar a utlizar un
teléfone celular no ccasioné ningun efecto negativo en el programa ya que este esta total-
mente separado (desacoplado) de dicha implementacién.
Decimos entonces que utiizamos ol método crearComunicador para “fabricar objetos
comunicadores”. Este método constituye una factoria de objetos. A los métodas que rea-
lizan este tipo de tarea se los denomina factory.
2.4.3 Abstraccion a través de interfaces
Las intorfacas ayudan aincrementar olive de abstraccién tanto como sea necesario porque
periten tener multiples "uistas” de una misma clase.
Bor jr, un obj dona Paatec jet pada srl” oars “pu
de aignarse a Una varable de tpo..") como un objeto de esta misma clase o bien puede
visto" como un objeto de case. Palcna Ave. ocomo un obi dela case Object.
‘Ademas, como Pal caalfensajera implementalaintelace Comin icador también puede
‘ser visto" como un objeto de est po. Sila clase Ealonatfensajera hubieraimplemente
do més interfaces entonces sus objetos podrian verse como objets de cualquiera de estas.
Para estudiar esto analizaremos ls siguientes preguntas:
{Pedra elector ordenar un conjunto de valores numéricos enteros? Por supuesto que si. El
Conjunte de os ndmeros enters lene un erden natural por fo tanto, nadke dudara en colocar
anime 2 antes que e!3, aS antes que el 4 tetera,
{Pocria elector orenar un conlunto de cadenas de cracteres que representan nombres de
personas? Caro que si, fo ogo eintultvo sera ordenariosalfabéticament, po lo tanto, el
nombre “Alberto” precededa al nombre “Juan” y esl precederia al nombre "Pabl”
{
public int compar
(7 obs)?
:
Java a fondo - Ing. Pablo A. Sznajdleder
AlfaomegaAlfaomega
2 Programacién orientada a objetos
Esta interface define un unico método que recibe un objeto como parémetro y debe
retornar un valor entero mayor, menor 0 igual a cero, segin resuite la comparacién entre
los atributos de la instancia (tinis)y los del parémetro. ob.
Es deci, si vamos aimplementar la interface Canparable ena clase Alunno ytoma-
‘mos como eriterio de comparacién el atributo exiad. entonces, dados dos alumnos = y
by, tal que = es menor que b, sera: a.compareTo [h) <0,
Lainterface Comparable es genéricaen para valdar en tiempo de compilacién que
‘no 82 intente comparar elementos de diferentes tipos de datos,
Anora definiremoslaclase £1umn® con les atributes nombre, edad y notaPromedio
donde implementaremos la interlace Comparable para determinar el orden
de precedencia de dos alumnos en funcién de su edad.
faces:
package Libro,cap02.i
public class Alunnd implements Conparshle
En esta nueva versién, ya no necesitamos imponer que las clases implementen
snparable para que sus objeto puedan ordenarse con nuesto métod Util .ordenar.
En el dagrama vemos que Alunno hereda de Object no implementa la interface
Coeparetle, La neva versién del metodo ozdena: dela clase ‘Veil recibe un
Object |} yun Criteric (queserd alguna de sus subslases yaquelaclase Criteri>
98 abstract).
Veamos a clase Cri terio,
package Libro. cap02. interfaces. criterics;
public abstract class Criterio
‘
public abstract int conparar(T a, Tb);
1
Java a fondo - Ing. Pablo A. Sznajdieder2.4 Interfaces:
Laclase Criterio es genérica en T lo que nos permitiré asegurar que los dos objetos:
que se vayan a comparar con el método comparaz sean del mismo tipo.
\Veamos ahora dos subclases de la clase Criteric. Una para comparar alumnos
por su nombre y otra para comparatios por su nota pramedia.
package Libro.cap02, interfaces.criterion;
import libro.cap0?. interfaces. Alumnos
/{ hevedo de criterio especializando en Alumno
public class criterionlumionbre extends CriteriocAluano>
t
public int comparar(Alumno a, Alumno b)
return a, gotNombro() .conpare?o(b.qetNonbre(})
:
}
package Libro.capl2, interfaces. criterioss
import libro.capl2. interfaces, Alums:
public class Criterioaluntiststrom extends Criterio0 71: diff <0? -1:
}
NNotemos que en este métado no podemos retornar la diferencia entre las dos notas pro-
medio porque estos valores son de tipo double porlo que su diferencia también lo sord,
pero el metodo debe retornar un valor de tpo._int. Sila diferencia resulta ser un valor
entre Oy 1, alcastearlo a int se convertra en cero y estariamos indicando que ambos
alumnas tienen la misma nota promedio cuando, en realidad, no es ast
En |a linea:
retuen diff>0 2 1: diff <0 2-1: a:
hacemos un doble if inline. Primero, proguntamos si diff es mayor que cero. Si
esto es ast retornamos 1. Sino, preguntamos si diff es menor que cero. En este caso,
retornamos “1 y sino retornamos 0,
\Veamos ahora la clase Util donde modificamos el método ordenar para que reciba
lun Object [] yuna implementacién (eubelase) de Criteri:
package Libro.cap0?, interfaces. criterios;
public class Util
{
public static void ordenar|abject arr], Griterio cr)
(
Java a fondo - Ing. Pablo A. Sznajdleder
104
Alfaomega02 2 Programacién orientada a objetos
boolean orenado ~ false:
while( lordenado )
i
ordenado = true;
for| int i=D; icarr.length-1y it+ )
c
// ahora la decision sobre quien precede a
“7 quien 1a tona instancia de Criterio cr
4£( cr-comparar (arr [i+1],arr[i])<0 }
‘
Object aux = arc lily
arr[il = arr[ist];
arr[itl] = atm
ordenado = false:
}
public static void imprimir [Object arr{])
{
for(int
{
Systen. out-printIn(are (il);
}
icarr.Jengthy i++)
)
:
‘Aprovechamos ¢ incluimos en esta clase un método estético imprimiz para imprimir
todos los elementos de un Object}.
Para terminar, veremos un ejemplo donde definimos un Alumno(] y lo imprimimos or
denade primero por nonibre y luego por notaPrane
package libro. cap02. interfaces. criterios:
import libro. cap02, interfaces. Alunno;
public class Testcris
‘
public static void sain(string[} arse)
t
Rlumno aex{] = { new Aluano(*Martin", 25, 7.
new Alusno["Carlos", 23, 5.
{new Blunno (TAnaetasio", 20,
Util. ordenar(arrnew CriterioAlumonbre()}+
Weil. inpeimsr (a
Util. ordenar(arr;new CriterioAlumlotaProm());
Util, mprimiz(are};
Alfaomega Java a fondo - Ing. Pablo A. Sznajdieder25 Colecciones 103
2.5 Colecciones
Genéricamente, llamamos “coleccién” a cualquier conjunto de objetos, Un string]
fs una coleccién de eadenas, un Integer] es una coleccién de objetos Integer y
tun Oaject |] es una coleccién de objetos de cualquier clase porque, como ya sabe-
‘mos, todos las ls clases heredan de la clase base Object.
Java provee una interface C2LLect:icn. Por lo tanto, en general, cuando hablamos de
“coleccién’ es porque nos estamos refriendo a un objeto cuya clase implementa esta
Interface.
Existen varias clases que implementan a interface Col Lect ion. Las més utlizadas son
ArrayList y Vi
collectionst>
vectorers arrayiiecer>
Fig, 2.6 Reprosontaoin oo las clases Vector y ArcayLise,
En el diagrama vemos que tanto la interface Collection como las
dos implementaciones que mencionamos estén ubicadas en el paquete
java.util,
Ejemplo: uso de la clase Vector,
En el siguiente programa, instanciamos un Vector, le asignamos algunos
valores y luego lo recorremos mostrando su contenido.
package Libro.cap02.calecciones:
import java.util.vector?
public class TestVactor
i
public static void nain(string!] args)
‘
(// instancio un Vector especietizado en string
Vector v = new Vector(};
// Ie asigno algunos valores
v-add "Pablo";
vyeadd{"Juan") :
Java a fondo - Ing. Pablo A. Sznajdleder AlfaomegaContenido - Xi
Informacion del contenido de la pagina Web
El material marcado con asterisco¢) solo est dsporible para docentes.
Capito
Introducctén al tenguaje de programacién Java
1 Mapa conceptual
* Autopvatuacten
* Vidsotutonaes:
estar Java Ese
Crear ejecuter nuestro primer programa en Eclpse
Pasar argumarios en nea de comands en Eclpse
‘Compa ejcuter un programs Java desde a nes de comands
(sinuiiza sto
+ Prosentaciones"
‘capt 2
Programacion orientada a objetos
‘Mapa conceptual
+ Autoevaluacién
+ Videotutonalee
\tlzar aera ‘ave’ para cosrensr nuestro digo tere
Enmpaquotarchses uzzede la neramira “ar
«+ Presentaciones”
‘capt 3
‘Acceso a bases de datos (JDBC)
+ Mapa conceptual
+ Autoovaluacten
+ Videotutorial:
Usr Eclipse come cient SOL.
+ Prosentaciones"
‘capo +
Diserio de aplicaciones Java (Parte I
‘Mapa conceptual
© Autopvaluacien
* Presentaciones"
Capito s
Interfaz grfica (GUN
‘+ Mapa conceptual
* Autoovatuacien
+ Videatutorat
liza harariertas vil para dso desarolo de tera rea.
+ Presentaciones”
Capito
Mattitareading (los)
4+ Mapa conceptual
* Autoovaluacton
+ Presentaciones"
Capiio 7
Networking
‘Mapa conceptual
+ Autoovaluacten
+ Vigeotutora
‘Compla y ejecttar una aplicacion RM
+ Presentaciones"
Capitulo 8
Disenio de aplicaciones Java (Parte I)
+ Mapa conceptual
+ Autoovaluacien
+ Presentaciones”
Java a fondo - Ing. Pablo A. Sznajdleder
Capito 8
Ectructuras de datos dindmicas
+ Mapa conceptual
*Autoevaluacien
+ Presentaciones*
apie 10
Parametrizacion mediante archivos XML
+ Mapa conceptual
‘Autoevaluncion
+ Prosentaciones
‘capi 14
Introspeccion de clases y objetos
‘+ Mapa conceptual
* autoevaluacion
+ Presentaciones*
api 12
Generalizaciones y desarrollo de frameworks
+ Maps conceptual
+ Autoevaluacion
+ Prosentaciones*
apie 13
Entrada/Sallda
+ Maps conceptual
+ Autoevaluacion
+ Prosentaciones
capo 14
CConsideraciones adiclonales
‘Mapa conceptual
+ Autoevaluacion
+ Presentaciones*
api 15
‘Object Relational Mapping (ORM) y persistencia de datos
+ Mapa conceptual
1 Autoevaluacton
+ Procentaciones™
capo 18
Inversién del control por inyeccién de dependencias
‘+ Mapa concoptual
Autoevaluacion
+ Prosentaciones*
‘capo 17
‘Actuallzacion a Java 7
‘+ Mapa conceptual
+ Autoevaluacion
+ Prosentaciones*
‘Codigo tuente de cada capitulo
Hipervineulos de interes
Fo de orratas
Gufa para ol docente de las competencias especificas que so
dosarroian con este libro
Alfaomega108
2 Programacién orientada a objetos
$7
ava 7 tiene la capactdad de Inter e
tipo de datos genéicn; de este mado
sentencias coma est:
Vector ¥:
y= now Veetar ()7
‘oeden simplficarse a:
Vector vi
y= new Yectaro>()+
Alfaomega
String aux;
Uf et metodo size indica cvantos elementos contiene el vector
for(int i=0; i obtenerLista|)
Vactor v = new VactoreString> ()+
v.ada("Pabla"
vlad ("guan")?
viadd("Carlos"|;
return ¥)
Java a fondo - Ing. Pablo A. Sznajdieder25 Colecciones
105
Notemos que el tipo de datos del valor de retorno del método es Collection
aunque lo que realmente estamos retomando es un Vector. Esto es comecto
Porque, como vimos mas aria, la clase Vector implementa la interface Col]
Un vector es una
Ahora, en el programa principal, podemos obtener lista de nombres a través del méto-
do Usionbres.cbtenerLista dela siguiente manera:
package Libro. cap0?.colecciones;
import java.util
public class TestVector
{
ection;
public static void ssin|Steing|) srg)
‘
{7 01 metodo opteneriista retorne una coliection
Collectioncstring> coll = Uoubres. obtenerLista();
Uf Atero 1a coleccion de nonbres y mestro cada elemento
for (String non: coll)
c
System, out. print In {nom} +
:
z .
En esta nueva versién del programa, que muestra la isa de nombres, primero abtenemos:
lalsta invocando al métedo estatico Ui/cubres. cbtenerLista. Este método retorna,
un Collectisn, porle tanto, tenemas que asignar su retorno a una variable
de este tipo de datos. Claramento, ol método cbtcnerLista es un factory method.
Luego, para terar la coleccién y mostrar cada uno de sus elementos, utiizamos un fot
‘each. Este for itera (recor uno a uno los elementos de) la coleccién y en cada itera
cidn asigna el -ésimo elemento ala variable nox.
2.5.1 Cambio de implementacion
Supongamos ahora que, efectivamente, la clase \ ‘no nos termina de convencer
yy decidimos reemplazaria por ArrayList. Este cambio lo aplicaremos en el método
btenerLista delaclase Woubres,
package Libr. cap0?, colectionss;
import java.util.arcaytist;
import javalutil!csLlection;
public class UNonbres
{
public static Collectionstring> obtenerLista()
Ufeckor v ~ new Vector()<
Arraytist v = new ArrayList();
veadal("Pabslo")
yiada "onan" 7
Java a fondo - Ing. Pablo A. Sznajdleder
Alfaomega108
2 Programacién orientada a bjetos
Alfaomega
Como vemos, camblamos Vector por ArrayList, Esta clase también tiene el método
43, porlo fanto no fue necesario cambiar nada mas.
Como la clase ArrayList también implementa Collection entonces este cambio
no generara ningin impacto en el programa principal, Enel main no nos interesa saber
si UNombres.cbtenerLista retomaun Vector oun ArzayList. Nos aleanza con
saber que el método retona una Cal ection,
Una vez més, logramos independizar nuestro programa de la implementaci6n que vaya-
‘mos a utiizar, en este caso, para manejar una lista de nombres de personas,
2.6 Excepciones
Las excepciones constituyen un mecanismo de tratamiento de error a través del cual
los métodos pueden finaizar abruptamente ante la ccurrencia de situacién anémala que
‘mposiblte su normal desarrolio.
ET siguiente ejemplo ilustra una situacién tipica en la que debemos utilizar excepciones.
‘Supongamos que tenemos una clase Ay1iicacion y estatiene un método log: que
recibe como argumentos dos cadenas: uscnane y password. El método retoma una
instancia de Usuario. siendo esta una clase con los atrbutos del usuario que esta in=
tentando loguearse (nombre, direccién, e-mail, etc) nil si usrnane yfo password
‘son incorrectos..
Enel siguiente codigo, intentamos loguear un usuario “juan” con un password juan 23sito”.
/ instancio 1a clase aplicacion
Aplicacion app = new Aplicacion();
U/ intento et login
Usuario u = app.login("juan", "juani23sito")?
// 8 108 datos no aon correctos.
Af(u == mull )
‘
System, cut.printIn("usuario y/o password incorrectos”
}
elee
{
Systen. out.printla|"Felicidades, login exitoso.");
Syaten.out.printla("onbre: "hr, getNonbre (})
system. out.printia|"Enail: "+u.getEmail ||;
)
Este eédigo es muy claro y no necesita ninguna explicacién adicional. Sin embargo, el
‘método Login asi como asta planteado tiene Un importante error de disefio: el métedo
retoma una instancia de Usuario siel/ogin fue exitoso 0 mill. sie! nombre de usuario
ylo el password provistes como argumentos no son correctos, pero no se contempla la
posibildad de que por algin factor externo el métado pudiera fall.
‘Supongamos que para vetificar el ogi el método tiene que acceder @ una base de datos
yy resulta que en ese momento la base de datos esta caida. ;Qué valor deberia retornar
‘elmétedo login? Siretorna nul] entonces quien lame a nuestro método interpretara
{que al usmame o el password que ingresé son incorrectas. En este caso, el método no
debe retornar nada, simplemente debe finalizar atrojando una excepeién.
Podemos probar el ejemplo anterior solo que en lugar de utiizar una base de datos
(porque ese tema lo estudiaremos en el proximo capitulo) utiizaremes un archivo de
propiedades en el cual tendremos definidos los valores de las propiedades del usuario:
ustnane, password, nombre y email
Java a fondo - Ing. Pablo A. Sznajdieder2,6 Excepoiones
107
Unarchivo de propiedades es un archivo de texto donde cada linea define una propiedad
Su correspondiente valor. En nuestro caso llamaremos al archivo: usuarlo.properties,
{ue debe estar ubcado en el package roct y su contenido seré el siguiente:
nanl23eito
van Cordero de Dios
enail=juan?juancho. com
Teriendo e! archivo de propiedades creado y correctamente ubicado podemos codificar
laclase Aplicacion y elmétodo login.
package Libro.cap0?,excepciones;
import java.util. ResourceBundle;
public cl
‘
ss Aplicacion
public Usuario login(String usrname, String passward)
(
fr
{/ eemos e1 archivo de propiedades que debe ester ubicade
“7 en el package root
Resourcesundie rb = ResourceBundle. goesundle("usuario") +
// 1eemos et valor de 14 propiedad usrname
String usr = rb.gatString|"sername”);
Uf tems et valor de 1a propiedad password
String ped = rb. getString|"password!")7
{Mf defininos a variable de retorno
Usuario u = null;
Uf si coinciden los datos proporcionades con los Ieidos
3£( norvequile(usrnane) st pro equals (pasawerd) |
1 instancio y seteo todos 10s datos
t= new Usuario)
u,setUsrnene (ust)?
ulsateassvord (ped) +
ursetiionbre( rb, getString|"nombre") 1
, sotBwail (rb. gatString("email") );
)
Y/ xetorno 1a instancia 9 mull si no entro al ir
return 1:
}
catch [Exception ex)
c
Jf cualquier error "salgo por excepcion"
throw new Runtimetxception("Errer verificando datos", ex};
}
Java a fondo - Ing. Pablo A. Sznajdleder
Alfaomega408
2 Programacién orientada a objetos
~~
‘Una excepcién es una instancla. de
ua cage que extende ala case base
Exception.
‘Agu vez, Exception es ua subea-
‘se dela case Throwable,
Alfaomega
En este elemplo vemos que todo el cédigo del método login esta encerrado dentro de
un gran bioque_ ry. Decimos entonces que “intentamos ejecutar todas esas lineas” y
‘suponemos que todo saldré bien. Incluso el return del método esta ubicado como ti-
tima linea del try. Ahora, s algo legase a falar entonces la ejecucion del eédigo saltara
automaticamente a la primera linea del bloque catch. Dentro del catch “arrojamos
tuna excepcién” indicando un breve mensaje descriptive y adjuntando la excepcién ori
ginal del problema,
Una excepcién es una instancia de una clase que extiende a la clase base Exxcepticn.
‘Asu vez, Exception es una subclase de la clase Throwable
‘Cuando trabajamos con excepeionas tratamos el eédiga como si no fuese a ccurtr nin
{gin error. Esto nos permite visualizar un cédigo totalmente lineal y mucho mas claro, y
ante la ocurrencia del primer error (excepoién) “saltamos" al bioque catch para darie
un tratamiento adecuado © bien (como en nuestro ejemplo) para arrojar una nueva ex-
‘cepcién que deberd tratar quien haya invocado a nuestro metodo,
Veamos ahora el programa que utliza el método login dela clase Aplicacton
package Libro. cap02. excepoiones;
public cls
‘
public static void sain(string!| arse)
‘
TestLogin
try
{
Aplicacion app ~ new Aplicacion|) +
77 intento el togin
Usuario u ~ app. login "juan", "juan
2/ muestra el resultado
Systen. ovt-printin(u)?
i
catch (Exception ex)
c
// oowrrio wn error
System, out.print ("Servicio temporalmente interrumpido: ")+
Systen. out, printIn(ex. getMessage|))+
}
}
3 .
En el programa intentamos el fogin como si todo fuera a funcionar perfecto y ante cual-
{ier error "saltamos” al catch para (en este caso) mostrar un mensaje de error.
Recomiendo al lector realizar las siguientes pruebas:
1. Correr el programa asi como esta y verficare! resultado, En este caso, vera en con-
sola todos los datos del usuario.
2, Cambiar el password y/o el usmame por otros incorrectos, correr el programa y vert
ficar el resultado: en este caso, verd aparecer en consola: m1],
3. Mover a otra carpeta el archivo usuario properties y volver a correr el programa. En
{este caso, veré ol mensaje de error indicando que el servicio esté temporalmente
interrumpido y que hubo un error verificando los datos, lo que no quiere decir que los
datos proporcionades son incorrectos. Simplemente, no se los pudo veriica.
Java a fondo - Ing. Pablo A. Sznajdieder2,6 Excepoiones
109
Podemos diferenciar dos tipos de Errores:
1. Errores fisicos,
2. Errotes ligicos (que, en realidad, no son errores),
En nuestro caso, erores fisicos podrian ser: que no se pueda abrir ol archivo de propie-
dades 0 que dentro del archivo de propledades no se encuentre definida alguna de las
propiedades cuyo valor estamos intentando leer
Un error lagico seria que el usmame y/o el password proporcionados como argumentos,
sean incorrectos pero esto, en realidad, no es un error ya que la situacién esta contern-
placa dentto de los escenarios posibles de la aplicacion
2.6.1 Excepciones declarativas y no declarativas
Enel ejemplo anterior, trabejamos con excepciones no declarativas ya que en el protei-
podel método 1og:n no especificamos que este puede leger aarojr una excepcion
funtimeEzcept.ion es una de las excepciones no dectarativas provstas con Java,
Desde un método pademos arrojara sin tener que declararla en su prototipo. A su vez,
auien llame al método no estara obligado a encerrar la lamada dentro de un bloque
tryccateh
Sin embargo, pedemes inclur en el prototipo una lista de excepciones que el método
{legado el case) podria legaraarrojar.
Por ejemplo, podemos definr el método. Login de a siguiente manera:
Public Usuario login(String usrnane
7) String pasevard) throve ErrorFisicozxception
En este cato, estamos indicando en el misma prototipa del métado que este podtia
arrojar una excepcion del tipo. ErorFisicofxception, Esto obligara al lamador del
metodo Login a encenar la llamada dentro de un bloque try-catch.
Las excepeiones en realidad son instancias de clases que heredan de la
Por lo tanto, podemos programar nuestra excepcién
package Libro.cap02. excepciones;
Super essWwarnings ("serial")
public class BrrorfisicoBxception extends Exception
t
public ErrorFisicofxception (Exception ex)
i
super ("Ccurrio um Error Fisico", ex);
:
u .
‘Veamos la version modificada del métedo login de la clase Aplicacion donde
declaramos que podemos arrojar una ErrorFisicaException y legado el caso la
arrojamos.
Java a fondo - Ing. Pablo A. Sznajdleder
Alfaomega110 2 Programacién orientada a objetos
package Libro. cap? excepciones;
Amport java.util, Resourcosundle;
public class fplicacion
¢
public Usuario login(String usrnane, String password)
throws ErrorFisiceBecertion
t
ey
‘
Ye
7 aqui nade cambio,
Te
todo sigue iguat
}
catch (Exception ex)
‘
}
y
Z .
throw new ErrorFisicofxception(exl +
Enel main ahora estamos obligados a encerrar la llamada al métode Login dentro de
un bloque try-catch. De no hacerlo no podremes compilar
package Libro. cap02. excepciones;
public class Testiogin
t
public static void sain(string[]} arcs)
t
ey
‘
Rplicacion app ~ new Aplicacion():
Usuario u = app, login|"juan", "juarl23sito")
System. ovt.printin(u):
5
catch (ErrorFisicofzception ex}
‘
Uf scweria un error
System, ovt,print |"Servicio texporalnente interrumpido:
Systen, ove.printin( ex.getlessage|) |
}
}
i .
Mi crterio personal (el que aplicaré alo largo de este trabejo} es el de arrojar excepciones:
no dactarativas ante la ocurrencia de erroes lisicos.
Alfaomega Java a fondo - Ing. Pablo A. Sznajdieder2,6 Excepoiones
"1
2.6.2 El bloque try-catch-finally
Elbloque try-catch se completa con la seccién finally aunque esta no es obiigatoria
Podemos utiizar las siguientes combinaciones
+ trpcatch
+ uy-fnaly
+ try-catch-finally
Cuando utiizamos la seccién inally Java nos asegura que siempre, suceda lo que
suceda, e! cédigo pasara por all
‘Veamos algunos ejemplos para comprender de qué estamos hablando.
En el siguiente programa, imprimimos la cadena "Hola, chau |" dentro del try y
lage finalizamos el méteda main con la sentencia return. Antes de finalizar el pro-
crema ejecutara el cédigo ubicado en la seccion finally.
package Libro.cap02. excepciones:
public class Denol
C
public static void uain(string!] ary2)
c
try
£
System. out.printin|"Hola, chaw 1");
return:
t
catch [Exception ex}
ype peas Panete al eats
:
dinally
£
system. out.printla
}
jato gale aiexpre
?
La salida sera:
Hola, chau !
Esto sale siempre |
En el siguiente programa, preveemos la posibiidad de “pasamos de largo” en un array por
lo que capturamos una posible excepcién del tipo AizrayIndexoutOzBoundexcepticn,
Sin embargo, la excepcién que realmente se originaré sera una de tipo
MumberForatExcepticn porque dentro del try intentamos convertira int una
ceadena que ne tiene formato numérico,
En este caso, el programa “saldra por el throws" y no entrara al catch, pero primero
pasara por el imal.
Java a fondo - Ing. Pablo A. Sznajdleder
Alfaomega12 2 Programacién orientada a objetos
package Libro.cap0?.excepciones;
public class Dex02
i
public static void sain(string[] args) throws Exception
i
integer. parseti
(mo es una cadena mumerica...");
dexoutotHoundazxception ex}
System. ovt.printin("Entre al cstch...")7
}
finally
{
Systen. ovt.printin("ssto sale siempre |");
t
i
}
La seccién finally es el lugar ideal para devolver los recursos fisioos que tomamos.
fen nuestro programa: cerrar archivos, cerrar conexiones con bases de datos, etcstera
2.7 Resumen
En este capitulo, no solo estudiamos en detalle el paradigma de programacién orientada
‘.objetos sino que también aprendimos a importancia de aplicar patrones de disefo, ya
{que son estos los que verdaderamente potencian sus bondades.
En el préximo capitulo, veremos cémo podemos conactamos y acceder a la informacion
Ccontenida en bases de datos ya que nuestro objetivo inmediato es el de desarrollar una
aplicacién Java completa que, aplicando patrones do defo, se conecte a una base de
dates para acceder y trabajar con la informacién que all esté almacenada.
2.8 Contenido de la pagina Web de apoyo @
El materi mercado‘conesterico() slo est penile para doceres
2.8.1 Mapa conceptual
2.8.2 Autoevaluacion
2.8.3 Videotutoriales:
2.8.3.1 Utilizar la herramienta "javadoc" para documentar nuestro cédigo
fuente
2.8.3.2 Empaquetar clases utilizando la herramienta "Jar"
2.8.4 Presentaciones*
Alfaomega Java a fondo - Ing. Pablo A. SznajdiederAcceso a bases de datos (JDBC)
Contenido Objetivos del capitulo
221 nroducciin - att + Proveer una breve introduccién al SQL.
3.2 Conceptos bisicos sobre bases de datos ee ne uae
aa
3a
as
a6
relacionaioe
CConectar programas Java con bases de datos
Uso avanzado de JDBC
Resumen...
Contenido de la pagina Web de apoyo ae
a1
35
+ Entencler l modelo de datos relacio-
nly representerio mediante un DER
(Diagrama Entidad/Relaci6n),
+ Aprender la API JDBC para conectar
los programas Java con las bases de
datos.
* Ejecutar querys, updates y administrar
‘ransacciones.
Competencias especificas
Integrarfisica, légica y metodolégicamente un programa Java y una base de datos relacional para ejecutar
cconsultas y actualizaciones sabre los datosxv
Registro en la Web de apoyo.
Para tener acceso al material dela pagina Web de epoya dl bro:
4, Irala pagina htp:/vitualalfaomega,com.mx
2. Registrarse como usuario del sitio y propietario del ior.
3, Ingrasar al apartado de inscripeién de libros y registrar la siguiente clave de acceso:
4, Para navegar en la plataforma virtual de recursos del bro, usarlos nombres de Usuario
y Contrasefia defnidos en el punto numero dos. Elacceso a estos recursos es limitado.
Si quiere un némero extra de accesos, escriba a webmaster@alfaomega.com.mx
Estimado profesor: Si desea acceder a los contenidos exclusivos para docentes, por
favor contacte al represantante de la editorial que lo suela visita @ escribanos a:
‘webmasteraltaomega.com.mx
‘Videotutoiales que compiementan la obra,
‘Nuevo en Java 7: ajo este Icona se encuentran nusvas formas
de resolve algunas cuestiones en Java.
‘Conceptos para revordr: belo este icono se encuentran
delnicones importantes que reluerzan o expicado en fa pagina,
‘Comentarios o informacion exta: este icone ayuda a
‘Somprenider mejor o amp ol texto principal
‘Gontenidos interactvos: nica la presencia de contenidos extra
con ka Web,
Alfaomega Java a fondo - Ing. Pablo A. Sznajdieder114
Alfaomega
3 Acceso a bases de datos (JDBC)
3.1 Introduccion.
En este capitulo estudiaremos los mecanismos provistos por Java para que los progra-
mas puedan conectarse a bases de datos para consultar y modificar informacion.
Para esto, se requiere tener conocimientos bésicos sobre bases de datos relacionales
y SQL (Structured Query Language), Si el lector no esta familiarizado con estos temas,
no debe preocuparse porque comenzaremos el capitule brindando esta hase de cona~
cimientos requeridos, Si este no fuera el caso y el lector tiene experiencia en el tema,
fentonces podra saitear esta introduccién.
3.2 Conceptos basicos sobre bases de datos relacionales
Las bases de datos almacenan y gestionan informacién oxganizandola en forma de ta-
bias. Podriamos decir (en principio) que una base de datos es un conjunto de tablas.
relacionadas entre
Una tabla es un conjunto de filas y columnas. Llamaremos “registros” a las fla y “cam-
os" alas columnas. Los campos representan atributos y os registros representan valo-
‘es puntuales para es0s atributos. Asi si tanemos una tabla PERSONA con los campos:
nombre, DT y direcci an (atributos de una persona cada registro de esta tabla fila)
representaré a una persona,
En este capitulo trabajaremos con dos tablas: EXP (empleados) y DEPT (departamen-
103). A continuacién, veremos un ejemplo de los datos que estas tablas podrian llegar a
ccontenet,
DEPT Be
fdeptna [dname [lee jeune [ename [deptna [hivedate
i Ventas [Buenos Aes | |10 [Juan | 2105/80
2 (Compras [Buenos Aires |[20 |Abbeto [3 3/01/03
3 RRHH [La Plata 30 [Pedro (1 2106/85
40 [Marcos _|2 5/12/08
50 |uaime [2 Tee
0 [Pablo [1 TOE
\Vemos que la tabla. DEFT tiene tres registro (tres departamentos)y la tabla EMP tiene
‘seis (empleados). Vemios tambien que cada columna (cadla campo) contiene informacion
de un tipo de datos (enpna_son numeros enteros, =name son cadenas de caracteres,
hiredate son fechas, etc
La deseripcién “formal” de cada una de estas tablas la veremos a continuacién.
DEPT (tabla de departamentos)
* deptno (INTEGER, PRIMARY KEY)
* dame (VARCHAR (15), NOT NULL|
* Loc (VARCHAR(15), NOT NULL)
Lo anterior debe loerse de la siguiente manera: la tabla DEPT tiene tres campos:
eptno (niimero de departamento), ciname (nombre del departamento) y 19° (ooall-
dad donde funciona el departamento).
Java a fondo - Ing. Pablo A. Sznajdieder3.2 Conceptos basicos sobre bases de datos relacionales
115
Los campos son de un determinado tipo de datos. En la tabla DEPT, el campo depts
8 de tipo INTEGER (numérico entero) y los campos dame y loc son de tipo
VARCHAR) 18) (cadena de 15 caracteres). La tabla no admite campos ULL (campos
ue no tengan asignado un valor concreto),
Elcampo deptns es primary key (clave primaria). Esto exige que los valores de este
campo existan y sean tnicos para todos los registos. Es decir, en esta tabla, no puede
habet dos 0 mas registros con el mismo numero de departamento,
ENP (tabla de empleados)
© empna (INTEGER, PRIMARY KEY)
© ename (VARCHAR(15), NOT NULL)
* deptna (INTESER, FOREIGN KEY{DEPT.deptno| )
© huiredate (DATE, NOT NULL)
Elandlsis de latabla EXP es similar al dela tabla DEPT, pero hay una diferencia: EME
tiene una relacién de integridad con DEPT definida por la foreign key (clave foranea)
asociada al campo deptno.
3.2.1 Relaciones foraneas y consistencia de datos
En las tablas de nuestro ejemplo, ENP tiene la informacién de los empleados de una
Compafia y DEPT tiene la informacion de los diferentes departamentos de la misma, y
cada uno de los empleados registrados en ENP trabaja en alguno de los departamentos.
registrados en DEP?. Esta relacién esté dada porlos campos deptno de ambas tablas,
Analzando el ejemplo de datas expuesto mas arriba, verios que los empleados Juan,
Pedro y Pablo trabajan en el departamento 1 (ienen deptno = 1), Marcos y Jaime tra
bajan en el departamento 2 y Alberto trabaja en el departamento 3.
No deberia suceder que un emplead trabaje en un departamento que no existe. En otras
Palabras: no deberia existr ningun registro en EP cuyo campo ceptno no se corres-
onda con el campo deptno de alguno de los registros de DEPT.
Decimos que existe una “relaciin forénea” 0 foreign key entre el campo depo de la
tabla EMP yelcampo deptno de la tabla DEPT.
Sillegase a exist un registro en EXP cuyo deptno no estuviera registrado en DEPT,
tendriamos un problema de inconsistencia de datos, pero afortunadamente la base dé
datos no nos permit ingresar informacion inconsistente ni tampoco modificar la exis-
tente si es que a raz de esta modificacién vamos a ocasionar alguna inconsistencia de
los datos.
‘También tencrfamos inconsistencia de datos si en una tabla hubiera més de una fla con
la misma primary kay, pero esto tampoco sucederé porque la base de datos se inter-
onda en nuestro camino cuando pretencamos insertar una fla con una clave primaria
‘duplicad o bien cuando intentemos modifica la clave de una fla ya existente.
Estas resriociones se llaman "restricciones de integridad” o constraints.
3.2.2 Diagrama Entidad-Relacion (DER)
Como dijmos més arriba, muchas veces existen relaciones entre las tablas de nuestra
base de datos. Estas relaciones son fisicas (controladas por la base de datos através de
las constraints) y también ligicas, y esto tiene relacién directa con el disefio de nuestra
aplicacion,
Desde el punto de vista ldgico, las tablas son entidades y las relaciones existentes entre
estas se representan en un diagrama que se llama “Diagrama de Entidad-Relacién’ o DER,
Java a fondo - Ing. Pablo A. Sznajdleder
Alfaomega116
3 Acceso a bases de datos (JDBC)
Usar Eeipse como cliente SOL.
Alfaomega
peer
deptne emne
‘anane enane
Toe deptno
piveaase
Fig, 3.1 Diagrama de Ended Reacin,
En este diagrama vemos las dos tablas (entidades) y la relacién existente entre estas re-
presentada con una “pata de gallo. Sleemos esta relacién de izquierda a derecha dire-
mos que “en un departamento trabajan uno o varios empleados”. En cambio, sila leemos.
de deracha a izquierda diremos que “un empleado trabaja para un Unico departamento”
Decimos entonces que entre DEPT y EMP existe una “relacién de 1 a muchos’. Viendola
‘en sentido inverso decimes que entre EP y DEPT existe una “relacién de muchos a 1".
En otras palabras, cada regisfo de ENP se retaciona con un Unico registre en D527,
pero cada registra de DEPT puede tener muchos registro relacionados en EMP, Cuan-
ddo hablo de “registros relacionados" me refieo a que tienen el misma valor en el campo
deptno.
3.2.3 SQL - Structured Query Language
Para poder manipula la informacion contenida en las tables de la base de datos, existe
un lenguaje lsmado SQL (Structured Query Language, Lenguaje Estructurado de Con-
sults).
Este lenguaje prove sentencias para definir soportes de informacion (crear, modiicar y
eliminar tables, constraints etc.) y sentencias para manipulat la informacion que contie
nen las tablas (consultar datos, insertar, modificar y liminar registos, etc) Estos con-
juntos de sentencias se llaman respectivamente DDL (Oeta Definition Language) y DML
(Data Monipulation Language. En este capituo solo analizaremos sentencias DML.
Dentro de las sentencias DML, podemos diferenciar dos tipos de sentencias: querys
(consultas) y updates (modifcaciones).
3.2.4 Ejecutar queries
Gon estas sentencias podemos accede a ia informacién almacenada en las tablas de
la base de datos. En general, tenemos que especfcar la tabla desde la cual querer os
‘obtener informacion (F300), que campos de esta tabla queremas (SELECT la condicion
‘que deben cumpir los registros que queremes obtener (itEP=),
LLuago de ojecutar un quory, obtenemos un subconjunto de los datos de una tabla © de
\arias tablas unidas por alguna de sus relaciones.
‘Gon el siguiente query, obtenemos todos los registros dela tabla. BHP.
SELECT empno, enane, deptno, hiredate
FROM ea
objetivo de este capitulo es mostrar cémo podemes ejecutar sentencias SQL desde
los programas Java. Existen consolas de comandos SOL desde las cuales podemos
{jecuitar manuaimente las sentencias para veriicar los resultados que producen. Se pro
vee un videotutorial mostrando cémo podemos conectar Eclipse con la base de datos
1 cdmo podemos ejecutar las sentencias SQL dentro de la consola que Eclipse proves.
Java a fondo - Ing. Pablo A. Sznajdieder3.2 Conceptos basicos sobre bases de datos relacionales
17
En el siguiente ejemplo, obtenemos todos los registtos de la tabla EHP, pero solo los
Obtenemos todos los registras de la tabla EMP cuyo deptno sea.
SELECT empno, enane, hiredate, deptno
WHERE deptno
‘Todos los registos dela tabla EMP cuyo enane comienza con
SELECT empno, enane, hiredate, deptno
tay
‘Todos los registros de la tabla ENP tal que enacie comienza con ‘A’ y deptno es 3.
SELECT empno, enane, hiredate, deptno
FROM exp
WHERE enane LIKE ‘A$’ AND deptno = 3
3.2.5 Unir tablas (join)
Las tablas pueden “unirse” através de sus relaciones. Recordemos que existe una rela
cin entre las tablas EMP y DEPT dada por el campo cept no.
Con et siguiente query, obtenemos todos los registros de la tabla EMP, los campos:
fempno, enane yenlugardel campo deptno queremos elcampo cinane de a tabla DEPT.
SELECT e.deptno, s.enane, d.dname
ROM emp ey dept
WHERE e-deptno = d.deptno
Enel SELECT de este query, utizamos alias para identficar las tablas que (uego) def-
nimes en el FROM. ey d son alias de las tablas EMP y DEPT respactivamente, En el
WHERE especficamos la unin (o join} de ambas tabla.
El siguiente query retorna todos los registros de la tabla EMP, los campos enpz,
enante y dnane (este Uitimo de DEPT) para aquellos empleados cuyo eapno es menor
igual que 50,
SELECT e.deptno, e.enane, d.dname
FROM emp e, dept a
WHERE (e.empno <= 50) AND (e.deptno ~ d.deptno}
3.2.6 Ejecutar updates
Dentro de este grupo de sentencias, se encuentran aquellas que nos permiten insertar,
modifica y eliminar registts (111327, U2087% y DELEC=), También ubicamos dentro de
festa grupo de sentencias a las que lamamos DDL y que permiten (entre otras cosas)
crear y liminartablas (CFEATE TABLE, DRO? TABLE), alterar la estructura de las tablas
(LIER TABLE), ete. Esto es a titulo informative ya que, en este libro, no ullizaremos
sentencias DDL.
En ol siguiente ejemplo, vemos cémo insertar una fila en la tabla DEPT.
INSERT TITO dopt (deptno, dhane, 1o¢)
VALIES (4, ‘Capacitacion’, 'Santa Fe'|
Java a fondo - Ing. Pablo A. Sznajdleder
Alfaomega118
3 Acceso a bases de datos (JDBC)
Alfaomega
Debemos tener en cuenta que el campo ceptno es primary Key, por lo tanto, el registro
‘que estamos insertando debe tener un deptno que no coincida con el deptno de
ningune de los registros que ya existen en la tabla, de lo contrario tendremos un error
La siguiente sentencia permite modificar el valor de un campo en un registro.
UPDATE dept
SET loc = ‘Rosaria’
WHERE deptno - 4
Esto modifica el valor del campo Loc paraeel registro cuyo deptno es 4 que (de exist)
£8 tnico porque este campo es primary key.
La siguiente sentencia modifica el campo Loc en varios registrs.
UPDATE dept
SEP loc ~ ‘Mar del Plata’
WHERE loc LIKE "La Plata’
En la préxima sentencia, moditicamios dos campos en un registro de EHP.
UPDATE exp
SEF enane ='Pablo A‘, deptno = 3
WHERE enpno = 60
‘Obviamente, no tiene mucho sentido cambiarie el nombre a un empleado, pero podemos
pensar que io cambiamos para agregar la inical de su segundo nombre. También le
‘modificamos el deptno.
\Veremas ahora cémo eliminar un registro de la tabla EP.
DELETE FROM emp WHERE empno - 50
Qué sucedera si intentamos eliminar de la tabla DEPT el registro cuyo deptno es 1?
‘Como existe una restriccién de integridad entre DEPT y EMP dada por este campo, solo
odremos eliminar el registro en DEPT si no existen empleados en ENP que tengan
‘Len su campo deptns, Es decir, solo podramos eliminar el departamento si este no
tiene empleados. De lo contraro, primero tendremos que "mover" los empleados @ otro
departamento 0 (més drésticamente) elminarlos.
En las siguientes sentencias, “movemos” los empleados del departamento cuyo
deptno es 1 al departamento cuyo deptno es 3 y luego eliminamos al departamento
que quedé vacio,
UPDATE exp SET deptno = 3 WHERE deptno = 1
DELETE FROM dept WHERE deptno = 1
‘Obviamente, SQL puede legar a ser mucho mas complejo, pero con las ejemplos anali-
Zzados estamos cubiertos por demés para lo que requiere el alcance de este libro,
3.3 Conectar programas Java con bases de datos
La API que permite la conexion entre los programas Java y las bases de datos se llama
JDBC (ave Database Connectiviy)y se encuentra dono del paquete yaa.
Dentro de este paquets, encontraremos clases e interfaces través de las cuales po-
‘dremos ejacutar querys y updates, invocar procedimientos y funciones y, en definitiva,
acceder desde Java @ todos los recursos que proveen las bases de datos.
Java a fondo - Ing. Pablo A. Sznajdieder{3.3 Conectar programas Java con bases de datos
119
JDBC est disehiado en base a interfaces que definen (por ejemplo) Ia manera de estable-
‘er la Conexion, ia forma de ejecutar sentencias (querys 0 updates), etc. Por esto, antes de
poder ejecutar nuestro programa tendremos que disponer de un conjunto de clases que
implementen todas estas interfaces. A este conjunto de clases, se lo denomina “driver”
Para resumir esto, en el siguiente diagrarna (UML) de dependencia de paquetes, vemos
que nuestro programa (ubicado en el paquete muestro.paquete| _utliza las inter
faces del paquete 2va.cqly estas son implementadas por los drivers de Oracle
(oracle. jabe.drivex), HSQL (org.hsaldb) y por varios orvers mas que, genérica-
mente, los ubiqué en el paquete ot ro3.dziv
(|oo)
oracle. jabo. river
1 lt
Fig. 9.2 Diagrams UML de dependence de paauates
\Viendo este diagrama debe quedar claro que nuestra aplicacion no depende de ninguna
base de datos en particular, Solo depend (utliza) de as interfaces definidas en el paque-
te java.2c1. Detrés de estas interfaces podra haber instancias de implementaciones
de Oracle, de HSQL, etcétera
Es decie que con JDBC podemas conectar programas Java con cualquier base de datos
siempre y cuando dispongamos del driver especifco. Si quetemos conectarmos con una
base de datos Oracle tendremas que disponer del driver de Oracie y si queremos conec-
tarlo con DB2 necesitaremos el driver de DB2. En esta libro utiizaremos HSOL.
Los drivers son provistos por los mismos fabricantes de las bases de datas y en general
se entregan con estas como parte del producto.
Comenzaremos analizando un programa que, luego de conectarse a la base de datos,
fjecuta un query para obtener todos los ragistros dela tabla =P para (ago) mosteatlos
Por pantalla,
El programa puede dividiree en tres partes:
+ Levantar el chiver y establecer la conexién.
+ Ejecutar el query, iterarlo y mostrar los datos por pantalla.
+ Cerrar la conexién.
package Iibro.cap03.deno
import java.sql.Driveranagers
import Java. eqi.comection;
import java.sqi.Preparedstatenent;
import java. sqi.Resultset
Java a fondo - Ing. Pablo A. Sznajdleder
p
Can JOBC podemos conetar proga-
mas dava‘con cual base de datos
siempre y cuando dspengas el
dimer especicn
Alfaomega420 ‘3 Acceso a bases de datos (JDBC)
public class DenoSelect
i
public static void main(string!] args)
Z/ paranetros de 1a conexion
String usr
String pvd —
String driver = org. heqldb. jdboDriver";
String url = "jdhe:hagldb:hsql://localhost/xab";
Connection con = null;
Freparedstatement pstm = null;
ResultSet rs = null;
/f Aevanto et driver
Class, Fortane{ariver]
// establesco 1a conéxion
con = Driverianager.getConnection(utl, usr,pwd] 7
“
70 ** ears
“e
// detine un query
String sql="SELECT empno, enane, hiredate, deptno FROM emp";
7/ prepara 1a sentencia que voy a ejecutar
pate = con.preparestatement (sgl);
Uf ejecute 1a sentencia y obtengo los resultados en rs
bo = peta. executeguery (J?
// iteto los resvitados (registros)
while( rs.next(] )
c
// muestro Los campos del registro actual
Systen.cut.print ( cx.getInt (empno")4", ¥ ) 7
Systen-cutiprint ( re.getString|"enama"|+", * 7
System. out.print| rs.getDate|"hiredate"|+*, " |
System.ouf printla| rs. getInt ("deptns") |
}
d
catch (Exception ex)
‘
ex.printstackTrace():
throw new Funtinelxception ex);
}
finally
i
Alfaomega Java a fondo - Ing. Pablo A. Sznajdieder{3.3 Conectar programas Java con bases de datos
124
try
‘
Wx
7 paste 3 **
“i ~
// cierto todos los recuzees en orden inverse al que
¢/ fueron adguirides
A£{ ro!-null ) rs. close();
4£{ pstnl=null ) pstm.close();
4G£| con!=null ) can.claze|)
)
catch | Exception ex
‘
ex.printstackTrace (1;
throw new Auntinezicoption|ex)
)
+
,
i
Si analizamos este cédigo podremos notar que, salvo en estas dos lineas:
String driver = "org.haqldb. jdbeDriver”.
String url = "jdbe:heqldbrhoql://lacelhost jah";
ro hay ninguna referencia ni mencién a la base de datos a la cual nos estamos conec-
tando. Es decir el cédigo quada totalmente indepencizado da la base de datos; por Io
tanto este programa puede (modificando adecuadamente las dos lineas mencionadas
mas arriba) conectarse a Oracle, MySQL, SQLServer, DB2, HSQL, PostgreSQL, etostera,
Volviendo al programa, para establecer la conexién, ejecutar el query y obtener los re
sultados utiizamos los objetos con, pstm y r= cuyos tipos son Connection,
PreparedStateent y ResultSet’ respectivamente
Lo primero que hacemos es levantar el driver a memoria. Esto lo hacemos con:
Class, fortfane (driv
Con el driver levantado poderos establecer la conexién. Lo hacemos con:
con = DriverManager. getConnection url, usr,pwd)
Evidentemente, el método estético getConnection de la clase DriverManayer es
un factory method a través del cual obtenemos una instancia de la clase concreta que
implementa la interlace Comestica, Esto lo podemos verificar facilmente agregando
al cédige la siguiente linea:
System, out-printin( con.getClass|).getNane() 7
La linea anterior imprimiré en consola lo siguiente:
opg-hsqldb. jabe. jdbeconnection
Verificamos asi que el objeto que contiene la variable. can es en realidad una instancia
delacase jabcConnect ion que se provee como parte del driver de HSQL.
TTeniendo establecida la conexién, el préximo paso serd ejecutar el query que lo defini-
mos en una cadena de caractores y lo ejacutamos de la siguiente manera:
Java a fondo - Ing. Pablo A. Sznajdleder
Alfaomega122
3 Acceso a bases de datos (JDBC)
p
Cada to de datos SOL se covesponde
‘can algin tipo de datos Jav, Por een
lo, VARCHAR se representa como
Sting, DATE se representa com
Java. sql.Date, edie,
£7
{in Jova 7 podemos decarary abr
curses dieclamente en el ty. Inu
50, no necestamas cerrarins expla
‘mente porque la mayoria ce esas son
“utoclsables”.
tnt al lector a consuitar el capt
correspondiente de acuatzacn.
Alfaomega
String sql="SELECT enpno, ename, hiredate, deptno FROM emp":
etm ~ con,preparestatenent (ql):
a = potm, executepuery (}7
El método executeguery retorna una instancia de FesultSet. El resultset “es" el
‘conjunto de filas retornado por el query que acabamos de ejecutar.
Internamente, el objeto resultset tiene un puntera que apunta a “Ia fila nlimero 0°, Para,
acceder ala fita nimero t (la primera fila del conjunto de resultados), debernos avanzar el
puntero y esto jo hacemos con el método neist_que, luego de avanzario, rstorna. tru
© false segun exista una fla mas para avanzar ono.
En el siguiente fragmento de céciga, avanzamos el puntero del resultset mientras este
tenga mas fllas para procesar.
while( re.next() |
4
system. out.print | re.getint ("expno"|+", " )3
System. out-print | rs.getstring|"enane")+", " )7
System. out.print | rs.getiate("hiredate”|#", " jz
System, out.printIn( rs.getInt("deptno") )+
}
\Vernos también gue podemos aoceder alos diferentes campos de la fla actual (a apuntada
por el puntero det resulset) a través de los métodos getXier especificanda el nambre det
‘campo. 240 representa el tio de datos del campo. Asi, siel campo es INTEGE? entonces
‘accedemos asu valorinvocando al méiodo getTnt. Sielcampoes VARCHAR. entonces ui=
lizamos el método getString ysielcampoes DATS entonces el metodo sera getDate,
Existe una relacion directa entre los tipos de datos de SQL y los tipos de datos de Java. Esta
relacion la mayoria de las veces es intuitive, pero sien algin caso no lo fuera enionces af
{abricante dela base de datos que estemos uikzando sera e responsable de documentara
‘Aigunos ejemplos de esta relacion de tipos son (tjo0SL. - tipodava}
INTEGER ~ int
DOUELE — double
DECIMAL - Java.aath. BigDecimal
MOMERIC — javaanth. BigDecimal
VARCHAR - String
DATE - Java.aql. Date
Por dltimo, en el finally cerramos los recursos que utlizamos: rs, pstm y can. Los
‘métodos “lose de estos abjetos pueden arrojar excepciones de tipo SOLEStception,
por este motivo los encerramos dentro de su propio bloque try-catch,
finally
{
ty
4€( rs!enull ) rs.close();
it( patml-mll ) patm.cloze
if{ con!=null | con.close();
d
catch (Exception ex)
{
ex. printstackTrace()#
throw new RuntimeBxception(ex;
}
}
Java a fondo - Ing. Pablo A. Sznajdieder{3.3 Conectar programas Java con bases de datos 123
Sibien la interface ResultSet tiene métodos que permiten retroceder 0 mover arbitra-
riamente el puntero hacia cualquier fla del conjunto de resultados, generaimente y por
cuestiones de rendimiento, es preferible evitarios.
En este libro siempre considecaremos que el resultset es forward only.
3.3.1 Invocar un query con un join
En el siguiente codigo, mostramos por pantalla los resultados de un query que usa
tn join para unir datos de dos tablas diferentes. Es deci, mostramos los datos de
los empleados y (entre paréntesis) mostramos el nombre del departamento en el que
‘rabajan
String sql-"";
'SELECT ©.enpno AS
yecename AS enane ";
jechiredate AS hiredate ";
pecdeptno AS deptno";
ya.dname aS dnane ";
"FROM exp 8, dept
WHERE e.empno = d.deptno ™,
petm ~ con.prepareStatenent (eq)
re ~ petmsexecuteguery (17
while( ravnext|) |
{
system. out.print | re.getant (Yempno")+", " )2
System. out-print| rs.getString|"enano")+", " );
System. out.print | rs.getInt ("deptno"}+" ("je
Syeten. out-print| rs.getstring|"duame
Systen. out.printin| rs.getDate
}
El query que ejecutamos en este segmento de cédigo trae datos de dos tablas dife-
rentes, Los métodos gefXex no permiten especifcar tabla.campo par lo que twimos
ue asignar alas a los campos para poderlos referenciar univocament. Asi, dentro del
ile, rferenciamos al campo ¢.chanie por su alias duane de la siguiente manera
ra.getString("dname")
3.3.2 Updates,
Consideramos update a toda sentencia que no comience con SELECT. Asi, serén update
las sentencias DML INSERT, DELETE, UPDATE yas sentencias DDL CPEATS, DROP,
ALTER, etestera,
3.3.3 Ejecutar un INSERT
Enel siguiente cécigo insertamos une fie en la tabla DEPT
string sqi=""
INSERT INTO dept (deptno, aname, Loc) "y
VALUES (?,,2) "7
Java a fondo - Ing. Pablo A. Sznajdleder AlfaomegaPrélogo
A partir de los aos ochenta, la Humanidad ha comenzado
luna nueva revolucién, equiparable a la Primera Revolucién
Industrial: estamos hablando de fines del siglo xm y pri
pios del xx de nuestra era, la actual revolucién ala que me re-
fiero es la Tecnolégica, con la aparicion de las primeres com=
putadoras nos referimos a la década de los sesenta y a partir
de los ochenta con las primeras computadoras personales.
Luego de este ditimo periodo, hemos vivide avances tecno-
l6gicos de manera vertiginosa con cambios que, en un pri
Pio, fueron paulatinos pero, ahora, son cada vez mas répidos
ebido a la aparicion de nuevos dispositivos electronicos
como computadoras, celuares, videojuegos, televisores, et-
cetera.
El hardware es cada vez més pequefo, pero mas potente,
mas eficiente en cuanto a la capacidad en el manejo de la
informacién, siendo atractivo para los usuarios finales en
precios, portablidad, tamafo, resolucion de pantalla, peso,
etcétera
En cuanto al software, este ha avanzado mas répido que el
hardware can el desarrolia de nuevos lenguajes de progra-
macién, lo que ha obligado a las empresas desarroliadoras
del hardware a la compactacion y eficlencia del mismo,
Uno de los lenguajes de programacién que tiene mayor im=
portancia sabre los demas es Java, el cual es dominante en
la creacién de aplicaciones empresariales, elaboracién de vi-
deojuegos, sitios Web, etcstera
tra caracteristca importante es que Java es multiplatafor-
mma, Io que significa que las aplicaciones programadas con
este lenguaje pueden “correr” en cualquier sistema operative
Y hardware, Esto lo posiciona como el lenguaje de programa~
cién mas versatil de, al menos, los Ultimos 18 aos,
Java, como lenguaje de Programacién Orientada a Objetos
(POO) requiere del conocimiento de diversas técnicas (He-
rencia, Polimorfismo, Abstraccién, Encapsulamiento, etc.)
las cuales son importantes que el lector domine para poder
dsarroliar aplicaciones flexibles, mantenibles, robustas y
escalables,
Llevado al ambito empresaral, las aplicaciones Java pueden
interactuar con bases de datos, servidores de mensajeria
asinerdnica, servicios de nombres y directorios, Web
services, etoétera, lo que facilta enotmemente las tareas de
integracisn y el desarrollo de sistemas distribuidos.
Por lo expuesto, Java es “mucho més" que un simple len=
{uaje de programacién: y para conocerio no solo se requiere
aprender su sintaxis y seméntica. Tambien es fundamental
conocer técnicas de disefio que, stmadas a las potenci
Java a fondo - Ing. Pablo A. Sznajdleder
lidades del lenguaje, nos ayuden @ desarrollar aplicaciones
duraderas en el tiempo.
El libro Java a fondo explica cémo desarrallar aplicaciones
Java desde un enfoque de disefo y en sintonia con los linea-
‘mientos recomendados por los expertos de la industria
Comienza desde cero y avanza progresivamente incorporan-
do conceptos, que se van reforzando a medida que expone
ejemplos sencillos y aficaces,
E libro se diferencia de los demas porque no aburre con ex-
tensas e interminables listas de palabras reservadas, opera-
dores, regias, clases y métodos. Por el contrari los cono
cimientos se proporcionan conforme van siendo necesavios,
segtin sea el ejemplo 0 caso prictico que se esté analizando
en cada capitulo.
‘Aunque Java a fondo solo cubre JSE (Java Standard Eaton),
pilantea y explica las técnicas y los patrones de disevio que
son pilares en JEE VJava Enterprise Edition), dejando al lec-
tor en la puerta del desarrolio de aplicaciones empresaria
les, Session Facade, Model View Controller, Factory Method,
Data Access Object son algunos de los patrones de disefio,
{que el autor explica con una simpleza que sorprencle, hacien=
do facil o que en Internet y en otros libros se presenta como
imposible, eltista o para pocos.
‘Java fondo hace hincapié en el disehio de aplicaciones desa~
rrolladas en capas logicas, las cuales proveen sus servicios a
las capas anteriores y se nutren de los servicios provistos por
las capas posteriores. Me refiero a las famosas “capa de pre-
sentacion", “capa de negocios” y “capa de acceso a datos”.
Cabe destacar que el autor complementa la obra con una
serie de tutoriles en video en los que él mismo explica aque
llos temas que, dada su naturaleza, resultan dificles de ex-
plicar en papel. Estos videos cubren, desde cémo instalar
Eclipse (la heramienta de desarrallo que el autor recomienda
utilizar), hasta cémo montar un entorno de objetos distribui-
dos RMI; pasando por cémo disefiar visualmente interfaces
‘graficas, coma usar el debugger, coma conectarse a la base
de datos para ejecutar consuitas, etcétera.
Finalmente, en esta nueva edicién, se incorporan dos capitu-
los que introducen al lectar en el uso de Hibernate y Spring;
‘estos frameworks de “persistencia de objetos” e “inyeccién
de dependencias” respectivamente son extensamente usa-
dos en la industria de desarrollo y muchas veces se requiere
‘conocerlos para incorporarse al mercado labora24
3 Acceso a bases de datos (JDBC)
Alfaomega
// seteanos Jos valores de los parametros
patm.setInt (1,4);
setstring(?,"Louistica™);
petString(3,"Yar del Plata");
tdo = patm.executetpdate();
if( rtdo— 1)
‘
system. out.printIn("l fila correctamente insertada"|;
1
else
{
throw new Run
}
Exception("No se pudo insertar la fila");
Las sentencias preparadas (orepared statement) pueden ser parametrizadas. Los pa-
rametros se definen con un caracter ? (signo de interregacion). Luego tenemos que
asignar valores concretos a los pardmetros antes de poder ejecutar la sentencia, Esto
lo hacemos invocando sobre la prepared statement stm Jos métodos sete donde
X01 €8 el tipo de dato de! arqumento que estamos pasando. Estos métodos reciben un
‘nimero que comienza desde 1 indica la posicion relativa del pardmetro dentro de la
‘entencia parametrizada.
Analicemos este fragmento de eddigo:
NSERT INTO dept (deptno, dnae, loc) "s
RIMES (2, 2,2) "2
n.peeparestatenent (sql)
setString(2,"Lagistica");
setstring(3, "Yar del Plata");
tdo = potn.executelpdate|)
‘Aqui primero definimos una sentencia INSERT con tres pardmetros. En el primero asig-
‘namos un valor 4 (numérico entero) invocando al método setInt, en el segundo y en el
tercero asignamos strings através del método setting. Luego ejecutamos la senten-
ciacon ezecutepdate y como valor de retomo obtenemos un entero que llamaremos
Update count que indica cuantas filas resultaron afectadas a causa de la sentencia que
lacabamos de ejecutar. Como en este caso ejecutamos un TSERT esperamos que el
Update count sea 1. Si esto no es asi sera porque ocumré algin enor.
En el siguiente ejemplo, vemos cémo podemos insertar multiples flas en una tabla,
pstm = con.prepareStatement (sql) +
for(int 1=100; i<150; i+)
i
potm.setInt (1,4)
patmisetString|2,"Nonbretept ("+i+")"
Potm. setstring|3, "LocDept™
int ftdo = pst. oxecutelpdate()
Java a fondo - Ing. Pablo A. Sznajdieder{3.3 Conectar programas Java con bases de datos
125
if( rtdo I= 1}
¢
throw new Ru
inoExcoption|"Error
}
Como pademas ver, una misma sentencia preparada puede ser invocada mas de una
‘vez. En este caso, utlizamos esta posibiidad para inserta 50 fas en la tabla DEPT,
3.3.4 Ejecutar un DELETE
Enel siguiente ejemplo, eliminamos una fla de la tabla. 22
string sql="";
Sqlt="DELETE FROM emp WHERE enpno = 7";
etm = con,preparestatement [sql)
// quiero borrar al empleado cuyo empno es 2
potm.setInt (1,20);
int Ftdo ~ petm.executelipdate |};
if( rtdo > 1)
{
String macg—"Error: "4rtdot" files eliminadae.
throw new Runtimetxception|msg) :
)
Notemos que si el update count resulta ser mayor que 1 seré porque eliminamos mas
files de las que esperabamos. En este caso, arrojamos una excepcion pero, obviamente,
ya sera tarde porque las filas ‘ueron eliminadas. Para tratar este tipo de problemas, uti=
Zaremos transacciones, tema que analizaremos mas adelante,
3.3.5 Ejecutar un UPDATE
En! siguiente ejemplo, *mudamos" todos los departamentos registrados en DEPT ala
localidad de “Buenos Aires"
String eql="UPEATE dept SET loc = 2";
potm - con.preparestatenent [eql) +
Fotu.setString|1, "Buenos Aires");
int rtdo ~ petm. executelipdate |);
system. out.printIn(rtdot™ {las wpdateadas”);
3.3.6 El patrén de disefio “Singleton” (Singleton Pattern)
Come explicames anteiormente, un patrén de disefo suglere una solicién efciente y
generalmente aceptada con la que podemos resolve un determinado ipo de problemas.
En este caso, el problema que tenemos (o mejor dicho, el problema que vamos a tener en
los siguentos pdrafes) os el de obtener siompro la misma y nica instancia de una case.
Coneretamente, estoy hablando de la conextn con ta base de datos.
Una ver establecida la conexién, debemos manteneiainstanciada para podera utiizer
durante toda la ejecucién de la aplicacién. Una Unica conexién es suficiente para ejecutar
{edos fos accesos ala base de datos, polo tanto, tenemos que evlar instaniala mas
de una vez ya que el hecho de establecera es castoso en terminas de procesamiento,
twafco de red y tiempo.
Java a fondo - Ing. Pablo A. Sznajdleder
Alfaomega126
3 Acceso a bases de datos (JDBC)
singleton pattem permite garantizar
‘que tenoremos una Unica instancia de
‘a case,
p
Alfaomega
Una implementacién simple del Singleton Pattern consiste en definir esttico y privado
al objeto que queremos que sea Unico y proveer un método de acceso estatico para
accederlo. Denito de este método, preguntamos si el objelo es null, en ese caso lo
instanciamos y luego lo retornamos. Sino, simplemente lo retornamos.
En el siguiente ejemplo, vemos cémo utiizamos un Singleton Patter para mantener una
Unica instancia de un string.
public class DenoSingleton
1
private static String s = null,
public static String obtenerstring{|
1
ifs
i
5 = nev String("unica Instancia’
)
Dentro de cualquier otra clase, podemos acceder a esta Unica instancia a través del mé
todo estitico cbtenerStriny como veremos a continuacién
= DenoSingleton. obtenerString(|
DenoSingleton. obtenerstring(];
System. cut.printIn(" Son 1a misma {y unica) instancia 1! ")
?
3.3.7 Singleton Pattern para obtener la conexion
I Singleton Pattern nos ayudard a establecer la conexién con la base de datos de ma-
rnera ms simple y agil, de forma tal que en nuestro programa simplemente la podamos
“pedir” y asi obtenerla sin tener que preocuparas por "levantar” el driver, conacer el
usuario y el password, defini a uri, etcetera
Con este objetivo desarrollaremos la clase UConnection donde implementaremos
este patron de disefio para crear y mantener una Unica instancia de la conexisn, La clase
Connect ion tend la siguiente estructura:
public class Uonnection
4
public static Connection gotConnection(){ ... }
:
Y sera la responsable de:
‘+ Establecer la conexién la primera ver que se pida (la primera vez que se invoque el
método getConnect ior).
+ Proveer acceso a la conexién (ya establecida) en cada invocacién al método
getConnection posterior a la prmera,
* Cerrar autarnaticamente la conexién cuando fnalice el programa.
Java a fondo - Ing. Pablo A. Sznajdieder{3.3 Conectar programas Java con bases de datos 17
Para el cltimo punto, tendremos que poder determinar el momento exacto justo antes de
ue finalice la aplicacién para poder cerrar la conexién con la base de datos. Esto solo
serd posible utilzando lo que se llama “shutdown hook’, pero su anélisisy explicacién lo
djaremos para luego de haber analizado el cédigo de la clase Connect ion.
package Libro.cap03, eno
import
import java.sqi.DriverManage
import java.util.AesourceBundle;
public class Uconnection
{
private static Connection cormnull;
public static Connection getconnection(}
// con esto determinanos cvands finalize 21 programa
Runtime. getRuntine () ,addShutdowntiook (new 11 ShDwnkiook ()
ResourceBundle rb-ResourceBundle. getBundi=(" dbo"):
string driver-rb-getstring("driver");
String urlerb. getStrang("url"
String pwd-rb. getstring("ped")
String uer-rb.getString("sex");
class. forname {driver};
con = Driverlisnager, ge¢Connection url, use, pw] 7
)
return con?
2
catch [Exception ex)
£
ex.printstacktrsce|);
throw new Runtinetscaption("Error al crear la conéxion", 3x);
t
,
static class 1ishpuwick extends thread,
4
// Justo antes de fnalizar o1 programa 1a Jy invocaza
Ufa este metodo donde podenos cerrar 1a conexion
public void rin|)
C
ery
Comection con = UCamection. getGonnection( |
con.close\)?
Java a fondo - Ing. Pablo A. Sznajdleder Alfaomega128
3 Acceso a bases de datos (JDBC)
”
8 shutdown hook es un mecanismo a
trav del cual Java nos notticard que
programa tnai6 para que, Si quee=
‘mos, podaas hacer ago,
Alfaomega
t
cateh( Exception ex }
c
ex.printStackTrace|};
throw new Runt inercaption (ex);
}
3
2 .
La primera vez que se invoque al métode yetConnection la vatiable estatica con
‘sera nil por lo que se entraré al if para levantar el driver e instanciar la conexion,
Las veces sucesivas, como con 8 estética mantendra su valor y este sera distinto de
UL] por lo que el método estard retornando siempre Ia misma y Gnica instancia de la
cconexién con la base de datos.
Para no hardcadear los pardmetros de la conexién, optamos por escribrtes en un archivo
de propiedades que llamamos “jdbc properties” y que debe estar ubicado en el package
root, con el siguiente contenido:
pwd =
driver = org.hsqldb. jdbepeiver
url = jdbe:hsqldb:hsql://localhost/ xd
3.3.8 El shutdown hook
Java tiene mecanismos de notificacién a través de los cuales el programador puede
notificarse a medida que ocurren diferentes sucesos o eventos. En general, a estos me-
‘canismos se los conoce como listeners (escuchadores), pero antes de que existiera Java
festa téonica era conacida como hook Cgancho")
En ol caso particular de la ocurrencia del evento shutdown (finalizacién de la ejecucién
de la méquina virtua), podemos registrar nuestro listener (o hook) dela siguiente manera:
Runtime. getBunt ime () . adlshutdowntlook (new MiShDwnHook() 7
Donde 21ishDwntiook es el nombre de una clase que extiende de Thread y sobres-
cribe el método run. La méquina virtual invocara a este método justo antes de fnalizar
‘su ejecucién, por lo tanto, es en este métode donde podemos cerrar la conexion ade
‘cuadamente,
Notemos también que la clase HiShDwrHack esta ubicada dentro de la clase
‘UComnect ion, En Java existe esta posibildad: se lama inner class.
3.3.9 Inner classes (clases internas)
Una ner class (o clase interna) es una clase cuyo cédigo esta ubicado dentro de otra que
llamaremos “clase contenedora’, Esto solo tiene sentido sila clase intema es totalmente
dependiente de a case contenedora entonces la ventaja de piantearla como inne class es
‘que en un unico archivo tenemos las dos clases que, en realidad, son parte de lo mismo.
La ner class tiene acceso a los miembros de la clase contenedora aunque estos sean
privados.
Debe quedar claro que el hecho de que una contenga a a otra no implica més que eso:
una contiene a otra, pero no existe ninguna relacién de herencia entre elas.
Gon la clase Connection, terminada podemos replantear cualquiera de los ejemplos
anteriores dela siguiente maner
Java a fondo - Ing. Pablo A. Sznajdieder{3.3 Conectar programas Java con bases de datos
129
ine
public class vonoselect
t
public static void ssin(Steing!]) args)
Comection con = ma:
Proparcdstatenent pst
ResultSet ve ~ mull;
null;
try
c
/f establezco 1a conexion
con = UWonnection. getConnection{}7
We
#/ hago todo 10 que tengo que hacer...
a
}
a
3.3.10 Manejo de transacciones
Llamamos “transaccin” a un conjunto de acciones que deben ser ejecutacas de mane~
ra indivisible o atémica. Todas deben ejacutarse correctamente, pero si alguna legase
a falar entonces se debe volver al estado incial como si ninguna de estas acciones se
hubiera ejecutado. Una transaecién es “iodo nade”. Nunca “parte siy parte no”
Las bases de datos son transaccionales, porlo tanto, como programadores, nest pro-
blema no serd implementar la transaccién sino administrarla delimitando el conjunto de
sentencias que la integrarén y luego de ejecutarlas, confirmarlas (commit) o deshacerlas
(relict).
Lainterface connection tiene tos métodos contr, wait.
Este dltimo permite asignar un valor true 0 false ‘a la propiedad auto commit de
la conexién que, per defecto, es true. Por este motivo, cada updete que ejecutemos
desde un programa Java se ve inmediatament reflejado en la base de datos, pero si
antes de comenzar hacemos con.setAutocommi t (false) entonces tendremos que
confimar explictamente e! éxito de las operaciones invocando al método commrit 0
bien dejaras sin efecto invocando al método rollback.
Replantearemos e! ejemplo donde ejecutébamos la sentencia DELETE. para borrar una
tinica fila de la tabla EMP. En este caso podremos verifcar el valor del update count y
confmar(commitea) la operacién solo si este valor es 1 (una Gnica fla elminade).
as
public class Demopelete
{
public static void uain(string{] ara)
(
Connection con = null;
ProparedStatenent pstia = null;
Java a fondo - Ing. Pablo A. Sznajdleder
Alfaomega130
3 Acceso a bases de datos (JDBC)
Alfaomega
(
/f obtengo 1a conexion
con = UWonnection, getConnection
/f seteo © autocommit en false
con. setAutoCommit (false)
// define ¥ ejecuto 1a sentencia DELETE
String sql = "DELETE FROM enp WHERE eupno = 7";
pstn = con-prepareStatement (salli
pote. setint (1,20);
int rtdo ~ pstn. executeUpdate ()
// $e atecto una sola tla como esperabamos...
Af( edo == 1)
c
// tods of entonces
con. commit {)
onmiteo 1a operacion
else
c
throw naw RuntineRecept ion "Error.
}
}
catch( Exception ex )
f
ex. printstackTrace()s
throw new Funtine=xeeption ex)
// roltback "por tas dudas”
4£( con 1= null } con.roliback|)?
4£( pstm {= nul } pstm close!) +
catch( Exception ex ]
¢
ex.printstackTrace|};
throw new Pant ineBecaptson (ex);
'
}
}
1
Una vez commiteadl la transaccién los cambios serén permanentes, por lo tanto, por
mas que invoquemos el método rallback este no podra deshacer lo que ya fue
commiteado. Por este motivo, invecames al comnit dentra del try @ invocamos al
rollback dentro del final ly
Java a fondo - Ing. Pablo A. Sznajdieder3.4 Uso avaneado de JDBC
3.4 Uso avanzado de JDBC
3.4.1 Acceso ala metadata (ResultSetMetabat:
La API IDB provee mecanismos através de los cuales podemes acceder aa metadata
del resultset Esto es aoceder aos datos de fs datos"
Por ejemplo, si ejecutamas un query a raiz del cual obtenemos un corjunto de fas y
columnas (dena varias tables) lamaremos metadeta a
cl nombre de cada una de las colurmnas obtenises
lipo de dato de cada una de las columnas
la precision
at
Analicemos el siguiente query sobre las tablas =P y DEPT:
SELECT e,empno AS expno
elename AS enane
} ehiredate AS hi
+ erdeptno AS deptno
a.
a
} didname AS doane
+ d.loc AS Loc
FROM GRP e, dept d
WERE
Este query trae 6 columnas de tipo INTEGER, VARCHAR, DATE, INTEGER, VARCHAR
y. VARCHBE respectivamente. Cada columna puede nombrarse 0 “etiquetarse” por un
ome Unico (abel. A toda esta informacién relacionada a la estructura de datos del
resultset, se puede acceder a través de la clase FesultSetlfetalata como veremos
‘en el siguiente ejemplo,
Mie
public class DenolistaData
{
public static void main(string[] args)
c
Connection con-mull
ResultSet rsenull;
EreparedStatenent petu-null;
try
c
// obtengo 1a conexion
‘con = UConnection. getConnection()
.empno AS empno ">
e.enane AS ename "}
elhiredate as fecha
eideptna AS depen "
didnane AS dane
diloc AS los
‘Sq1t-"EROM emp e, dept a"
SqIt="WHERE e,deptno = d.deptne
Java a fondo - Ing. Pablo A. Sznajdleder
134
Alfaomega132 ‘3 Acceso a bases de datos (JDBC)
pote = con.preparestatement (aql) 7
Fe = peta. executeguery(]7
RegultSetNotaDate xd = re, getMetaData()?
// misstro ta metadata
_nostrarMetaData ind) ;
(/ mestro las las del result set
_mostrarData(rs];
}
Wan
?
private static void sostrariietafata ResultSstNetabata md)
throws Exception —
f
ff cantidad de columnas de) resultset
int cantCols = md. qetColumnCount ();
System. out.printin{cantCols+" colunnas obtenidas”);
System, ovt-printIn|);
for( int i=l: i
ci
Systen. ovt.print ("Column wro. "+i4", ")7
antCols; i++ )
(/ label (alias 0 nombre) de 1a i-esima columna
Syaten. our.print |"Label: "tud.getColumnbabel |1)+", ")
// codigo de tipo de dato de 1a i-esima colwna
System. ovt.print ("Type: "4nd. getColumntype|i|+"
"i
// nombre del tipo de dates de 1a i-esima columa
System. ovt.print md. getColumntypeNane(i)+"), " 1:
U/ precision del tipo de datos de 1a i-esima colwmna
Systen. ovt.printIn("Preciaion: "+nd. getPreciaion(i)) +
A
System. ovt.printin|)+
}
private static void mostrarData|ResultSet rs) throws Exception
‘
int cantCols = ce.getMetatata|).getColumntaunt (|
while( ra.next() )
‘
for| int i=1; 4
c
antols; itt )
Systes.out.print ( es. getString(i))7
‘System. out. print ( iccantCols?" ,":
:
Systen. ovt.printin();
}
}
Alfaomega Java a fondo - Ing. Pablo A. Sznajdieder3.4 Uso avaneado de JDBC
133
Elmétodo getColumntype retornaré un entero que coincidiré con alguna de las cons-
‘antes definidas en la clase java.sq.Type algunas de las cuales son
ARRAY BIGINT EIARY at BLE
BOOLEAN CAR clas DATALINE | DATE
DECAL DESTINGT DOUBLE FLOAT INTEGER
TaVA_GBUECT | LONGVAREINARY | MULL WOMERIC | OTHER
REAL RSE SMALLING | STRUCTURE | TIME
Testa | TINVINT
3.4.2 Definir el “query fetch size” para conjuntos de resultados grandes
Llamamos fetch size al nimero de filas que serdn leidas y transferidas entre la base de
datos y el programa Java que ejecut el query cada vez que seinvoque el método nest
sobre el resultset
Es decir, si consideramos un fetch size = 100, la primera vez que invoquemos al méto~
do next para obtener una fia del resuitset, el cver traera desde la base de datos las
primeras 100 fas. As, durante la siguientes 99 invocaciones al método next el driver
simplemente retornard una de la fas que tiene en la memoria local.
Esto incrementa notablemente el rendimiento de nuestra aplicacién porque reduce el ni=
mero de llamadas (generelmente lamadas de red) entre el programa y la base de dates.
Podemos definir el fetch size con el que queremos trabajar a través del método
setFetch3ize dela prepared statement stm como vemos a continuacion:
int n-100;
atm. setFetchsize(n|;
En general, se recomianda su uso para ejecutar query que ratornen grandee conjuntos
de resultados. Para conjuntos pequefis no tiene demasiado sentido.
3.4.3 Ejecutar batch updates (procesamiento por lotes)
Si necesitamos ejecutar varios updates podemos utilizar el “pracesamiente por lotes”
© batch update agregandolos uno a uno ala Statement para luego ejecutarlos todos
juntas como un late de trabajo. Esto reduce considerablemente la comunicacién (usual-
mente de red) entre el programa Java y la base de datos aytckindonos a increment el
rendimiento,
En este ejemplo utiizaremos un objeto de tipo Statem=nt que representa una sen-
tencia que no ha sido preparada con anterioidad, por lo tanto cada update batch que
agreguemos deberd estar completo con todos los datos, no puede ser parametrizado.
// obtensmos 1a conexion
connection. getConnection(}
con. setAuteCommit (false):
Java a fondo - Ing. Pablo A. Sznajdleder
Alfaomega