Abrir el menú de navegación
Cerrar sugerencias
Buscar
Buscar
es
Change Language
Cambiar idioma
Cargar
Iniciar sesión
Iniciar sesión
Descargar gratis durante días
0 calificaciones
0% encontró este documento útil (0 votos)
276 vistas
446 páginas
Java A Fondo
Cargado por
Juliux Patbiz
Título mejorado con IA
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido,
reclámalo aquí
.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
Descargar
Guardar
Guardar Java a fondo para más tarde
0%
0% encontró este documento útil, undefined
0%
, undefined
Insertar
Compartir
Imprimir
Reportar
0 calificaciones
0% encontró este documento útil (0 votos)
276 vistas
446 páginas
Java A Fondo
Cargado por
Juliux Patbiz
Título mejorado con IA
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido,
reclámalo aquí
.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
Carrusel anterior
Carrusel siguiente
Descargar
Guardar
Guardar Java a fondo para más tarde
0%
0% encontró este documento útil, undefined
0%
, undefined
Insertar
Compartir
Imprimir
Reportar
Descargar ahora
Descargar
Está en la página 1
/ 446
Buscar
pantalla completa
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 Criterio
0 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
[email protected]
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
También podría gustarte
Arquitectura de Microprocesadores Los Pentium A Fondo
PDF
Aún no hay calificaciones
Arquitectura de Microprocesadores Los Pentium A Fondo
230 páginas
Javascript Elequent
PDF
Aún no hay calificaciones
Javascript Elequent
450 páginas
Ampliar, Configurar y Reparar Tu PC
PDF
100% (1)
Ampliar, Configurar y Reparar Tu PC
521 páginas
Digital Journey From Monolith To Microservices 2nd Edition April2020 ES
PDF
Aún no hay calificaciones
Digital Journey From Monolith To Microservices 2nd Edition April2020 ES
103 páginas
Orientación A Objetos - Compressed PDF
PDF
Aún no hay calificaciones
Orientación A Objetos - Compressed PDF
232 páginas
Medidas Cautelares
PDF
Aún no hay calificaciones
Medidas Cautelares
23 páginas
Ingenieria de Software
PDF
100% (2)
Ingenieria de Software
87 páginas
GW Jegjjsdcc
PDF
Aún no hay calificaciones
GW Jegjjsdcc
325 páginas
Programacion Web Movil
PDF
Aún no hay calificaciones
Programacion Web Movil
197 páginas
Slides-Flujo de Desarrollo Moderno Codestream
PDF
Aún no hay calificaciones
Slides-Flujo de Desarrollo Moderno Codestream
126 páginas
Anaya - Mantenimiento Y Reparacion Del PC Edicion 2006
PDF
Aún no hay calificaciones
Anaya - Mantenimiento Y Reparacion Del PC Edicion 2006
631 páginas
Lógica de Programación Orientada A Objetos: Un Enfoque Basado en Problemas
PDF
Aún no hay calificaciones
Lógica de Programación Orientada A Objetos: Un Enfoque Basado en Problemas
286 páginas
Universidad Ciudadana de Nuevo Leon
PDF
Aún no hay calificaciones
Universidad Ciudadana de Nuevo Leon
5 páginas
Python Essentials 1. The Official OpenEDG Python Institute Beginners Course 2023-Páginas-1
PDF
Aún no hay calificaciones
Python Essentials 1. The Official OpenEDG Python Institute Beginners Course 2023-Páginas-1
203 páginas
Enciclopedia Del Lenguaje C++ - Fco. Javier Ceballos - 2da Edición PDF
PDF
Aún no hay calificaciones
Enciclopedia Del Lenguaje C++ - Fco. Javier Ceballos - 2da Edición PDF
346 páginas
1 Paradig Prog
PDF
Aún no hay calificaciones
1 Paradig Prog
34 páginas
Collections de Java
PDF
100% (1)
Collections de Java
9 páginas
Manual Fundamentos de Programación 1.1
PDF
Aún no hay calificaciones
Manual Fundamentos de Programación 1.1
148 páginas
Topicos AvanzadosBD CCBYSA3.0 PDF
PDF
Aún no hay calificaciones
Topicos AvanzadosBD CCBYSA3.0 PDF
115 páginas
Listas Lenguaje C
PDF
Aún no hay calificaciones
Listas Lenguaje C
49 páginas
Crea Tu Propia Red Social
PDF
Aún no hay calificaciones
Crea Tu Propia Red Social
63 páginas
Redes de Computadoras
PDF
75% (4)
Redes de Computadoras
9 páginas
Guia Metodologica Documentacion
PDF
100% (2)
Guia Metodologica Documentacion
14 páginas
Manual - Estructura de Datos
PDF
0% (1)
Manual - Estructura de Datos
143 páginas
Black Zone Portal
PDF
100% (1)
Black Zone Portal
119 páginas
Unidad 2. Recurso 1. REDES DE COMPUTADORAS
PDF
Aún no hay calificaciones
Unidad 2. Recurso 1. REDES DE COMPUTADORAS
1 página
Clase 4 - Genéricos y Colecciones
PDF
Aún no hay calificaciones
Clase 4 - Genéricos y Colecciones
47 páginas
Eff para Desarrollo Personalisado en 345
PDF
Aún no hay calificaciones
Eff para Desarrollo Personalisado en 345
24 páginas
Interfaces y Colecciones
PDF
Aún no hay calificaciones
Interfaces y Colecciones
30 páginas
Arquitectura Computadoras I
PDF
Aún no hay calificaciones
Arquitectura Computadoras I
115 páginas
UML para Programadores JAVA
PDF
Aún no hay calificaciones
UML para Programadores JAVA
256 páginas
Introducción A Java
PDF
Aún no hay calificaciones
Introducción A Java
39 páginas
Interfaces y Generics
PDF
Aún no hay calificaciones
Interfaces y Generics
29 páginas
Catalogo Acervo Upv PDF
PDF
0% (1)
Catalogo Acervo Upv PDF
146 páginas
Fundamentos Del Diseño y Evolución de Los Computadores: Tema 1
PDF
Aún no hay calificaciones
Fundamentos Del Diseño y Evolución de Los Computadores: Tema 1
30 páginas
Teoria (Módulo 4)
PDF
Aún no hay calificaciones
Teoria (Módulo 4)
22 páginas
Chuleta Java
PDF
Aún no hay calificaciones
Chuleta Java
9 páginas
Vision Artificial
PDF
0% (1)
Vision Artificial
11 páginas
Clase1 TRec 2022 V2
PDF
Aún no hay calificaciones
Clase1 TRec 2022 V2
106 páginas
70 646 Traducido
PDF
Aún no hay calificaciones
70 646 Traducido
799 páginas
REPARACION Pc2010 PDF
PDF
Aún no hay calificaciones
REPARACION Pc2010 PDF
150 páginas
Guia5 2022 Parte2
PDF
Aún no hay calificaciones
Guia5 2022 Parte2
23 páginas
Manual Básico Java
PDF
Aún no hay calificaciones
Manual Básico Java
24 páginas
Building A 4 Esp
PDF
Aún no hay calificaciones
Building A 4 Esp
730 páginas
Java - Modulo 2
PDF
Aún no hay calificaciones
Java - Modulo 2
97 páginas
Como Programar en C y C++ - 2da Edición - Harvey M. Deitel & Paul J. Deitel PDF
PDF
Aún no hay calificaciones
Como Programar en C y C++ - 2da Edición - Harvey M. Deitel & Paul J. Deitel PDF
487 páginas
Laravel 62652fecd82350a
PDF
Aún no hay calificaciones
Laravel 62652fecd82350a
14 páginas
JSE - M3 - Clases Genericas y Colecciones
PDF
Aún no hay calificaciones
JSE - M3 - Clases Genericas y Colecciones
20 páginas
Bootcamp-Sesion 1 - Java Introduccion
PDF
Aún no hay calificaciones
Bootcamp-Sesion 1 - Java Introduccion
15 páginas
Slides-Terminal y Linea de Comandos
PDF
Aún no hay calificaciones
Slides-Terminal y Linea de Comandos
126 páginas
Estructura de Datos Parte 1
PDF
Aún no hay calificaciones
Estructura de Datos Parte 1
58 páginas
Fundamentos de Programacion UNED Guía Asignatura 15-16
PDF
Aún no hay calificaciones
Fundamentos de Programacion UNED Guía Asignatura 15-16
7 páginas
3 1 1 Colecciones
PDF
Aún no hay calificaciones
3 1 1 Colecciones
29 páginas
Guia LAB 2-Clases Objetos
PDF
Aún no hay calificaciones
Guia LAB 2-Clases Objetos
11 páginas
Segundo Taller Archivo en Java - 1 - 2018
PDF
Aún no hay calificaciones
Segundo Taller Archivo en Java - 1 - 2018
18 páginas
Colecciones
PDF
Aún no hay calificaciones
Colecciones
12 páginas
Syllabus Del Curso Linux
PDF
Aún no hay calificaciones
Syllabus Del Curso Linux
9 páginas
Introduccion A La Programacion Orientada A Objetos
PDF
Aún no hay calificaciones
Introduccion A La Programacion Orientada A Objetos
12 páginas
GuíaProgramación Examen Final
PDF
Aún no hay calificaciones
GuíaProgramación Examen Final
4 páginas
Diapositivas de Java by Jeff
PDF
Aún no hay calificaciones
Diapositivas de Java by Jeff
30 páginas