You are on page 1of 100

2008II

ACCESOADATOSCONJAVA: NOTASDECLASE

CamiloAndrsFerrerBustos
Hogar 2008II

Tabladecontenido

CaptuloI.................................................................................................................................4 INTRODUCCIONALASBASESDEDATOSRELACIONALES.......................................................4 OBJETOSBASICOS...............................................................................................................4 Tabla................................................................................................................................4 Fila...................................................................................................................................5 Columna..........................................................................................................................5 Clave................................................................................................................................5 MODELORELACIONAL........................................................................................................5 Aspectosadicionalesacercadelasclaves.......................................................................6 Relaciones...........................................................................................................................6 Relacionesentretablas...................................................................................................7 ReglasdeintegridadyRestricciones...................................................................................7 Claveprimaria(PK)..........................................................................................................7 Valoresnicos.................................................................................................................7 Clavesforneas(FK)........................................................................................................7 CAMPOSNULOS..............................................................................................................8 Normalizacin.....................................................................................................................8 FormasNormales............................................................................................................8 Primeraformanormal1FN .............................................................................................9 . Segundaformanormal2FN ..........................................................................................10 . Tercerformanormal3FN..............................................................................................10 EjemplodeNormalizacin. ...........................................................................................12 . CAPITULO2...........................................................................................................................15 LENGUAJEDECONSULTAESTRUCTURADOSQL...................................................................15 DefinicindeunabasededatosatravsdeSQL.............................................................16 TiposdedatosenSQL...................................................................................................16 Crearunatabla..............................................................................................................17 ModificarUnaTabla......................................................................................................19 IntegridadReferencial...................................................................................................21 Aadirelementosaunatabla.......................................................................................21 ConsultasSQL....................................................................................................................23 ConsultasSimples..........................................................................................................23 Operadoreslgicos........................................................................................................26 FuncionesenSQL..........................................................................................................30 AgruparyOrdenarDatos...............................................................................................35 MANIPULACIONDEDATOS...............................................................................................39 Actualizacinderegistros..............................................................................................39 BorrarRegistrosdeunaTabla.......................................................................................40 ConsultasComplejas.........................................................................................................41 UNIONESOJOINS..........................................................................................................41 Consultasanidadas...........................................................................................................50 Actualizacinyborradodefilasatravsdeconsultasanidadas..................................53 CAPITULO3...........................................................................................................................56 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA.................................................56 Introduccin......................................................................................................................56 ConceptosPreliminares....................................................................................................57 Driver.............................................................................................................................57 DNS................................................................................................................................57 ConfiguracindeunDriverODBC.................................................................................58 JDBC...................................................................................................................................61

Introduccin..................................................................................................................61 ConexinalaBasededatos..........................................................................................61 Consultandolabasededatos.......................................................................................63 PreparedStatement.......................................................................................................69 ActualizandoLaBaseDeDatos.........................................................................................72 JTable.............................................................................................................................76 TipoDeDatoBLOB............................................................................................................83 LeyendounBLOBmediantelaaplicacinJAVA............................................................83 EscribiendounBLOBalaBDmediantelaaplicacinJAVA..........................................85 RESULTSET.........................................................................................................................88 PropiedadesdelResultSet.............................................................................................88 FECHASENJAVA ...............................................................................................................95 . Calendar.........................................................................................................................95 OtrasClasesparaelmanejodeFecha...........................................................................98 ConversinDeFechas...................................................................................................99

2008II 2

ACCESOADATOSCONJAVA:NOTA ASDECLASE

Ca aptuloI IN NTRODUCC CION A LAS BAS SES DE D DA SRELA ONALE ATOS ACIO ES

Elobjetivof E finaldelas basesde datosesalmacenarlainformaci n,exactam mente igualquelosar rchivos;per roextiendenelsentido odeestos porqueno soloalmac cenan los d datos, sino que tambin como e estn estruc cturados, o organizando la informacin o segnunciertomodelo. Este modelo de datos, define las estructuras bsicas d informac E o , de cin y relaciones que entre ellas existen. El modelo queda totalm l mente claro al crear la base de datos o a abstr rayendo la caracter as rsticas de cada ent tidad de d datos y la relacion as nes y depe endenciasquehayentr relosdatos sdelamism ma. El E citado es squema se almacena con la pro opia base de datos, de manera que a cualq quier progr rama que la utilice e encontrara en su est tructura fsica, entre otras infor rmaciones, los nombr de cada uno de los elementos de dat y el tip de res a tos po infor rmacinque econtienen n.

OBJ JETOSBA ASICOS.


Lasbasesde L edatos,ind dependiente ementede culessean nlosmecan nismosutiliz zados para almacenar ryobtener lainformac cin,estar ncompues stasfundam mentalmentepor tabla as. Tabla a Una U tabla e una cole es eccin de e elementos de informacin agrupados por filas y d f colum mnas.Latablaalmacenalainform macinsobr reunaentid daddiferen nciada,comopor ejem mplo,unempleado,unlibro,etc.

Las bases de datos acaba con L nstituyndo ose como una colec ccin de tablas t relac cionadasentresi.
4 INTRO ODUCCIONALASBASESD DEDATOSRE ELACIONALES S

CAMIL LOANDRSF FERRERBUST TOS

EAM E

Fila Cadafila,or C registro,rep presentaun nejemplard delobjetoq queabstrae elatabla.De euna tabla aquerepre esentelosd datosdeun nosemplead dos,unafila,espues, unregistro oque repre esentaune empleadodetodoslosalmacenad dosendicha atabla.Una atablaresul ltade unac coleccindefilasoreg gistros. Columna. Lascolumna L asdelatabl laseconoce encomocampos.Losc camposdes scribencada auno de lo atributos o caracte os s ersticas de los objetos que repre esentan los registros de la s tabla a.Cadacolu umnaalmac cenainform macindelm mismotipo.

Clave e.

Es E aconsejable, aunque no impre e escindible, que cada re q egistro pos una ser de sea rie atrib butos que lo identifiquen de ma anera inequ uvoca en el conjunto de datos Por o s. ejem mplo, en u una tabla de emplea ados el campo cedula permit tir sealar sin ambigedad cada registro de la tabla ya que no hay dos empleado con la misma o n s os m cedu ula.Aestecamposelellamaclave eollaveprin ncipal.

MO ODELOR RELACIO ONAL.


En E el modelo relaciona los vncu al, ulos entre las entidad de dato se establecen des os mediante la ab bstraccin d relacione entre las distintas tablas. Estas relaciones se de es obtie enendeunanlisisdelanaturalez zaintrnsecadelosdat tos. Una U relacin consiste en la ligaz que pue establec n n ede cerse entre dos tablas que e s pose een algunos campos con valore idnticos. Existen ciertas reg s es glas que deben d respe etarsealah horadecrearlasbases sdedatosrelacionales. L Lasfilasson nindependi ientes:ning gunafiladeunatablap puededepe enderdeotr rafila delamisma d atabla. L Lasfilasdeb benserni icas:dosfila asdeunam mismatabla adebendiferirenalm menos uncampoocolumnadelamisma. u . L Lascolumna assoninde ependientes s:lascolum mnasnoposeenningn nordenyelvalor deunacolum d mnanopue ededepend derdeotrac columna. L valores de las colu Los umnas son unitarios: dentrode unadeterm minadafila, cada columnacon c ntendrunnicovalor r,nuncauna afilaolistadeellos.
MODEL LORELACION NAL./Fila 5

2008II 2

ACCESOADATOSCONJAVA:NOTA ASDECLASE

Aspe ectosadic cionalesac cercadela asclaves.


Haytrestipo H osdeclaves sdistintas: Claves P Primarias: c comoyase dijoantes, ,unaclave ollaveprim mariaesaq quella que tien valores d ne diferentes e todas la filas de l tabla a f de ident en as la fin tificar inequvo ocamenteunregistrod delamisma a.Unaclave eprimarian nopuedequ uedar vaca. Claves c candidatas: en alguna ocasione la tablas poseen ot as es tras column o nas campos quesonn nicosentod dalatabla. .Aestasco olumnasse lesllamac claves candidat tas. Ajenasofor rneas:una aclaveajen naesunaco olumna,campoogrup pode ClavesA columna asdeunata ablaqueco ontienevalo oresquecasanconunaclaveprin ncipal en otra tabla. Estas claves aje enas son la que perm as miten estab blecer relac ciones entreotrastablas.

Relaciones s
Unarelacin U nestcomp puestapor atributose endistintas tablasconidnticova alory signif ficadoqueseusanpar raestablece erunparen ntescoentre edichastab blas.Parailu ustrar loan nteriorvaseelsiguienteejemplo.

La L tabla VENTAS posee la colum NCLI en la cual hay unos n mna n meros, si estos nmerossecom mparanconlosnmero osdeNCLIe enlatablaCLIENTESse epuedeconcluir que son los mismos y ade ems tienen el mismo significado, ya que N o NCLI en clientes indic caelcdigodelclienteyNCLIenv ventasindic caelcdigodelclientealquesele ehizo la ve enta. Se ve clarament que hay una relaci directa entre las t te n tablas VENT y TAS CLIEN NTES.
6 INTRO ODUCCIONALASBASESD DEDATOSRE ELACIONALES S

CAMILOANDRSFERRERBUSTOS

EAM

Relacionesentretablas.
Sepuedendefinirtrestiposderelacionesentretablasdeunabasededatos: Unoauno(1:1):unoyunsoloregistrodelatabladependientesehallaligadoa unregistrodelatablaprimaria.Sonrelativamenteinfrecuentes. Uno a Muchos (1: n): permiten que varios registros en tablas dependientes estn ligados a un registro en una tabla primaria. Son las relaciones ms comunes. Muchosauno(n:1):variosregistrosdelatablaprimariaestaligadosaunsolo registrodelatabladependiente. Muchos a muchos (n:n): varios registros de la tabla primaria esta ligados a variosregistrodelatabladependiente. Ladefinicincorrectadelasrelacionesentrelasentidadesqueseexpresanenlas tablaseslabasedeundiseoeficientedeunabasededatosrelacional.

ReglasdeintegridadyRestricciones
Lasreglasdeintegridadsonusadasparagarantizarlaprecisinylaconsistenciade losdatosenunmodelorelacional.

Claveprimaria(PK)
Laclaveprimariaestambinllamadallaveprincipalycomosedijoanteriormente esaquellacolumnaquegarantizaqueunafiladelatablaseanica.Comoloserael cdigodeunestudianteenunatabladeestudiantes,laceduladelclienteenunatabla declientes,etc.CabeaclararqueunaClaveprincipalpuedeestarconstituidadeunao mscolumnassiestogarantizalaunicidaddelosregistrosdelatabla,aunqueeluso de claves de este tipo dificulta el realizar consultas y establecer relaciones entre las tablas.

Valoresnicos.
Un valor nico en una tabla es muy similar a una clave primaria, la diferencia es quelaclaveprimariaseusapararelacionarlastablasyrealizarlasconsultas,elvalor nicoesunarestriccinenuncampoquenosepuederepetirenotrafiladelatabla. UnejemplodeestoseraqueenunatablaESTUDIANTEsetuvieracomoclaveprimaria elcdigodelalumnoycomovalornicolacedula,yaqueambosnoserepitenenotra filaperosuusosipuedeserdiferenteenelmodelorelacional.

Clavesforneas(FK)
Una clave fornea es un campo en una tabla que permite relacionarla con otra tabla. La clave fornea es usada para referenciar una columna definida como clave principalenotratabla.EnlafiguraanteriorenlatablaVENTA,sevequeestaposee unacolumnaNCLIquehacereferenciaalnmerodelclienteenlatablaCLIENTE.NCLIE enlatablaCLIENTEeslaclaveprincipalyenlatablaVENTAeslaclaveollavefornea.
/Relacionesentretablas. 7

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

CAMPOSNULOS
Soncolumnasdeunafilaqueporsuimportanciaalmomentodecrearelregistroo lafilanopuedendejarsevacios.

Normalizacin
La normalizacin es el proceso mediante el cual toda la informacin referente a una basededatossedivideunidadeslgicasllamadastablas.Esteeselprocesoqueusan losdiseadoresdelasbasesdedatosparaquelainformacinqueestasalmacenansea de fcil organizacin y mantenimiento, y as, asegurar la integridad y precisin de la informacinenlabasededatos El proceso de normalizacin reduce la redundancia de la informacin y se usa en el diseoyrediseodelabasededatos.Lanormalizacinesunaseriedepasos,aestos pasosselesdenominaformasnormales

FormasNormales.
Antesderealizarelprocesodenormalizacindelabasededatossedebeteneruna relacindetalladadetodalainformacinqueenellasevaaalmacenar,aestosele denominaeldiccionariodedatos.Supngasequesequieredisearunabasededatos referenteaunafactura:

Yeldiccionariodedatosdeestafacturaeselsiguiente:

8 INTRODUCCIONALASBASESDEDATOSRELACIONALES

CAMILOANDRSFERRERBUSTOS

EAM

Primeraformanormal1FN
Elobjetivodelaprimeroformanormalessepararenunanuevatablaloselementos repetitivosdeldiccionariodedatos tabla1 Cod_Fac Fec_Fac Dir_Cli Ced_cli Ciu_Cli Tel_Cli tabla2 Cat_Pro Cod_Pro Des_Pro Val_pro Can_Pro

Delafacturasepuedeverqueloscamposdelatabla2serepitenvariasveces Segnlasrestriccionesdelmodelorelacionalcadatabladebetenerunallaveprincipal queseanicaenlatotalidaddedichatabla,siseobservalatabla2,elcod_prodpodra satisfacerestacondicin,perosienunafacturadiferenteseregistralacompradeotro monitor (68989) no habra unicidad en este valor por lo que una solucin a este impase seria indicar a que factura pertenece el producto relacionado, asi, la tabla 2 tendriacomollaveprincipala(cod_proycod_fac)yquedaradelasiguienteforma.
Tabla1 Cod_Fac Fec_Fac Dir_Cli Ced_cli Ciu_Cli Tel_Cli Tabla2 Cod_Fac Cat_Pro Cod_Pro Des_Pro Val_pro Can_Pro

Normalizacin/

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Segundaformanormal2FN
Elobjetivodelasegundaformanormalessepararenunanuevatablaloscamposde lastablasdela1FNquenodependanenteramentedesullaveprincipal.Cuandohay tablasconllavescombinadassoloseobservandichastablas.Sianalizalatabla2: Tabla2 Cod_Fac Cat_Pro Cod_Pro Des_Pro Val_pro Can_Pro Los campos de val_pro, cat_pro, des_pro no depende de la llave principal (cod_fac,cod_pro),solodependendelcod_proyaquesonlosdatosdelproductoensi yesonodependedequeestnonoenlafactura.Estosdatosseseparanenunatabla aparte:tabla3. tabla1 tabla2 tabla3 Cod_Fac Cod_Fac Cod_Pro Fec_Fac Cod_Pro Des_Pro Dir_Cli Can_Pro Val_pro Ced_cli Cat_Pro Ciu_Cli Tel_Cli

Tercerformanormal3FN
Elobjetivodela3FNesremoverdelastablasresultantesdela2FNlosatributosque nodependandelasllavesprincipalesdedichastablas. Siseobservalatabla1losdatosreferentesalcliente(dir_cli,ciu_cli,tel_cli) nodependendecod_fac,estospodraniraunanuevatabla:tabla4. tabla1 tabla2 tabla3 tabla4 Cod_Fac Cod_Fac Cod_Pro Dir_Cli Fec_Fac Can_Pro Des_Pro Ced_cli Cod_Pro Val_pro Ciu_Cli Tel_Cli
10 INTRODUCCIONALASBASESDEDATOSRELACIONALES

CAMIL LOANDRSF FERRERBUST TOS

EAM E

Perosilatabla1 1debealmacenarlain nformacin delafactu ura,debere elacionarde equ clienteesdichafactura,esporesoquelatabla1quedaas: _Fac Tabla_Item_ T _fac Tabla_prod T Tabla a_Cli Tabla_ Cod_F Fac Cod_Fac C Cod_Pro C Dir_C Cli Fec_Fa ac Can_Pro C Des_Pro D Ced_ _cli Ced_cli Cod_Pro C Val_pro V Ciu_C Cli Tel_C Cli Dond deentabla_ _fac,ced_cliseriaunallaveforne ea. Sino osenormalizaralatab bla1setend dranqueingresarlos sdatosdel clientecadavez ques secreeunanuevafact turaloquea aaderedundanciaala abasededatos. En e esta altura del proceso se pued observa que en cada grup se encuentra de ar po infor rmacin de manera organizada. Un cliente con sus datos, un pr roducto con sus datos,unaorde enconsus datosmnim mos,porej jemplosise eoobserva Tabla_Item m_fac enla a3FNcone elcd_prop podramosaveriguarq queproduct tosecompr ro,cuantov valey dems, con cod d_fac, podr ramos aver riguar cuan y la ced ndo dula de quien lo compro y esta asuvezno osdiraelte elfono,la direcciny demsdat tosdelclien nte.Seven unas clara asyeficientesrelacione esentrelastablas. Esta figura nos muest las rela E tra aciones entre las tab blas luego del proces de so norm malizacin.

Normaliz zacin/Terce erformanormal3FN

11

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

EjemplodeNormalizacin.
AContinuacinunnuevoejerciciodenormalizacin. Unaempresaesconformadadelossiguientesdatos:

Diccionariodedatos.
emp_id Nom_emp Tel_emp Dir_emp correo_emp ciudad_emp apellido_emp nom_puesto frec_pago bonificacion_puesto fecha_ingreso salario cedula_cliente nombre_cliente telefono_cliente direccion_cliente ciudad_cliente prod_id descripcion_prod costo_prod cdigodelempleado nombredelempleado telfonodelempleado direccindeempleado correodelempleado ciudaddelempleado apellidodelempleado puestodelempleado frecuenciadepago(quincenal,semanal,mensual) bonificacinqueganaelempleadodeunpuesto fechaenelqueelempleadoingresoalaempresa salariopagadoauntipodepuesto ceduladelcliente nombredelcliente telfonodelcliente direccindelcliente ciudaddonderesideelcliente cdigodelproducto descripcindelproducto costodelproducto

12 INTRODUCCIONALASBASESDEDATOSRELACIONALES

CAMILOANDRSFERRERBUSTOS

EAM

Primeraformanorma Como se dijo anteriormente, la primera forma normal es separar los elementos repetitivos del diccionario de datos, en este diccionario de datos no hay elementos repetitivosentoncesseprocedeaagruparlosdatossegnsurelacin. Sepuedenobservar3grupos. Empleado Producto emp_id prod_id Nom_emp descripcion_prod Tel_emp costo_prod Dir_emp correo_emp ciudad_emp apellido_emp Cliente fecha_ingreso cedula_cliente frec_pago nombre_cliente puesto telefono_cliente bonificacion_puesto direccion_cliente salario ciudad_cliente Segundaformanormal La segunda forma normal lo que es sacar aparte de las tablas de la 1FN aquellos campos que no dependan enteramente de la llave principal de estas, por ejemplo, viendo la tabla empleado se observa que los campos puesto, bonificacin_puesto, salrio, frec_pago,fecha_ingreso no dependen de emp_id sino que son datos que describenlasituacinlaboraldelempleado,estosepuedeagruparenunatabla. empleado_info_laboral emp_id fecha_ingreso frec_pago nom_puesto bonificacion_puesto salario Ycomoestaesinformacindeunempleadohayquerelacionarlamedianteemp_id.

Normalizacin/EjemplodeNormalizacin.

13

2008II 2

ACCESOADATOSCONJAVA:NOTA ASDECLASE

Terce eraFormaN Normal Elob bjetivodela aterceraformanormalesremove erdelastab blasdela2F FNlosdatosque noso ondependie entesdelaclaveprincipal. Si s observa la tabla puesto_ se a a _info los campos nom_pue esto, sa alario, bonificacin_pu uestosonlo osdatosref ferentesae elpuestode etrabajoy nodepende ende quien nlotengay yaquevariosemplead dospueden ntenerelm mismopuest to,loqueindica quee estainform macinessusceptibleaconvertirse eenotratabla. puesto p emple eado_info_ _laboral puesto_id p emp_ _id nom_puesto n fecha_ingreso bonificacion b n_puesto frec_p pago salario s puest to_id La ta abla puesto almacena la informac o cin de los puestos de la empres y se le aade e sa a una llave principal par cumplir los requ ra r uerimientos del mo s odelo, la tabla empleado_info_ _laboral Sere elacionacon npuestome ediantepue esto_id. Desp pus del pro oceso de normalizaci el diagra n ama de entidad relaci del prob n blema resue eltoquedadelasiguie entemanera a:

Se S podran unir dos ejercicios ant teriores par formar la base de d ra datos final de la empresa.

14 INTRO ODUCCIONALASBASESD DEDATOSRE ELACIONALES S

CAMILOANDRSFERRERBUSTOS

EAM

CAPITULO2 LENGUAJE DE CONSULTA ESTRUCTURADOSQL


SQL(StructuredqueryLenguage)esunlenguajequenospermiteejecutarmultitudde operacionessobrelasbasesdedatosrelacionales;trabajandodirectamentesobrelas tablas,filasycolumnas.EllenguajeSQLposeeunaestructuramuysimplequepermite accederasubconjuntoscomplejosdedatosmediantesentenciaspequeas. El lenguaje de consulta estructurado (SQL) es un conjunto especializado de rdenes quepermitenalusuariorealizarlossiguientestiposdetareas: Recuperardatosdeunaomstablasdeunaomsbasesdedatos. Manipular los datos de las tablas insertando, eliminando, o actualizando registros. Obtenerinformacinresumidasobredatosdelastablas,comototales;cuentas deregistros;yvaloresmximo,mnimoymedio. Crear,modificartablasenunabasededatos. Crearoeliminarndicesenunatabla. Laconsultadefineloscamposaprocesar,lastablasqueloscontienen,elintervalode registrosaincluir,y,paralarecuperacinderegistros,elordenenquesetendrnque presentar. Lasinstruccionesdellenguajesedividenen: DDL(DataDefinitionLanguage):Eslapartedellenguajequeseocupadelagestinde labasededatos:creacinyborradodelosusuarios,tablas,vistas,etc...;gestindel controldeacceso;manipulacindelaestructuradelastablas;optimizacindelacceso alosdatos;tiposdedatos... DML(DataManipulationLanguage):EslapartedellenguajeSQLqueseocupadelas operacionesdeinsercin,borrado,actualizacinyconsultadedatos. DQL (Data Query Language): es la parte del lenguaje que se ocupa de extraer la informacindelabasededatos.
Normalizacin/EjemplodeNormalizacin. 15

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

DefinicindeunabasededatosatravsdeSQL
YacreadalabasededatosenelSistemaGestordeBasedeDatosRelacional(SGDBR) sedebenusarlassentenciasSQLdetipoDDLparacrearlastablasylasrelacionesque puedanexistirentreellas. Antes de poder definir una tabla y todos sus campos, es necesario conocer los distintostiposdedatosqueexistenenelestndarSQL.

TiposdedatosenSQL
EnSQLcomoencasicualquierlenguajeexistentrestiposdedatosbsicosqueson: Cadenasoalfanumricos Nmeros FechasyHoras

Alfanumricos
Entrelostiposdedatosalfanumricosseencuentranlosdelongitudfijayvariable. LascadenasdelongitudfijasedefinenmedianteCHAR(n)dondeneseltamaoqueel datodefinidovaatomar.Hayquetenerencuentaquesiundatoenespecialocupa menoscaracteresdeloespecificadoconn,elespaciorestantesellenaconespacioslo cualpuedeserpeligrosoenelmomentoderealizarcomparacionesobsquedassobre estosdatos. LascadenasdelongitudvariablesedefinenmedianteVARCHAR(n),dondenindica el tamao mximo de la cadena a almacenar. La diferencia con CHAR es que no se rellena con espacios el espacio sobrante lo que da ms exactitud a la informacin almacenada.Sisedeseaalmacenarunacadenamsgrandedeltamaodefinido,esta setruncaaltamaoespecificadodeldato.

Numricos
EntrelostiposdedatosnumricosqueseencuentranenelEstndarestn: NUMERIC:numeroengeneral INTEGER:Entero BIGINT:Enterogrande DECIMAL:numeroconpuntodecimal.

Fechasyhoras
LostiposdedatosparaalmacenarfechasyhorasenSQLson: DATETIME:fechayhora.Almacenaelao,mes,da,hora,minutoysegundo. DATE:soloalmacenaelao,mesyelda.
16 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

Crearunatabla
Para crear una tabla con SQL se utiliza la instruccin CREATE TABLE cuya sintaxis se muestraacontinuacin: CREATETABLEtable_name (field1 data_type [null|notnull], field2 data_type [null|notnull], field3 data_type [null|notnull], field4 data_type [null|notnull], field5 data_type [null|notnull]); Dondefieldxeselnombredelacolumna,data_typeesalgunodelostiposdedatos explicados con anterioridad null o not null define si se puede o no dejar vacio el campoalmomentodelacreacindelregistrodelatabla. Aunquelasintaxisparacrearlatablaesmuysencilla,sedebededicaralgntiempoen planear cual ser el nombre de la tabla, cul es la o las columnas que conforman la llaveprincipalylasdemsrestriccionesquelosotroscamposdelapuedantener.Esta informacinporlogeneraldebesalirdelprocesodenormalizacindelaBD. ParaindicarqueuncampoeslallaveprincipaldelatablaseutilizalaclausulaPRIMARY KEY. Porejemplo,sisequisieracrearlatablaempleadodelabasededatosanteriormente modelada,lasentenciaSQLqueharaestoseria:
createtableempleado( nombre_emp varchar(30)notnull, apellido_emp varchar(30)notnull, telefono_emp varchar(10)null, direccion_emp varchar(30)null, correo_emp varchar(30)null, cedula_emp varchar(15)notnullprimarykey );

Esta sera una tabla que tendra como llave principal a cedula_emp, telfono_emp, direccin_emp, correo_emp se podran dejar vacios cuando se aada el nuevo empleado, los campos nombre_emp y apellido_emp se tienen que llenar obligatoriamente.Lallaveprincipaldebetenerlarestriccindenotnullcomoserade esperarseyaquealsereldatoprincipal,nosepuededejarvacio.

DefinicindeunabasededatosatravsdeSQL/Crearunatabla

17

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Otramaneradeindicarlallaveprincipaldeltablaesusandoprimarykeyconunalista delascolumnasqueformanlallaveprincipalentreparntesis. Primarykey(campo1,campo2,campon)


createtableempleado( cedula_emp varchar(15)notnull, nombre_emp varchar(30)notnull, apellido_emp varchar(30)notnull, telefono_emp varchar(10)null, direccion_emp varchar(30)null, correo_emp varchar(30)null, primarykey(cedula_emp) );

Enestecasosolounacolumnaformalallaveprincipal. SisedeseaqueuncampoenespecialseanicoseusalaclausulaUNIQUE.
createtableempleado( cedula_emp varchar(15)notnull, nombre_emp varchar(30)notnull, apellido_emp varchar(30)notnull, telefono_emp varchar(10)nullUNIQUE, direccion_emp varchar(30)null, correo_emp varchar(30)null, primarykey(cedula_emp) );

Aqusehizoeltelfonodelempleadonico,esdecir,nopuedehaberdosempleados condostelfonosiguales.

Clavesforneasyrelaciones
Para aadir una clave fornea a una tabla y as crear una relacin se usa la clausula foreignkey.Comoseexplicoconanterioridad,unallaveforneahacereferenciaauna columnaqueconformalallaveprimariadeotratabla(madre),esporesoquelallave forneaenlatablahijadebeserdelmismotamaoytipodedatodelacolumnaque referencia.

18 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

Porejemplo,unatablatabla_facqueserelacionaconempleadomediantelaclave forneacedula_emp,aqulatablahijaosecundariaestabla_facylamadreoprincipal esempleado. Tabla_Fac Cod_Fac(PK) Fec_Fac Ced_cli(FK) cedula_emp(FK) Lasintaxisdeforeignkeyeslasiguiente: Foreign key (campo_tabla_hija) (campo_tabla_principal)

references

nombre_tabla_principal

createtabletab_fac ( cod_facserialprimarykey, fec_facdatenotnull, cedula_empvarchar(15), constraintfk_cedula_empforeignkey(cedula_emp)references empleado(cedula_emp) );

Donde fk_cedula_emp es el nombre del constraint que define la llave fornea, cedula_empenlatablatab_fachacereferenciaacedula_empenlatablaempleado. Fijesequecedula_empenempleado ytab_facsedefinierondelamismamanera.Si estonofueraasi,larelacinnosepodrahacer. Una llave fornea as como muchas ms restricciones se definen a travs de un constraintorestriccin.Larestriccinposeeunnombredefinidoporelusuario.

ModificarUnaTabla
Hay ocasiones en que ya definida y creada la tabla se necesita modificar su estructura aadiendo, modificando o eliminado columnas o restricciones a las columnas,enesoscasosseusalasentenciaALTERcuyasintaxiseslasiguiente: ALTERTABLETABLE_NAME [MODIFY|ADD|DROP] [COLUMNCOLUMN_NAME][DATATYPE|NULLNOTNULL][RESTRICT|CASCADE] [ADD|DROP]CONSTRAINTCONSTRAINT_NAME]
DefinicindeunabasededatosatravsdeSQL/ModificarUnaTabla 19

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

DondeTABLE_NAMEeselnombredelatabla [MODIFY|ADD|DROP]indicaloquesevaahacer.Modificar,aadiroborraralgo. (Soloseescogeunodelostresynoseponenloscorchetes). COLUMN_NAMEeselnombredelacolumnaquesevamodificar,aadiroborrar. Elrestodelasintaxisdefineloquesevahacerconlacolumna. Si se quisiera aadir a la tabla tab_fac una columna ced_cli para relacionarla con cedula_clientedelatabladeclienteseriadelasiguienteforma: altertabletab_facaddcolumnced_clivarchar(20)not null; Luego, para crear la relacin se aade a la tabla tab_fac una llave fornea con la ced_clicreadaanteriormente: Seutilizaaddysedefinelallaveforneacomoseexplicoconanterioridad.
altertabletab_facaddconstraintfk_ced_cliforeignkey(ced_cli)references cliente(cedula cliente);

Paraborrarlarelacinseeliminaelconstraintatravsdelcualsecrelarelacin:
altertabletab_facdropconstraintfk_ced_cli;

Paraeliminarunacolumnadeunatabla:
altertableclientedropcolumnnombre_cliente;

Nosepuedeneliminarcolumnasquehayansidodefinidascomollaveforneayaque primalarelacinquetieneestacolumnaconlaotratabla.

20 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

IntegridadReferencial.

Laintegridadreferencialindicaquelasfilasdeunatablarelacionadaconotradeben existir,sino,latablasecundariaestarahaciendoreferenciaaunregistroinexistente. Enlafiguraanteriorseobservaquelafacturaconcdigo3tienetresregistrosenla tabladetem_fac.Qupasaraconesosregistrossiseborraradelatablafacturala factura con cdigo 3? Deberan borrarse tambin ya que estn apuntado a un registro ya inexistente. Si un cdigo en la tabla factura cambiara a otro valor, los registrosdelatablatem_facqueestnrelacionadosconelregistromodificadodeben cambiar para que la relacin persista, si esto no fuera as los registros de la tabla secundariaapuntaranaunregistroinexistente. En SQL esto se hace con ON DELETE CASCADE para borrar en cascada y ON UPDATE CASCADEparaactualizarencascada.
altertabletab_facaddconstraintfk_ced_cliforeignkey(ced_cli) referencescliente(cedula_cliente)ONDELETECASCADEUPDATE

Aadirelementosaunatabla
Yacreadalatabla,esnecesariollenarlaconinformacin,paralocualseusalaclausula INSERT.Lasintaxiseslasiguiente: INSERTINTOTABLE_NAME[(COLUMN1,COLUMN2,...] VALUES(VALUE1,VALUE2,...)

DefinicindeunabasededatosatravsdeSQL/IntegridadReferencial.

21

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Donde TABLE_NAME es el nombre de la tabla donde se van a aadir los datos, [ (COLUMN1,COLUMN2,...]sonlascolumnasalascualesselesvaaasignarunvalory VALUES(VALUE1,VALUE2,...)definelalistadelosvaloresaalmacenarsegnelorden definidoenlalistaanterior. ParaaadirunNuevoempleadoalatablaempleadosseria: insertintoempleado (nombre_emp,apellido_emp,cedula_emp,telefono_emp,direccion_emp) values('camiloandres','ferrerbustos','9737630','7488118','manantiales') Hayqueconsiderarlosiguiente: 1. Sienladefinicindelatablasedefinieldatocomonotnull,enlacreacinde lanuevafiladebenestarcomomnimolascolumnasdefinidascomonotnull,Si seomiten,secancelalacreacindelatabla. 2. Sisedefineunacolumnacomollaveprincipal,nosepuedencreardosfilascon el mismo valor en ese campo ya que genera una excepcin y se cancela la creacin de la tabla. Esta condicin tambin la cumplen los valores definidos comounique.

22 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMIL LOANDRSF FERRERBUST TOS

EAM E

Con nsultasS SQL


Unaconsult U taesunape eticinala basededa atosatrav sdeunase entenciaSELECT. Una consulta es usada para extraer informacin de la bas de datos en un for s n se s rmato bleacordea alaspeticionesdelusu uario.Sepodranhacer rconsultassobrelabasede legib datosparadete erminarde unatablad deemplead dosquienes sgananm sde$1000 0.000 depesosobusc carlasvent tasrealizadasporunv vendedorenunafecha adeterminaday etc.

Con nsultasSi imples


La L sentencia SELECT es el comand que rep a s do presenta el DQL en SQ y es la y es la QL sente encia bsica para cons a struir los querys sobre la base de datos. SE e ELECT no trabaja sola,encompa adeotrasclausulas paracomp pletarlafun ncionalidad delasente encia. Hayc cuatroclaus sulasquese eusanjunto oconSELEC CTparadefi inirlaconsu ulta:

SELECT T FROM WHER RE ORDER RBY

N1,COLU UMN2] SELECT[*|ALL|DISTINCTCOLUMN FRO OMTABL LE1[,TABLE2];


COLU UMN1,COL LUMN2esla alistadeco olumnasquesequiere enmostrare enlaconsulta,si sequ uieremostr rartodaslas scolumnasdelatabla,seusaelasterisco(*); LE1[,TABLE2]eslalis stadelastablasquese eusaranenlaconsulta. TABL FROM Mindicaqu uelaconsult taserealiza adelastablasquesigu uendespus sdelaclaus sula Pore ejemplo:

sele ect*from mempleado;

Porm mediode(* *)muestrat todaslasco olumnasdelatablaempleado.


ConsultasSQ C QL/ConsultasSimples 23

2008II 2

ACCESOADATOSCONJAVA:NOTA ASDECLASE

sele ectnomb bre_emp p,cedula_ _empfromemple eado;

Solomuestralas scolumnasnombre_empycedula a_empdela atablaemp pleado.

DIST TINCT
la cla ausula disti inct muestr los valor de una columna d una tabl omitiend los ra res de la do elem mentosrepe etitivos. ctDISTINCT Tcat_prodf fromproducto; selec

Se m muestran las categoras existentes en la tab producto omitinedo los eleme s bla o entos repetidos.

Clau usulaWHE ERE


Cuan ndo la consulta est determinada por alg guna condicin se ut tiliza la clausula WHE ERE. select[all| s *|distinct tcolumn1,c column2] fromtable1[,table2] where[condition1|ex w xpression1] [and|ORco ondition2|expression2 2] pusdelaclausulawhe erevaunaexpresinl gicaqued determinae elresultadodela Desp consulta. Esteeselcontenidodeuna atabladep productos: Selec ct*frompr roductos

24 LENGU UAJEDECON NSULTAESTR RUCTURADOSQL

CAMIL LOANDRSF FERRERBUST TOS

EAM E

Dee estatablaso olosedesea amostrarlo osproducto oscuyacate egoraseap procesador: : selec ct*frompr roductowherecat_pro od=procesa ador

mostrarde latablaem mpleadola informacin ndelemple eadoconce edula Solo sequierem 1094 410923: Selec ct*fromem mpleadowh herecedula a_emp=109 9410923 Sequ uieremostr rarlosproductocuyop precioseain nferiora$100000 Selec ctnombre_ _prod,codig go_prod,pr recio_prod from mproductow whereprec cio_prod<100000

Tamb binsepue edenusarex xpresionescompuestasqueinvolu ucrenmasd deunparm metro deb squedaoq queusenco onectoresl gicostales scomoY(an nd)uO(Or) Sequ uieremostr rarlosproductoscuyoprecioeste eentre$500 000y$3000 000 Selec ctnombre_ _prod,codig go_prod,pr recio_prod from mproductw whereprecio o_prod>500 000andpre ecio_prod<3 300000

ConsultasSQ C QL/ConsultasSimples

25

2008II 2

ACCESOADATOSCONJAVA:NOTA ASDECLASE

Ope eradores slgicos


Para potenciar las capacid dades de b bsqueda, SQL define otras sente S encias que junto WHEREque epermitenh hacerconsu ultasmsfle exiblesyeficientes. conW

like
cuan ndosedeseabuscaralg gunafilade elatablasintenerque eespecifica arlainformacin comp pleta de alg campo se usa la clausula lik Por ejemplo, se podra busca los gn o ke. ar productoscuyonombreem mpiecepora,oalgopo orelestilo. cond dicionestale escomoqu ueempiecenporunal letraoque contengan nunapalabraen especialoetc. Paraesasc consultasn nosepuede eusareligu ual.Enesos scasosseu usael predicadoLIKE. ctColumnasFromtabl laswhereC Columna[no ot]LIKEmodelo. Selec Modeloesunac constantea alfanumric caquepued deserdelasiguientem manera: P%:p palabrasqu ueempiezan nporP.el% %esuncar ctercomod dn. [AD] ]%:todasla aspalabras queempie ezandesde laAalaD.sinel%so olomuestra aslas filasque tenganenelcam mpodesead dolaAhast taD,nolaspalabrasqu ueempiecen. %[A D]:todasla aspalabrasqueterminendelaAa alaD. %i%:filasqueco ontenganen nelcampodeseadoun naiencualq quierposicion. ejemplo: Pore Buscarlosprodu uctosquee empiecenpo ori Selec ct*frompr roductowh herenombre e_prodlike e(I%)

Buscarlosempleadosquet tienenensunombreA Andrsenalgunaparte e. Selec ct*fromem mpleadosw wherenomb bre_emplik ke(%andre es%) Se o observa que los nom e mbres que aparecen en la cons sulta tienen Andrs sea al n princ cipioyalfin nal.

26 LENGU UAJEDECON NSULTAESTR RUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

Between

Esta clausula es un operador lgico que sirve para comprobar que un campo perteneceaunintervaloentredosvalores.Essimilarausarvalor1<campo<valor2: Por ejemplo, se desea conocer los productos cuyo precio este entre $50000 y $300000: select*fromproductowhereprecio_prodbetween50000and300000;

ISNULL
EsteoperadoresusadoparacompararuncampodeunafiladetablaconNULL. Recurdese que NULL significa vacio. Este operador sirve para encontrar columnas vacias.

Teclado108GeniusensucampodedescripcintieneelvalordeNULL. La siguiente sentencia SQL encuentra las filas de producto que tengandes_prod con NULL. select*fromproductowheredes_prodisNULL; Podra pensarse que la sentencia select * from producto where des_prod = NULL podra entregar el mismo resultado pero lo que se hace all es comparar si en des_prod hay una cadena que diga NULL o NULL. Para esta tabla en particular el resultadonoarrojaraningunafila.

IN
El operador IN se utiliza para comparar el valor de una columna con una lista de valores.Retornaverdaderosilacolumnaposeealgnvalordeldeterminadoenlalista.

ConsultasSQL/Operadoreslgicos

27

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

La siguiente consulta busca encontrar mediante el operador IN las filas de la tabla productocuyopreciosea$270000o$410000o$178000. Selectnombre_prod,cdigo_prod,valor_prodfromproducto whereprecio_prodin(270000,410000,178000)

NOTIN
NOTINeslanegacindeloperadorIN. Selectnombre_prod,cdigo_prod,valor_prodfromproducto whereprecio_prodNOTIN(270000,410000,178000)

Estasentenciadacomoresultadotodaslasfilasquenotengancomoprecioalgunode lalista.

ISNOTNULL
EslanegacindeISNULL. Elsiguienteejemplonosmuestratodaslasfilasdeproductodondedes_prodnoeste vacio.


28 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

select*fromproductowheredes_prodisNULL;

Vasequeaparecentodasmenoslafilaqueteniades_prodcomonull.

NOTBETWEEN
EslanegacindeBETWEEN. Valor1>campo<valor2 se desea buscar las filas de la tabla producto que estn fuera del intervalo entre $50000$300000. select*fromproductowhereprecio_prodnotbetween50000and300000;

Siseobservalatabla,precio_prodesmenorque$50000ymayorque$300000.

NOTLIKE
EslanegacindeLIKE. SedeseaencontrarlaspersonasqueensunombrenotenganAndrsenalgunaparte delnombre. Select*fromempleadowherenombre_empnotlike('%andres%');

ConsultasSQL/Operadoreslgicos

29

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

FuncionesenSQL
Una funcin en SQL es una palabra reservada que permite realizar clculos con los valores de alguna o algunas columnas y producir un resultado. Las funciones agregadassonaquellasusadaspararesumirdatoscomoporejemplocontarelnumero deproductos,calculareltotaldeunaventamultiplicandolacantidadporelvalordel producto, encontrar el producto ms caro o el ms barato y etc. Las funciones ms comunesson: COUNT SUM MAX MIN AVG

FuncinCOUNT
Esta funcin sirve para contar las filas resultantes de una consulta o valores de una columna que no contiene valores Nulos. La funcin COUNT devuelve un valor numrico. Esta funcin se puede utilizar con DISTINCT para obviar los resultados repetidos. Lasintaxises: COUNT[(*)|(DISTINCT|ALL)](COLUMNNAME) DondeCOLUMNNAMEeselnombredelacolumnaquesequierecontar. (*)seusaparainvolucrartodaslascolumnasdelafilaenlacuenta DISTINCTparaobviarlosvaloresrepetidosdelacolumnaqueseestacontando Sealasiguienteconsulta: Select*fromproducto

SepuedencontarcuantosproductoshayadisposicinconlafuncinCOUNT
30 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

selectcount(*)fromproducto;

Obsrvese que la sentencia retorna un solo valor que es la cuenta de las filas de la consulta.Lasfuncionesengeneralseusanenconjuntoconunselect. count(*)indicaquelacuentainvolucratodalafilacompleta. CuandoCOUNTsoloinvolucraunacolumnaenlaconsulta,solosecuentanlosvalores nonulos. Porejemplo,sequierecontarcuantasdescripcioneshay: Selectdes_prodfromproducto;

Aparentementeseven12valores,perosisecuentanconCOUNTperoSoloresultan 11yaqueenlacolumnahayunoconNULL. Selectcount(des_prod)fromproducto;

Otroejemploseriacontarcuantascategorashayenlatablaproducto. Selectcat_prodfromproducto;

ConsultasSQL/FuncionesenSQL 31

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Sisecuentaestaconsultaresultaran12categorasperoenrealidadnoson12sino8 categorasdistintas,paraobviarlasrepetidasseusaDISTINCT. Selectcount(distinctcat_prod)fromproducto;

FuncinSUM
LafuncinSUMsirveparasumarlosvaloresdeunacolumnaqueobviamenteseade tiponumrico.Lasintaxiseslasiguiente: SUM([DISTINCT]COLUMNNAME) LafuncinSUMsoloesvlidaparaunasolacolumna. Ejemplo,sequieresabercuntosumalacolumnaprecio_proddelatablaproducto. estaeslacolumnaprecio_prod:

Paracalcularlasumaseria: Selectsum(valor_prod)fromproducto;

Si se quiere conocer la cantidad de productos vendidos por la empresa en todas las facturassetendraquesumarlacolumnacantidaddelatablatem_factura. Esteeselcontenidodelatablatem_Factura

32 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

Parasumarlacolumnacantidadseria: Selectsum(cantidad)fromtem_factura;

Se desea conocer el promedio de los precios del almacn, sera necesario entonces sumar la columna precio_prod de la tabla producto y dividirlo por la cantidad de productos.Estosepuedehacertalycomoestescritousandoeloperadordedivisin (/). Selectsum(precio_prod)/count(precio_prod)fromproducto; Elpromediodelosproductosdelaempresaes$195250.0000. Seobservaqueesposibleutilizaroperacionesmatemticasentrelascolumnasoentre elresultadodefunciones.

FuncinAVG
LafuncinAVGcalculaelpromediodeunacolumnadetiponumrico.Lasintaxises: AVG([DISTINCT]COLUMNNAME) Sedeseaconocerelpromediodelosproductosdelalmacn: selectavg(precio_prod)fromproducto;

EstaconsultaseriaigualalaanteriorusandoaSUMyCOUNT.

ConsultasSQL/FuncionesenSQL

33

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

FuncionesMAXyMIN
Las funciones MAX y MIN sirven para encontrar el valor mximo y mnimo respectivamentedeunacolumnadetiponumrico.Lasintaxises: MIN([DISTINCT]COLUMNNAME)paraelmnimo MAX([DISTINCT]COLUMNNAME)paraelmximo SisedeseaencontrarelpreciomasaltodelatablaproductoseusalafuncinMAXyla sentenciaSQLseria: selectmax(precio_prod)fromproducto;

Paraelmnimoseria: selectmin(precio_prod)fromproducto;

TodaslasfuncionesanteriormentedescritassepuedenusarjuntoconunWHERE. Porejemplo: Contarlosproductosconpreciomayora$200000 selectcount(*)fromproductowhereprecio_prod>200000; Delatablaproductoyenlacategoraimpresoraindicarelpreciomsalto. Estassonlasimpresoras: Select nombre_prod,cat_prod,precio_prod from producto cat_prod='impresora';

where

Deestas,lamscaraes:
34 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

Selectmax(precio_prod)fromproductowherecat_prod='impresora';

AgruparyOrdenarDatos
Despus de realizar una consulta los datos se muestran de manera arbitraria.los resultados de una consultan se pueden organizar por grupos u ordenarlos de alguna manerausandoGROUPBYyORDERBY.

Agrupardatos
Agrupardatoseselprocesodecombinarcolumnasconvaloresduplicadosenunorden lgico. Se pueden crear grupos y usar sobre esos grupos funciones agregadas tales comoSUM,COUNT,MAX,MIN,AVGvistasenelaparteanterior. Para agrupar datos se utiliza la sentencia GROUP BY que junto con SELECT agrupar datosidnticosdeunacolumnaengrupos. La clausula GROUP BY esta antes de ORDER BY y despus de un WHERE como se muestra: SELECT FROM WHERE GROUPBY ORDERBY Ylasintaxiseslasiguiente: SELECTCOLUMN1,COLUMN2 FROMTABLE1,TABLE2 WHERECONDITIONS GROUPBYCOLUMN1,COLUMN2 ORDERBYCOLUMN1,COLUMN2 Alhacerunaconsulta,lasfilasresultantesestnordenadasenunordenarbitrario.

ConsultasSQL/AgruparyOrdenarDatos

35

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

LosproductossepuedenordenarporcategorasusandolaclausulaGROUPBY. Select*fromproductogroupbycat_prod;

PeroGROUPBYobvialasfilasdelascolumnasrepetidasenlacolumnaespecificada paraagruparcomofuecat_prodenlaconsultaanterior,siseobservaelresultadoyse comparaconlagraficaanterior,soloseobservaunvalorporcategoraylosrepetidos handesaparecido.Parasolucionarestosepodraagruparporcategoraypornombrea lavezoporcdigo,siendocategoraelgrupomayoryelnombreelgrupoinferioro subgrupo. Select*fromproductogroupbycat_prod,nombre_prod;

Si la consulta fuera primero el nombre y luego la categora el resultado sera muy diferente.
36 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

Select*fromproductogroupbynombre_prod,cat_prod;

Si se mira con detenimiento el resultado, la consulta intenta agrupar primero por nombreylacategoraquedaensegundolugarytambinGROUPBYintentaordenar lascolumnasqueseagruparon. Sequieresabercuntosproductoshaydecadacategora: Selectcat_prod,count(*)fromproductogroupbycat_prod;

Esta sentencia agrupa los productos por categora y aplica la funcin a cada grupo resultante. Sedeseaconocerelpreciopromediodecadacategora. Selectcat_prod,avg(valor_prod)fromproductogroupbycat_prod;

Se desea conocer cuntos elementos se compraron por facture, esto se mira en la tablatem_facturayseagrupanlasfilasporcodigo_fact.

ConsultasSQL/AgruparyOrdenarDatos

37

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Selectcodigo_fact,count(*)fromtem_facturagroupbycodigo_fact;

OrdenarDatos
ParaordenarlosresultadosdeunaconsultaseusalaclausulaORDERBY.Lasentencia ORDERBYvasiempredespusdeGROUPBYsiestaestpresenteenlaconsulta. SELECT FROM WHERE GROUPBY ORDERBY Ylasintaxiseslasiguiente: SELECTCOLUMN1,COLUMN2 FROMTABLE1,TABLE2 WHERECONDITIONS GROUPBYCOLUMN1,COLUMN2 ORDERBYCOLUMN1,COLUMN2 Donde las columnas que siguen a ORDER BY son las que definen el orden en que se prEsentalaconsulta. Sequiereordenarlosclientespornombre. Select*fromclienteorderbynombre_cliente;

Sequiereordenarlosclientesporciudadyluegopornombre. Select*fromclienteorderbyciudad_cliente,nombre_cliente;

Al analizar los resultados de ORDER BY y GROUP BY se podra decir que son muy similares ya que GROUP BY tambin ordena las filas por las columnas que esta agrupando, pero hay que tener en cuenta que GROUP BY elimina los valores duplicadosdelgrupoyseusaprincipalmenteconfuncionesdeagregacin.
38 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

MANIPULACIONDEDATOS
Comosevioenapartesanterioresunregistroenunatablasepuedecrearusando unasentenciaSelectquehacepartedelDMLenSQL.Yacreadoslosregistrosdeuna tablaestossonsusceptiblesamodificacionesenalgunasdesuscolumnasoinclusoa eliminacionescompletas.

Actualizacinderegistros
ParamodificarlosdatosyaexistentesenunatablaseutilizalasentenciaUPDATE cuyasintaxissemuestraacontinuacin. updatetable_name setcolumn1=value, [column2=value,] [column3=value] [wherecondition]; Donde table_name es el nombre de la tabla donde se va hacer la actualizacin, seguidodesetvanlistadaslosnombresdelascolumnasysusvaloresywheredefinela condicinlgicaquedebencumplirlasfilasquesevanaactualizar. Por ejemplo, se quierecambiar el lugar de residencia de Gladys Bustos Ariza con cedula41691659dearmeniaaCali. Losdatosde41691659son: Select*fromclientewherecedula_cliente=41691659

La condicin de actualizacin es que cedula_cliente sea igual a 41691659 y se va a cambiarlacolumnaciudad_cliente. updateclientesetciudad_cliente='cali'wherecedula_cliente='41691659'; yelresultadofinaldelaactualizacines: Hayquetenercuidadoendisearlacondicindeactualizacinyaqueunacondicin mala puede daar la integridad de los datos. Si se omite la condicin con where, se actualizantodaslasfilasdelatabla. Delatablaempleadossequierecambiarladireccinyeltelfonode109410923. Estossonlosdatosactualesdedichapersona:
MANIPULACIONDEDATOS/Actualizacinderegistros 39

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Laactualizacinseria: update empleado set direccion_emp='el granada',telefono_emp='7432123' where cedula_emp='109410923';

BorrarRegistrosdeunaTabla
ParaborrarfilasseutilizalasentenciaDELETEcuyasintaxiseslasiguiente: deletefromtable_name [wherecondition]; Dondetable_nameeselnombredelatablayconditioneslacondicionqueacompaa alwhereeindicacualessonlasfilasquesevanaborrar. Sisedeseaborrardelatablaproductotodosaquellosquecuestenmenosde$200000 seutilizaralasiguientesentencia: Deletefromproductowhereprecio_prod<200000; Estaeslatablaproductoantesdeejecutarlasentencia

Yasquedadespus:

Como se puede observar, solo quedan los productos con precio mayor o igual a 200000. LacondicinqueacompaaelWHEREenUPDATEoDELETEpuedesertancompleja comosedeseeypuedenllevartodoslosoperadoresaritmticosylgicosexplicados enapartesanteriores.
40 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

ConsultasComplejas
Lasconsultasexplicadasanteriormentesolosehacensobreunatabla.Siporejemplo se necesitara saber mediante una consulta SQL el nombre de los productos relacionadosenunafactura,nosepodraconunsimpleselectyaqueenlostemde unafactura(tem_fact)soloestpresenteelcdigodelproductoynosunombre,el nombre est en la tabla factura y en la consulta tambin debera estar la tabla producto. En la vida real la informacin est relacionada y en esa dinmica las consultas deben ser capaces de extraer la informacin siguiendo las relaciones presentes en la base de datos. A la unin de tablas en una consulta se le denomina uninomscomnmenteJOIN.

UNIONESOJOINS
Unaunineselusodedosomstablasenunaconsulta.Unauninprovienedeun producto cartesiano en el cual se aplica un filtro mediante un WHERE. Un producto cartesianoeslamultiplicacindelasfilasdeunatablaporlasfilasdeotratabla. Supngasequesetienen2tablas: factura

Yempleado

Elproductocartesianoentredosomstablassehacedelasiguientemanera: Select*fromtabla1,tabla2,tabla3,.,tabla_n Paraestasdostablasenespecialseria: Select*fromfactura,empleado

ConsultasComplejas/UNIONESOJOINS 41

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Obsrveseesteresultado.Laprimerafiladefacturaestarepetidaelnmerodefilasde empleado, es decir, la primera factura se uni con cada una de las filas 6 filas de empleados, la segunda factura tambin tiene las columnas de los 6 empleados de la otratabla. EnunproductocartesianooCROSSJOIN,lasfilasresultantessonlamultiplicacinde las2tablasylascolumnasresultantessonlasumadelascolumnasdelasdostablas. Perolamayoradelainformacinenunproductocartesianoesintil,solosontiles unaspocasfilas,perocuales?,Pararesolveresapreguntaseusanlasrelaciones. Alobservarlafactura1(num_fact=1)sevequeestafacturaestaligadaalaceduladel empleado109410923 Porestaraznelregistroquedeberasobrevivirseriaelquetuvieracomo

cedula_emp en factura 109410923 y en empleado codigo_emp 109410923. Los mismo pasa con la factura 2(con la codigo_emp=9764355) y la factura 3(con la codigo_emp=1094355434), en pocas palabras solo son tiles las filas que comparten cedula_empenambastablasdondeademascedula_empeselcampolasrelaciona. Para sacar estas filas del producto cartesiano se usa un WHERE para indicar que de estas filas solo se tendrn en cuenta los que tenga codigo_emp de factura igual a cedula_empdeempleado. Select*fromfactura,empleadowherefactura.codigo_emp=empleado.cedula_emp

Este resultado son las facturas con la informacin del empleado involucrado en la venta. Obviamente en esta consulta se pueden mostrar solo las columnas deseadas cambiandoasterisco(*)porlalistadeloscamposqueseusan.

42 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

Selectfactura.codigo_factura,factura.fecha_factura, empleado_cedula_emp,empleado.nombre_emp fromfactura,empleadowherefactura.codigo_emp=empleado.cedula_emp Siseobservalasentenciacuandosehacereferenciaauncampodelatablasehace anteponiendo el nombre de la misma y luego seguido de punto (.) el nombre del campocomoenfactura.codigo_facturaoempleado.nombre_emp.Estoesnecesario encasoqueenlastablashayacamposconelmismonombre. Tambin se podra mostrar la informacin del cliente que aparece en la factura tal como nombre y cedula, entonces a la consulta anterior habra que aadirle la tabla cliente Selectfactura.codigo_factura,factura.fecha_factura,empleado.cedula_emp, empleado.nombre_emp,cliente.nombre_client,cliente.cedula_cliente fromfactura,empleado,clientewhere factura.codigo_empleado=empleado.cedula_emp andcliente.cedula_cliente=factura.cedula_cliente

enlaconsultasepuedeverqueseaadilatablaclientedespusdeFromparaindicar queestatablavaaparticiparenlasentencia,tambinselistanlascolumnasdecliente quesevanamostraryenwherejuntoconunaAndsemuestransololosregistrosque compartan el mismo valor de la cedula del cliente en ambas tabla con cliente.cedula_cliente=factura.cedula_cliente. De manera general, cuando se quiere hacer un JOIN de dos o mas tablas siempre deben conectar las relaciones con un where igualando los campos relacionados en la consulta. En la sentencia estn igualados las cedulas de empleado que forman la relacin facturaempleado y las cedulasdelosclientesqueformanlarelacinclientefactura.AestaclasedeJOINsele denominaINNERJOIN.

ConsultasComplejas/UNIONESOJOINS

43

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

YaqueestaesunaoperacinmuyfrecuenteSQLtieneunaclausulaespecialparaesta clasedeconsultasllamadaINNERJOIN,heaqulasintaxis: SELECTTABLE1.COLUMN1,TABLE2.COLUMN2... FROMTABLE1 INNERJOINTABLE2ONTABLE1.COLUMN_NAME=TABLE2.COLUMN_NAME Usandoestasintaxisestaconsulta Selectfactura.codigo_factura,factura.fecha_factura,empleado_cedula_emp, empleado.nombre_emp fromfactura,empleadowherefactura.codigo_emp=empleado.cedula_emp quedararescritaasi: Selectfactura.codigo_factura,factura.fecha_factura,empleado_cedula_emp, empleado.nombre_emp fromfacturainnerJoinempleadoonfactura.codigo_emp=empleado.cedula_emp yanoesnecesarioelwhere.Yfacturayempleadosevanaunirsiguiendoelcriterio factura.codigo_emp=empleado.cedula_emp. Otrosejemplosdeconsultas Sedeseaconocerelnombredelosproductosrelacionadosenlasfacturavendidasen octubreademsdesaberquienlosvendiyeltelfonoaquienselesvendi. Analizandoelenunciadoseobservaquesenecesitatenerlastablasdeproductospara el nombre, factura para las fechas, los tem_fac para saber que se vendi en cada factura,empleadoparaelvendedoryclienteparaeltelfonodelcliente. Construyendolasentenciaporpasossetiene Select*fromempleado,cliente,factura,tem_fac,producto Aquestnlastablasrelacionadasyproductocartesianodelquesaldrlatabla.Ya definidoesto,juntoconelwheresehacenlasrelacionesentrelastablasqueserian: tem_fac.num_facconfactura.numFac Product.codigo_productoconitem_fac.codigo_producto Factura.cedula_clienteconcliente.cedula_cliente Factura.cod_empconempleado.cedula_emp Laconsultaquedaraentonces: select*fromcliente,empleado,factura,producto,item_factura wherecliente.cedula_cliente=factura.cedula_cliente and
44 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

empleado.cedula_emp=factura.codigo_empleado and item_factura.codigo_fact=factura.codigo_factura and producto.codigo_prod=item_factura.codigo_producto ; ahorahayquefiltrarlosregistrosdeoctubre.Estosepuedehacerdedosmanera: laprimeraconotroanddondelafechaesteentreel1yel31 select*fromcliente,empleado,factura,producto,item_factura wherecliente.cedula_cliente=factura.cedula_cliente and empleado.cedula_emp=factura.codigo_empleado and item_factura.codigo_fact=factura.codigo_factura and producto.codigo_prod=item_factura.codigo_producto and factura.fecha_facturabetween'2008101'and'20081031'; ylaotrapuedeserconunlikeyusandouncomodineneldia select*fromcliente,empleado,factura,producto,item_factura wherecliente.cedula_cliente=factura.cedula_cliente and empleado.cedula_emp=factura.codigo_empleado and item_factura.codigo_fact=factura.codigo_factura and producto.codigo_prod=item_factura.codigo_producto and factura.fecha_facturalike(200810%); Ahorasolobastaenescogerlascolumnasdeseadasenlaconsulta selectproducto.nombre_prod,cliente.nombre_client, factura.fecha_factura,cliente.telefono_cliente fromcliente,empleado,factura,producto,item_factura wherecliente.cedula_cliente=factura.cedula_cliente and empleado.cedula_emp=factura.codigo_empleado and item_factura.codigo_fact=factura.codigo_factura and producto.codigo_prod=item_factura.codigo_producto and factura.fecha_facturalike('200810%'); Elresultadofinales:

ConsultasComplejas/UNIONESOJOINS

45

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Sedeseaconocercuntodineroserecogienprocesadoresycuantossevendieron enelsegundosemestrede2008. Lastablasinvolucradasenestaconsultason: Producto:senecesitasaberlacategoradelproductoyelprecio. Factura:lasfechasestnenlafactura tem_fact:hayquesabercuntassevendieronyestoestaentem_fac Lasrelacionespresentesson: Cdigo_prodentreproductoetem_factura Cdigo_facturaentrefacturaetem_factura Laconsultapreliminarmentequedaasi: select*fromproducto,item_factura,factura whereproducto.codigo_prod=item_factura.codigo_productoand factura.codigo_factura=item_factura.codigo_fact; se filtra la fecha del segundo semestre (200871)(20081231) y la categora de procesador select*fromproducto,item_factura,factura whereproducto.codigo_prod=item_factura.codigo_productoand factura.codigo_factura=item_factura.codigo_fact and factura.fecha_facturabetween'200817'and'20081231' andproducto.cat_prod='procesador'; Deestaconsultasolosenecesitanlacantidadyelvalordelproducto selectitem_factura.cant_prod,producto.precio_prod fromproducto,item_factura,factura whereproducto.codigo_prod=item_factura.codigo_productoand factura.codigo_factura=item_factura.codigo_fact and factura.fecha_facturabetween'200817'and'20081231' andproducto.cat_prod='procesador'; Elresultadodeestaconsultaes:

46 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

Peroestascolumnashayquesumarlas,estosehaceconSUM. selectSUM(item_factura.cantidad),SUM(producto.precio_prod) fromproducto,item_factura,factura whereproducto.codigo_prod=item_factura.codigo_productoand factura.codigo_factura=item_factura.codigo_fact and factura.fecha_facturabetween'200817'and'20081231' andproducto.cat_prod='procesador';

LaconclusinesqueenelSegundosemestrede2008sevendieron9procesadorespor unvalorde$1.820.000 Parapagarlealosempleadossucomisinsedeseaconocerlaventasquerealizaron enelmesdeoctubrede2008.Elinformedebepresentarelnombre,cedulayvalorde lasventas. Comosiempre,primeroseanalizalastablasquesenecesitanpararealizarlaconsulta Lastablasson: Empleado:elnombredelempleadoestaenesatabla Factura:lafechadelacompraestaenesafactura Productoetem_factura:paracalcularlovendidohayquesaberlacantidady elpreciodelosproductosvendidos. Preliminarmentelaconsultaqueda: selectempleado.cedula_emp,empleado.nombre_emp, item_factura.cantidad,producto.precio_prod fromempleado,factura,item_factura,producto Lasrelacionesentrelastablasson: 1. entrefacturayempleadoestalaceduladelempleado 2. entreproductoetem_facturaestaelcdigodelproducto 3. entrefacturaetem_facturaestaelnumerodelafactura

ConsultasComplejas/UNIONESOJOINS

47

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Laconsultaquedaraentonces: selectempleado.cedula_emp,empleado.nombre_emp, item_factura.cantidad,producto.precio_prod fromempleado,factura,item_factura,producto whereempleado.cedula_emp=factura.codigo_empleadoand item_factura.codigo_fact=factura.codigo_facturaand item_factura.codigo_producto=producto.codigo_prod ahorasedebefiltraroctubre selectempleado.cedula_emp,empleado.nombre_emp, item_factura.cantidad,producto.precio_prod fromempleado,factura,item_factura,producto whereempleado.cedula_emp=factura.codigo_empleadoand item_factura.codigo_fact=factura.codigo_factura anditem_factura.codigo_producto=producto.codigo_prod factura.fecha_facturalike(200810%); Elresultadodeestaconsultaeselsiguiente:

and

Para calcular lo producido por cada vendedor hay que multiplicar la cantidad por el precio_prod.Entonceshayquemultiplicaresasdoscolumnasylaconsultaquedaas: selectempleado.cedula_emp,empleado.nombre_emp, item_factura.cantidad*producto.precio_prod,factura.fecha_factura fromempleado,factura,item_factura,producto whereempleado.cedula_emp=factura.codigo_empleadoand item_factura.codigo_fact=factura.codigo_facturaand item_factura.codigo_producto=producto.codigo_prodand factura.fecha_facturalike('200810%');
48 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

Como hay que calcular lo producido por camilo andres, juan sebastian y andres mauricio se deben agrupar estas filas por medio de Group By para agrupar los resultadosporlaceduladelempleadooelnombre.yusarunafuncindeagregacin comoSUM. SiseagrupacongroupBYqueda: selectempleado.cedula_emp,empleado.nombre_emp, item_factura.cantidad*producto.precio_prod,factura.fecha_factura fromempleado,factura,item_factura,producto whereempleado.cedula_emp=factura.codigo_empleadoand item_factura.codigo_fact=factura.codigo_facturaand item_factura.codigo_producto=producto.codigo_prodand factura.fecha_facturalike('200810%')groupbyempleado.cedula_emp;

YseusalaSUMsobreelgrupo selectempleado.cedula_emp,empleado.nombre_emp, SUM(item_factura.cantidad*producto.precio_prod) fromempleado,factura,item_factura,producto whereempleado.cedula_emp=factura.codigo_empleadoand item_factura.codigo_fact=factura.codigo_facturaand item_factura.codigo_producto=producto.codigo_prodand factura.fecha_facturalike('200810%')groupbyempleado.cedula_emp;

Enelresultadodelaconsultasevelovendidoporcadavendedorenoctubre.

ConsultasComplejas/UNIONESOJOINS

49

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Consultasanidadas
Unaconsultaanidadaesaquellaqueutilizalasfilasdeotraconsultaparacalcularsu resultado.Unaconsultaanidadaesunasubconsultaembebidadentrodeunaclausula WHERE de otra consulta. Cuando se realizan consultas anidas, primero se ejecuta la subconsulta cuyo resultado alimenta la consulta principal. Una consulta anidada se puedeusarconunselect,update,deleteoinsert. Las consultas anidadas son usadas en muchas ocasiones en lugar de los JOIN ya que conectan indirectamente los datos entre las diferentes tablas. una consulta anidada puedeusarseconoperadorestalescomoIN,NOTIN>,<,=,!=,AND,ORyotros. Hayciertasconsideracionesatenerencuentaalrealizarunaconsultaanidada: Lasubconsultadebeestarencerradaentreparntesis. Lasubconsultasolopuedearrojarunacolumnacomoresultado. NosepuedeusarunGROUPBYenlasubconsulta Las subconsultas que arrojen ms de una fila solo se pueden usar con operadorestalescomoIN,NOTIN. Lasintaxisdeunaconsultaanidadaes: SELECTCOLUMN_NAME FROMTABLE WHERECOLUMN_NAMEOPERADOR(SELECTCOLUMN_NAME FROMTABLE WHERECONDITIONS); Ejemplos. Se necesita saber que vendedores han vendido en el periodo de agosto septiembrede2008. De la factura se puede saber la cedula de todos los vendedores en un periodo de tiempo.Lasiguientefacturapodrainformardeloanterior: selectdistinctcodigo_empleadofromfactura wherefecha_facturabetween('200881')and('2008931'); cuyoresultadoeselsiguiente:

50 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

Lo siguiente es mirar cuales son los empleados que estn en la tabla empleado con estoscdigosresultadodelaconsultaanteriorlacualseconvierteensubconsultaoen otraspalabras,delatablaempleadoscualescdigosestnenlacolumnaresultadode lasubconsulta. selectcedula_emp,nombre_empfromempleado wherecedula_empin( selectdistinctcodigo_empleadofromfactura wherefecha_facturabetween('200881')and('2008931') );

Hay que recordar que IN selecciona las filas cuyo campo de comparacin este en la listadevaloresdentrodeIN,enestecasoesalistasedefinepormediodelaconsulta. Se necesita saber cuales productos son mas costosos que el producto identificado conelcdigo'44234' select*fromproductowhereprecio_prod>(selectproducto.precio_prod fromproducto wherecodigo_prod='44234' ); Con la subconsulta se averigua por el valor del producto identificado por 44234 queesde$320000.Enlaconsultaprincipalesevalorsecomparacontodoslosprecios delatablaparaescogersololosqueseanmayoresocuestenms.

Hayqueaclararquecuandoseusanoperadorestalescomo>,<,=o=elresultado delasubconsultadebesernumricoademsdearrojarunsolovalorynounacolumna devaloresonmeros.

Consultasanidadas/UNIONESOJOINS

51

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Senecesitasaberqueproductosyqucantidaddecadaunosevendienelmesde octubrede2008. Losproductosquesevendieronenoctubrede2008sonlosqueestnenlasfacturas deesemes.Esosepuedeaveriguarconlasiguienteconsulta selectcodigo_facturafromfacturawherefecha_facturalike('200810%');

Lo siguiente es mirar en tem_factura cuales productos tienen algunos de estos nmerosdefactura. Estassontodaslasventasconelnombredelosproductos: select*fromitem_factura,producto whereproducto.codigo_prod=item_factura.codigo_producto unsimpleJOINentreitem_facturayproducto. lo nico que falta es saber cual de las ventas tiene como cdigo _fact alguno de los cdigos que se encontraron con la consulta anterior. Esto se puede hacer con el operadorINylaconsultaanteriorcomosubconsulta. selectproducto.codigo_prod,producto.nombre_prod,cantidad fromitem_factura,product whereproducto.codigo_prod=item_factura.codigo_producto anditem_factura.codigo_factin( selectcodigo_facturafromfactura wherefecha_facturalike('200810%') );

Siseobservaelresultadohayelementosrepetidoscomoel53123,53455yel43213. Loquesepodrahaceresagruparlasfilasdelaconsultaporcdigo_prodysumarla columnadecantidadconSUM


52 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

selectproducto.codigo_prod,producto.nombre_prod,sum(cantidad) fromitem_factura,product whereproducto.codigo_prod=item_factura.codigo_producto anditem_factura.codigo_factin( selectcodigo_facturafromfactura wherefecha_facturalike('200810%') )groupbyproducto.codigo_prod;

Actualizacinyborradodefilasatravsdeconsultasanidadas
Comosedijoenlaseccindeactualizaryborrarregistros,lacondicindeactualizacin puedesertancomplejacomosedesee,tancomplejaquepuedeestardefinidaatravs deunaconsulta. Ejemplo: Sequiereincrementarelpreciodelosproductosquehayantenidocomprasdemasde 2elementosalgunavezenun10%. Para averiguar dichos elementos buscamos en la tabla tem_fac que productos han cumplidoestacondicin: selectcodigo_producto,cantidadfromitem_facturawherecantidad>2 ahorahayqueactualizarpormediodeUPDATE(pg.39)lasfilasdelatablaproducto cuyos codigos estn en la lista que nos entrega la consulta anterior. Esto se puede hacerconINusandolaconsultaanteriorcomosubconsulta.

Consultasanidadas/Actualizacinyborradodefilasatravsdeconsultas anidadas

53

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Updateproductosetprecio_producto=1.1*precio_producto wherecdigo_productoIN( selectcodigo_producto fromitem_facturawherecantidad>2 ); al actualizar con precio_producto =1.1*precio_producto se esta incrementando el preciodelosproductosen10%yaquealprecioactualselemultiplicapor1.1o110%. ParaborrarfilasseusalasentenciaDELETE(pg.40).Tambinlacondicindeborrado queseusajuntoconelWHEREpuedecontenerunasubconsultatalycomosemostro conUPDATE. Sedeseaborrartodoslosempleadosquenohayannuncavendidoalgo. Estossonlosempleadosdelaempresa:

Estossonlosquenuncahanvendidoalgunavez: selectdistinctcodigo_empleadofromfactura,item_factura whereitem_factura.codigo_fact=factura.codigo_factura;

Sisecomparalasdostablasseobservaqueelunicoquenoestaaquies1094234424. Esehayqueborrarlo.Enpocaspalabras,hayqueborrartodoslosquenoestnenla lista generada por la consulta anterior para saber si los valores de una columna no estanenunconjuntodedatosseusaNOTIN. DELETEfromproduct wherecodigo_productoNOTIN( selectdistinctcodigo_empleado fromfactura,item_facturawhere item_factura.codigo_fact= factura.codigo_factura );

54 LENGUAJEDECONSULTAESTRUCTURADOSQL

CAMILOANDRSFERRERBUSTOS

EAM

yelresultadoeselsiguiente:

Seobservaqueelempleadoencuestinyanoest.

Consultasanidadas/Actualizacinyborradodefilasatravsdeconsultas anidadas

55

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

CAPITULO3 ACCESO A UNA BD POR MEDIO DEUNAAPLICACINJAVA

Introduccin
UnabasededatosesadministradaprincipalmenteporunSistemagestordeBasede datosoSGBDporsussiglaseningles.Dichaadministracinsehacealniveldedefinir las tablas y las relaciones existentes entre las mismas, los aspectos de seguridad y otrosquesondefinidosporelDataBaseAdministratoroDBA.Todaslastareashechas atravsdelSGBDsehacenpormediodellenguajeSQLcomoenMySQLoconayudas masvisualescomoenACCESSdeMicrosoft. AunqueelSGBDentregaherramientaspoderosasparalaadministracindelosdatosy la estructura de los mismos, estas tareas requieren de conocimientos muy tcnicos queelcomndelosusuariosquerequierenmanipularyconsultarlainformacinno tiene,ademsdelhechoquelainterfazdeusuariodelgestorestdiseadamaspara administrar la BD y no para interactuar la informacin. Por estas y otras razones se crean aplicaciones de uso especfico para poder interactuar con la base de datos de maneramsfcilytransparenteparaelusuariofinalqueenltimaseselpropsitoo motivacinmayorparacrearunabasededatos. El acceso a la base de datos se puede hacer de muchas maneras ya sea por una aplicacinWEBounadeescritoriolacualpuedeserescritaencualquierlenguaje.La potenciadelabasededatosradicaenelhechoquepuedeseraccedidadecualquier manera posible ya quela misma es independiente de la aplicacin que la accede. Es responsabilidad de cada aplicacin obtener los recursos necesarios para poder conectarseconlabasededatos. Enestecaptuloseexplicaranlospasosyrecursosnecesariosparapoderaccederauna base de datos mediante una aplicacin JAVA y como lo aprendido en los captulos anterioresesdegranutilidadparaesefin.

56 CAPITULO3

CAMILOANDRSFERRERBUSTOS

EAM

ConceptosPreliminares.
Para poder conectarse a una base de datos a travs de una aplicacin JAVA es necesarioentenderalgunosconceptosclaves.

Driver
LaconexinaunabasededatossehaceatravsdeunDriver.UnDrivereselmedio por el cual la informacin almacenada en la base de datos llega a la aplicacin. El Driver constituye una capa intermedia entre la aplicacin y la base de datos la cual tienecomopropsitotraducirlasconsultasdedatosdelaaplicacinencomandosque el SGBD entienda para lo cual se requiere que tanto la aplicacin como la base de datosdebensercompatiblesconelDriverautilizar.PorloanteriorACCESStienesu Driver,MySQLtienesuDriver,ORACLEtienesuDriveryasitodoslosSGBDexistentes tienensupropiodriver.ExistenvariostiposdeDrivers,losODBCqueesunainterfaz creadaporMicrosoftylosJDBCquesondriversespecialesparaconectaraplicaciones JAVAaunabasededatos.

DNS
ElDATANAMESOURCEoDNSporsussiglaseningles,eslafuentededatosqueala queunDRIVERtipoODBChacereferencia,esdecir,sieldrivereselmedioporelcual seaccedeacualquierbasededatos,elDNSeselqueespecificaculdetodasdeese tipo de driver se va a acceder. Por ejemplo, en un computador pueden haber varias bases de datos de ACCESS, el DNS entonces har referencia a que base de datos de esas es que el usuario se quiere conectar. Al DNS se le llama tambin ALIAS. El DNS posee la informacin de la ubicacin fsica de la base de datos y el driver necesario paraaccederaella.Laubicacinfsicahacereferenciaalservidorocarpetadentrodel discodurodelPCdondeestlabasededatos.

ConceptosPreliminares./Driver

57

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

ConfiguracindeunDriverODBC

DriverparaunabasededatosdeACCESS
ParaconfigurarundriverODBCsedebetenerlabasededatosyalista.Acontinuacin semuestracomocrearunDNSparaunabasededatosdeACCESS. ParacrearunDNSsesiguenlossiguientespasos: Primerpaso. Enelpaneldecontrolseescogeherramientasadministrativas. SegundoPaso: Yaenherramientasadministrativasseescoge orgenesdedatosODBC Tercerpaso. YaenlaventanadeODBCseescogelapaleta DSN de usuario y en agregar se crea un nuevoorigendedatos.


58 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

CuartoPaso: Enestepasoseescogeeldriverdelabasededatosquesevaacceder.Enesalista estntodoslosdriverinstaladosenelsistema.

ComosevaacrearunDNSparaunabasededatosdeACCESseescogedichodriver yluegosedaclicenfinalizar. QuintoPaso: Enestaventanaseescogelarutadelabasededatosaconectarmedianteseleccionar. ElnombredelDNSoALIASseponeenelcampodenombredeorigendedatos. AquenelejemploelDNSsevaa llamar aprendiendo y apunta a c:\london.mdb que es la base de datosencuestin.Seguidoaesto se presiona aceptar y el DNS ya estalistoparausarse. AquenlalistadeDNSestaelnuevoorigendedatosquesecre.Sisequiereapuntar alabasededatosLondon.mdbsedebeapuntaralDNSllamadoaprendiendo.

ConceptosPreliminares./ConfiguracindeunDriverODBC

59

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

DriverparaMySQL
ParaconfigurarunDNStipoMySQLhayquetenerencuentaelservidordondeesta basededatosyaqueMySQLfuncionacomotal.Parahacerestodemanerasencillase recomienda utilizar el asistente que trae el aplicativo mysqlconnectorodbc5.1.4 win32quevieneconelmaterialdelcurso. Para configurar el DNS de MySQL se siguen los pasos del primero al tercero de la mismamaneracomosehizoconACCESS. Cuartopaso seescogeelMySQLODBC5.1Driver

Quintopaso Aqu se le pone un nombre al DNS(aprendiendoMySQL),unnombreal servidor(server),elnombredelservidor o server, nombre de usuario( User), contrasea(password) y puerto(port) fueron los que se usaron en la configuracindeMySQLalmomentode instalarlo.Losvaloresqueseusaronen la configuracin del DNS son los referentesalosconfiguradosenMySQL. Con el botn Test se prueba si la conexin es exitosa. El nombre de la base de datos se escoge de la lista que se muestra en database que en este casoesaprendiendo.

60 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

JDBC

Introduccin.
Comosedijoconanterioridadlosdriverssonelmedioporelcualselaaplicacino el usuario se conectan a la base de datos. JDBC es pues un conjunto de clases que permitenaunaaplicacintipoJAVAconectarseaunabasededatosdeunfabricante en particular. JDBC es una interfaz que permite hacer transparente para el programadorenJAVAtodoloreferentealaconexinaunorigendedatoshaciendo que la comunicacin con el mismo sea a travs de consultas SQL, y al ser SQL un EstndaraplicableacasitodaslosSGBD,hacequelatareadeinteractuarconlabase dedatosatravsdellenguajedeprogramacinseamuchomsfcil. JDBCesunAPIdefinidoenlospaquetesjava.sqlyjavax.sqlquecontienentodaslas interfacesyclasesnecesariasparamanipularlosdatosenlastablasdelabasededatos lo que permite hacer consultas de tipo Select, aadir, borrar o editar datos de las mismas. JDBC tambin permite conectarse a DNS de tipo ODBC a travs de una interfazespecial.

ConexinalaBasededatos.
Lasclasesnecesariasparalaconexinalabasededatosseencuentranenjava.sqly javax.sql. Loprimeroquesedebehacerescargaredriverquesevaausarenlaaplicacin.Esto se logra usando el mtodo estatico forName() de la clase Class. La sintaxis es la siguiente: Class.forName(nombre_driver) Dondenombre_drivereseldriverquesevaacargar. Los nombres de los driver ya estn definidos por el JDK solo hay que descargar e instalarlosqueseannecesarios.EldriverpordefectoquetraeelJDKeseldenominado puente JDBCODBC que permite conectarse a cualquier DNS de tipo ODBC. Se le denomina puente ya que crea un camino entre JDBC y ODBC que como se vio

JDBC/Introduccin.

61

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

anteriormente son dos tipos de drivers distintos. El nombre de este driver es:

sun.jdbc.odbc.JdbcOdbcDriver.
ParacargarundriverdeMySQLseusa: SieldrivernosepuedecargarsegeneralaexcepcinClassNotFoundException. Ya cargado el driver hay que escoger a cual base de datos se va a conectar la aplicacin. Esto se hace a travs de la clase DriverManager. DriverManager no necesita instanciarse ya que implementa mtodos estticos que permiten cargar el driver apropiado. Si DriverManager no puede cargar el Driver genera la excepcin SQLException. Para conectarse con la base de datos a travs de DriverManager se usa el mtodo getConnection(StringURL,Stringuser,StringPassword)querecibe3parmetrosque son: StringURL:direccindelabasededatosqueevaausar. Stringuser:nombredeusuariodelabasededatos.Estenombrefuenelquese lepusoalabasedatosenelmomentodesucreacin. StringPassword:contrasadelaBD.Estacontraseatambinsedefinienel momentodcrealabasededatos. ElURLseconocecomolocalizadoruniversalderecursosysuestructuraeslasiguiente: jdbc:<subprotocol>:<subname> donde jdbc es el estndar usado, subprotocol es el tipo particular de la fuente de datos que puede ser ODBC, MySQL, Oracle y el subname depende solo del subprotocoloquepuedeserelnombredelabasededatosoDNSolaubicacion. EncasoquesequisieraaccederaunabasededatosODBCelurlquedaraasi: jdbc:odbc:<DNSoalias> sifueraenconunabasededatosremotaelurlseria: jdbc:<subprotocol>://ubicacion:puerto/nombreBD paraMySQLtrabajandocomolocalunejemplodeurlseria: jdbc:mysql://localhost:3306/aprendiendo elurltienelacapacidaddedireccionarlaaplicacinaunabasededatosqueesteen cualquierubicacinlocaloremotacomoseriaenunaredoenlamismainternet. ElmtodogetConnectionretornaunobjetodetipoConnection,queeslaquepermite quehayaunaconexindirectaentrelaBDylaaplicacin. LacomunicacinentrelaBDylaaplicacinsedaatravsdeconsultasSQL.Laclase que permite enviar las consultas a la BD es la interfaz Statement. El mtodo
62 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

executeQuery(String consulta) recibe como parmetro una cadena donde se encuentralaconsultaenlenguajeSQLyretornaelresultadodedichaconsultaenun objetodetipoResultSet.ParacrearunStatementqueinteractueconlabasededatos conectadaalaaplicacinseusaelmetodocreateStatement()delobjetoConnection creadocongetConnectiondeDriverManager. Elsiguientefragmentodecdigomuestracomoconectarseaunabasededatosdecon undriverodbcyDNSaprendiendomySQl.EstaesunabasededatoshechaenMySQL quetienecomousuariorootynotienecontrasea. ConexinalDNS aprendiendomySqlconusuario Connection conexion; rootysinpassword().Aquse Aqusecargaeldrivertipo Statement stmt; estableceelvalordelobjeto try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conexion=DriverManager.getConnection("jdbc:odbc:aprendiendoMysql","root" ,""); stmt=conexion.createStatement(); } Delobjetollamadoconexin catch (ClassNotFoundException e){ creadocongetConnectionse e.printStackTrace(); creaelStatementllamadostmt } catch (SQLException e) { poreleccindelprogramador. e.printStackTrace(); } Excepciones

generadasenel procesode conexin

Consultandolabasededatos.
Del fragmento de cdigo anterior, la interfaz Statement llamada stmt permite hacer las consultas de tipo SQL a travs del mtodo executeQuery( string consulta). Este mtododevuelvecomoresultadounobjetodetipoResultSet.elsiguientefragmento decdigomuestralosprincipalesmtodosycaractersticasdelResultSetydelcualse destacanalgunosmtodosimportantesdelresulsetcomoson: Next() getString() getDouble() lasfilasresultantesdelaconsultaestnalmacenadasenelresulset.Pararecorrerlas unaaunaseutilizaelmtodonext()queretornaverdaderocuandoseapuntaauna filavalida.Cuandosellegaalfinal,next()retornafalso.Poresolatablaserecorrecon unwhilequerevisasisellegoalfinal.
JDBC/ 63

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

public static void main(String[] args) { Connection conexion; Statement stmt; ResultSet resultado; String consulta; String Cad=""; String nombre,descripcion,codigo; double precio=0; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conexion=DriverManager.getConnection ("jdbc:odbc:aprendiendoMysql","root" ,""); stmt=conexion.createStatement(); consulta="Select * from producto";//consulta SQL resultado=stmt.executeQuery(consulta); while(resultado.next()==true) { nombre=resultado.getString("nombre_prod"); codigo=resultado.getString("codigo_prod"); precio=resultado.getDouble("precio_prod"); Cad+=(codigo+" | "+nombre+"|"+precio+"\n"); } JOptionPane.showMessageDialog(null, Cad); } catch (ClassNotFoundException e){ e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } Conexin es el Objeto que gestiona conexinalaBD Stmt es el Objeto para escribir la consultaSQL ResultadoeselResultSetquerecibe elresultadodelaconsulta Consulta es un String donde se definelaconsultaSQL Dentrodelbloquetrycatchsecarga eldriverconclass.forName Y con driverManager seconecta alabasededatos.

Conelobjetostmtsecreaelobjeto alcualseleenvanlasconsultas. Se define en el String consulta la consulta a la base de datos y se enva con executeQuery la cual devuelve en resultado un ResulSet conlosdatosdelaconsulta. En un while se recorre con el mtodonextlasfilasdelResultSety con getString que recibe como parmetroelnombredelacolumna seextraeeldato. Se muestran los datos acumulados encad.

Se gestionan las excepciones generadas.

El ResultSet tieneunapuntadorinternoqueindicasobrequefiladelresultadosevan hacer las operaciones. next() mueve ese apuntador de menor a mayor. Hay otros mtodosquemodificanelvalordelapuntadorocursorqueson: first():mueveelcursoralaprimerafiladelresultadodelaconsulta beforeFirst():mueveelcursorantesdelaprimerafila last():mueveelcursoralaltimafila afterLast():mueveelcursordespusdelaltimafila.

64 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

getString(String), getDouble(String) son un conjunto de mtodos que sirven para obtenerelvalordelacolumnadelafilaqueapuntaelcursordelResultSet.Antesde profundizar en esa clase de mtodos es necesario saber cmo JDBC interpreta los diferentestiposdedatospresentesenSQL.Lasiguientetablamuestraesarelacin. Tipo de dato en JAVA String java.sql.Numeric boolean byte short int long float double byte[] java.sql.Date java.sql.Time Tipo de dato en SQL VARCHAR or LONGVARCHAR NUMERIC BIT TINYINT SMALLINT INTEGER BIGINT REAL DOUBLE VARBINARY or LONGVARBINARY DATE TIME Mtodo para obtener el valor getString(nombre_col)

getBoolean(nombre_col) getByte(nombre_col) getShort(nombre_col) getInt(nombre_col) getLong(nombre_col) getFloat(nombre_col) getDouble(nombre_col) getByte(nombre_col) getDate(nombre_col) getTime(nombre_col)

EstatablamuestraademslosmtodosdelResultSetnecesariosparaobtenerundato deuntipodeterminadoenSQL. LosmtodosgetXXXX(String)recibencomoparmetroelnombredelacolumnaenla queesteldatodeseado. Ejemplo. se hizo una consulta(select * from producto) y el ResultSet arrojo el siguiente resultado:

Nota:elResultSetnogeneraestatabla.ParamostrarunobjetoResultSetenunJTable hayinvertirvariaslneasdecdigo.

JDBC/Consultandolabasededatos.

65

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Si el cursor del ResultSet estuviera en la lnea resaltada y se quisiera obtener los valoresdeesafilaseutilizaranlosmtodosdelasiguientemanera: Paraobtenerelnombredelproducto:resultado.getString(nombre_prod) Entre parntesis va el nombre de la columna tal y como se defini en la BD y esto retornaelStringMonitorAOC21Inchesqueelvalorqueestenesacolumna. Paraobtenerelvalordelproducto:resultado.getDouble(valor_producto)querecibe unacadenaconelnombredelacolumnayretornaundoubl(451000)conelprecio del producto. Se escogi getDouble por la columna precio_prod se defini como DoubleenlaBD. Loanteriorseharaconlasotrascolumnasdelafila.Sisedeseapasaralaotrafilase usaelmtodonext()yserepiteloanterior. Lotratadoenesteapartesonlosconceptosyconocimientosbsicosacercadecmo conectarsealaBDyrealizarconsultassobreellausandounprogramaenjava. A continuacin se muestra un ejemplo sencillo que busca consultar los datos de un clienteingresandosucedulaparalocualsediseolasiguienteinterfaz:

Alpresionarelbotnbuscarsedebemostrarelrestodelosdatosenloscampos correspondiente. Enelprogramaprincipalsehacelaconexinalabasededatosyseenvaalaventana pormediodelconstructordelamismaelobjetoConnectionpararealizarlasconsultas enlaventana. Eneleventodelbotnbuscarserealizalaconsultaysemuestranlosresultados.


66 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

Programaprincipal. publicstaticvoidmain(String[]args) Objetoconnectionparaenviarala { Connectionconexion; CargadeldriveryconexinalaBD proporcionandoelURLcorrespondiente try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conexion=DriverManager.getConnection ("jdbc:odbc:aprendiendoMysql","root",""); interfazBDClienteGUI=newinterfazBDCliente(conexion); } catch(ClassNotFoundExceptione) { Aquseinstanciala e.printStackTrace(); interfazyseenvael } objetoconexinque catch(SQLExceptione){ representaalaBD printStackTrace(); } } ConstructordelainterfazgraficaInterfazBDCliente privateConnectionconexion; /** *Thisisthedefaultconstructor */ publicinterfazBDCliente(Connectionconexion) { super(); this.conexion=conexion; initialize(); }

Constructordelainterfaz querecibeelobjeto connectionquevienedel programaprincipal

Elmtodoinitialize() configuralaposicinyel tamaodetodoslos componentesvisualesy ademsloseventos.

JDBC/Consultandolabasededatos.

67

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Eventobotnbuscarenlainterfazgrafica Objetosnecesariosparacrearla publicvoidactionPerformed(ActionEvente) consulta(stmt)yrecibirelresultadodela { misma(ResultSetresultado) if(e.getSource()==BBuscar) { Statementstmt; ResultSetresultado; StringconsultaSQL; try { stmt=conexion.createStatement();//secreaelobjetoStatement consultaSQL="select*fromclientewherecedula_cliente='"+TFcedula.getText()+"'"; resultado=stmt.executeQuery(consultaSQL); Aquseformala //comoestaconsultadaunafila,sielmtodonextdaverdadero cadenaquerealizala if(resultado.next()==true)//esporquehubounafilacomoresultado consulta.comola { consultadependedel TFNombre.setText(resultado.getString("nombre_client")); valordelJTextField,este TFTelefono.setText(resultado.getString("telefono_cliente")); seconcatenaala TFDireccion.setText(resultado.getString("direccion_cliente")); consultayserodeapor TFcorreo.setText(resultado.getString("ciudad_cliente")); comillassimplesyaque } esvarcharenlaBD. else//sinextretornafalsofuequelaconsultanoarrojoninguna {//filaynoseencontrelcliente.SeborranlosJTextFields JOptionPane.showMessageDialog(null,"Noexisteelcliente"); TFNombre.setText(); Aquseponeenlos TFTelefono.setText(); JTextFieldslosotros TFDireccion.setText( datosdelclientequese TFcorreo.setText(); obtienenconel respectivogetterque } recibeelnombredela } columnaaobtener catch(SQLExceptione1){ JOptionPane.showMessageDialog(null,e1.getMessage()); } } }

Enestefragmentodecdigoseobservaquesepuedeformarlaconsultapormediode datosqueelusuarioingresaatravsdeunJTextFielduotroscomponentessumandoa lacadenadelaconsultaeltextodelcomponente.Hayquetenerencuentalostiposde datosvarcharseencierranentrecomillas,poresoelcontenidodelcomponentedebe estarrodeadoporcomillassimples.Cuandolaconsultadependedevaloresvariableso esdinmicaesmejorusarunPreparedStatement.


68 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

PreparedStatement

PreparedStatementesunainterfazqueimplementaunaconsultaSQLprecompilada, osea,unaconsultaenlaquesedefinelastablasquesevanausarylascolumnasque sevanapresentar,esdecir,loquevaenlaclausulaselectyfromdelaconsulta.Los parmetrosdeentradaquedefinenlaconsultayquevanjuntoconlaclausulawhere sedefinendespuscuandosetenganesosdatos.Elusodeestainterfazestilcuando senecesitaenviarmuchasconsultassimilaresalaBDendondecambiensololas condicionesdelwhere. ParadefinirunaconsultapreparadaseinstanciaunobjetoPreparedStatementapartir delobjetoconnectionconlapartedelaconsultaquenovaacambiar. stmt=conexion.prepareStatement("select*fromclientewherecedula_cliente=?"); elsignodeinterrogacinpresenteenlaconsultaindicaqueesecamposeproveer masadelanteyesloquehacealaconsultadinmica.Yaenstmtseencuentraun PreparedStatementenelqueintervienelatablaclienteyqueentregaratodaslas columnas. Paradefinerelvalordelsignodeinterrogacinseusaunsetterquerecibecomo parmetrounnumeroenteroquerepresentalaposicindelsignodeinterrogacina completarenlaconsulta.sihayvarioscamposdesconocidosenlaconsultase enumerandesde1hastansegnellugardeocurrenciaenlaconsulta.Tambinrecibe comoparmetroelvalorquesevaaponerenlugardelsignodeinterrogacin.Como elcampoquesevaallenaresunStringovarcharenlaBDseusasetString.Asicomo elResultSettienelosmtodosgetXXX,elPreparedStatementtienelosmtodos setXXX. stmt.setString(1,TFcedula.getText()); LaconsultaseejecutaconexecuteQuery()yretornaelResultSetconelresultadodela consulta. resultado=stmt.executeQuery(); Ejemplo. Elsiguienteejemploesunvisualizadorde lasfacturasquehayahechounclienteen especial.Paralocualsediseolasiguiente interfaz. Enlainterfazseingresalaceduladel clienteysepresionaconsultar.Enese momentodebeaparecerenlalistatodas
JDBC/PreparedStatement 69

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

lasfacturasquehayahechoesecliente.Cuandoseescogelafacturadelalista,en JTextAreadebenaparecerlosproductosdedichafacturacomosemuestraenla figura.


EventodelBotnConsultar

public void actionPerformed(ActionEvent e) { if (Bconsultar==e.getSource()) { PreparedStatement Pstmt; ResultSet resultado;

PreparedStatementdonde seestablecelaconsultaSQL dinmica.Fjeseenelsignode interrogacinqueindicaque esevalorsedefinidodespus. Soloseestconsultadouna columnadelatablafactura

try { Pstmt=conexion.prepareStatement("select codigo_factura+ Seborranlos from factura+ elementosdel where cedula_cliente=?"); JComboBoxque pudieranestar Pstmt.setString(1, TFCedulaCliente.getText()); conanterioridad resultado=Pstmt.executeQuery(); Sedefineel primer(1)campo CBFacturas.removeAllItems(); incognitodela PreparedStatement while(resultado.next()==true) queesunStringcon { laceduladelcliente CBFacturas.addItem(resultado.getInt(1)); enelJTextField } } catch (SQLException e1) SerecorreelResultSetpor { mediodelmtodonext()yel e1.printStackTrace(); whileyseaadealJComboBox } laprimeracolumnadela } consultaqueeselcdigodela } facturaquealserautonumerico enlaBDsepuedeobtenercon getInt Paracumplirtodoslosrequerimientosdelejemploesnecesariohacer2consultas:una enelbotnconsultarquetienecomoobjetivollenarelJComboBoxconlosnmeros defacturasasociadosalclientedeseadoyotraquemuestrelosproductosdelafactura seleccionada de la lista y adems sean del cliente escrito en el JTextField. Para este ejemplosesiguelamismametodologadelanteriorqueesconectarlabasededatos enelprogramaprincipalyenviaralainterfazelobjetoConnectionconlaconexinala BD. Solo se muestran los eventos ActionPerformed del botn Consultar y el ItemStatechangedelJComboBox.

70 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

EventoItemStateChangedelJComboBox
public void itemStateChanged(ItemEvent e) { if(CBFacturas==e.getSource()) { PreparedStatement Pstmt; ResultSet resultado; try { Pstmt=conexion.prepareStatement("select codigo_prod, nombre_prod,+ cantidad,precio_prod,fecha_factura" + " from factura,item_factura,producto " + Estaconsultaesunjoinentre "where factura.codigo_factura+ factura,productoetem_factura =item_factura.codigo_fact and " + dondesenecesitasaberlosproductos "item_factura.codigo_producto+ quecomprounclienteenunafactura =producto.codigo_prod " + dada.Lacedulaylafacturasonlos "and factura.codigo_factura=? and + camposincognitos cedula_cliente=?"); Pstmt.setInt Pstmt.setString (1, (Integer)CBFacturas.getSelectedItem()); (2, TFCedulaCliente.getText()); Elnmerode lafacturaesel primervalor incognitoyes entero.Lacedula estadesegunday esunvarcharenla BD. Serecorreel resulSetconelwhile

TADatosFact.setText(""); Seejecutala resultado=Pstmt.executeQuery(); consulta. String cad=""; TADatosFact.setTabSize(10); cad="______________________________________" + "____________________________________\n" + "codigo | Nombre Prod\t| Cantidad\t| Precio\n" + "------------------------------------------------------------" + "------------------------------------------------------------\n" ; while(resultado.next()==true) {

TFFechaFact.setText(resultado.getDate("fecha_factura").toGMTString()); cad+=resultado.getString(1)+" "+resultado.getString(2)+"\t| "+ resultado.getInt(3)+"\t| "+resultado.getDouble(4)+"\n"; Seobtienen todaslascolumnas } delaconsulta.el cad+="_______________________________________" + numerodelgetteres "______________________"; deacuerdoconel TADatosFact.setText(cad); ordendelas Seaadelacadena columnasenla conlosdatosalJTextArea consultaselect. } catch(Exception e1){JOptionPane.showMessageDialog(null, getMessage());} } }

JDBC/PreparedStatement

71

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

ActualizandoLaBaseDeDatos
LaactualizacindelainformacindelaBDatravsdelaaplicacinJAVAsehacea travsdesentenciasSQLdeltipoinsert,updateydeletequeseenvanalaBDpor mediodeunobjetodetipoStatementounPreparedStatement.Comoestaclasede consultasnogeneraningnresultado,noseusaelmtodoexecuteQueryelcual retornaunResultSet.Envezdeeso,usaelmtodoexecuteUpdate()queesespecial paraejecutaractualizacionessobrelosdatos.executeUpdateretornaunenteroque indicacuantasfilasdentrodelaBDseafectaronconlaactualizacin. Paradaraconocerlaactualizacin,borradoycreacindefilassobreunatabla considreseelsiguienteejemplo. Ejemplo1. Diseeunainterfazquepermitacrearun nuevoclienteingresandolosdatosdel mismo. Elclientesecreacuandosepresionael botncrear. Siguiendolamismametodologadeejemplosanterioresdondelaconexinsehaceen elprogramaprincipalyseenvapormediodelconstructordelainterfaz,solose muestraeleventodelbotncrearqueesdondeserealizalaactualizacin.
Talycomoseaprendienelcapitulo public void actionPerformed(ActionEvent e) anterior,lacreacindeunnuevoregistropara { unatablasehaceatravsdeunaconsulta if (e.getSource()==BCrear) insert.Aqusehacelacreacinatravsdeun { PreparedStatementyporesoseponenlos PreparedStatement stmt; camposincognitosparallenarlosdespus. ResultSet resultado; try { stmt=conexion.prepareStatement("insert into cliente " + "(cedula_cliente,nombre_client,direccion_cliente," + Laactualizacinsehacea "ciudad_cliente,telefono_cliente) values (?,?,?,?,?)"); travsdelexecuteUpdate(). stmt.setString(1, TFCedula.getText()); stmt.setString(2, TFNombre.getText()); stmt.setString(3, TFDireccion.getText()); stmt.setString(4, TFcorreo.getText()); stmt.setString(5, TFTelefono.getText()); stmt.executeUpdate(); Aqusellenanloscampos incognitosdelaconsultapuestaenel PreparedStatement,elordenquese usaenlossettersesdeacuerdocomo sedistribuyeronenlaconsulta:
cedula_cliente,nombre_client,direccion_cliente,".

fijeseenelnumeroqueacompaaal setterparadeterminardichoorden

} catch (SQLException e1) { JOptionPane.showMessageDialog(null, e1.getMessage()); }

72 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

ResaltadoenlafiguraestaelclientecreadoenlaBDmediantelainterfazenJAVA. Ejemplo2. Sedeseacrearunainterfazque permitaactualizaroinclusoborrarun clientedelatablacliente.Lainterfaz creadaeslasiguiente: Serecorrenlosclientesconelbotn >>>>yparaborrarelregistroactualse presionaborraryparaactualizaralgn cambioquesehagasobreloscampos dedatossepresionaelbotn actualizar. PararecorrerlosclientesestossecarganenunResultSetenelconstructordela interfazquesemuestraacontinuacin: ConstructorInterfaz EnesteResultSetsealmacenanlos clientesdelaBD private ResultSet resultado; public InterfazModificarCliente(Connection conexion) { Aqusehaceuna super(); consultasimplea initialize(); travsdeunStatement this.conexion=conexion; cuyoresultadose this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); almacenaenel ResultSet Statement stmt; anteriormente String consultaSQL; declarado.Laconsulta sacatodosloscampos try { yfilasdelatabla stmt=conexion.createStatement(); cliente. resultado=stmt.executeQuery("select * from cliente"); } catch (SQLException e1) { JOptionPane.showMessageDialog(null, e1.getMessage()); } }

ActualizandoLaBaseDeDatos/PreparedStatement

73

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

YaconlosregistrosdelatablaenelResultSet,conelbotn>>>>>,serecorrenlas filas.Paraesoseusaelmtodonext()delResultSetyseobtienenloscamposdelafila actualqueseponenenlosJTextFields. Eventobotn>>>>>. public void actionPerformed(ActionEvent e) Serecorreconnext()el { ResultSet.Esderecordarqueen if (e.getSource()==BotonSig) { elconstructorsellenoconlos try { datosdelatablacliente. if (resultado.next()==true) { TFCedula.setText (resultado.getString(1)); TFNombre.setText (resultado.getString(2)); TFDireccion.setText (resultado.getString(3)); TFcorreo.setText (resultado.getString(4)); TFTelefono.setText (resultado.getString(5)); } else Sesacanloscamposdela resultado.beforeFirst(); filaactualenelordenenel } catch (SQLException e1) { queestndefinidosenlaBD. e1.printStackTrace(); } Estosseponenenel } JTextFieldcorrespondiente. paraqueseansusceptiblesa modificaciones ParaactualizarsetomalacedulaqueesteenJTextFielddecedulaysehaceun Updatesobreelclientecondichacedula.Enelupdateseactualizanlosotrosdatos comoelnombre,telfonoydemsporsielusuariocambioalgunodeellos. Eventobotnactualizar. PreparedStatementquerecibelasentenciaSQL if (BotonActual==e.getSource()) deconsultadondeseactualizantodoslos camposdeunclienteconcedula=?hayque {
PreparedStatement stmt; String consultaSQL; try { stmt=conexion.prepareStatement("update cliente set nombre_client=?," + "direccion_cliente=?," + "ciudad_cliente=?, " + "telefono_cliente=?" + where cedula_cliente=?"); stmt.setString stmt.setString stmt.setString stmt.setString stmt.setString (1, TFNombre.getText()); (2, TFDireccion.getText()); (3, TFcorreo.getText()); (4, TFTelefono.getText()); (5, TFCedula.getText()); recordarqueloscamposincognitossedefinen despus

SeEjecutalaordenSQL stmt.executeUpdate(); } catch (SQLException e1) { JOptionPane.showMessageDialog(null, e1.getMessage()); }

Valoresincognitosquese completanenelobjetostmt. Nteseelordendelossettersyel ordenenlascolumnasdela consulta. }

74 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

ElprocesodeborradoesfamiliaryaquesehaceunDELETEsobreelregistroquetenga comocedulalacedulaquemuestreelJTextField.Hayquerecordarqueesacedulase obtienerecorriendolosclientesconelbotn>>>>. Eventoborrar if (BotonBorrar==e.getSource()) { PreparedStatement stmt; String consultaSQL; try { int opc=JOptionPane.showConfirmDialog(null, "desea borrar el registro"); if (opc==JOptionPane.YES_OPTION) { stmt=conexion.prepareStatement("delete from cliente where cedula_cliente=?"); stmt.setString(1, TFCedula.getText()); stmt.executeUpdate(); SentenciaSQLconel } DELETEsobrelacedula=?. Sellenaelcampo El?sellenadespus. } incognitoyseejecuta laactualizacin. catch (SQLException e1) { JOptionPane.showMessageDialog(null, e1.getMessage()); } }

ActualizandoLaBaseDeDatos/PreparedStatement

75

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

JTable
Elcomponenteidealparamostrarlosresultadosdeunaconsultaqueretornevarias filasesunJTable.UnJTableesuncomponenteconlaaparienciadeunagrilladeExcel quepermitevisualizardatosqueseandelaformafilacolumnacomomatricesoenel casodeinters,elresultadodeunaconsulta.

UnJTabledebeserusadoenconjuntoconunJScrollAreaparapoderexplorartodaslas filasycolumnasdelJTableconlosScrollBarobarrasdedesplazamientodelmismo. LosconstructoresmstilesdelJTableson: JTable(intnumFilas,intnumCols)recibeelnumerodefilasycolumnasconlas queiniciar. JTable(Object[][]Datos,Object[]nombreColumnas):Recibeunamatrizdedatos yunvectorconelnombredelascolumnas.Esdeaclararqueelnmerode columnasdelamatrizDatosdebeserelmismoqueloselementosdelvector nombreColumnas. JTable(TableModeldm):recibecomoparmetrounobjetoTableModel.La InterfazTableModeldefinelaaparienciadeunJTableencuantoalnumerode columnas,losdatosdelJTable.CuandosedeseanaadirdatosalJTablese debehaceratravsdesuTableModelinterno.Estainterfazseestudiamsa fondoacontinuacin.

76 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

Ejemplos: UnJTablede5x5. Instanciacindeun public static void main(String[] args) JTablede5x5 { JTable tabla=new JTable(5,5); ScrollPanequerecibeel JScrollPane panel=new JScrollPane(tabla); JTable.Fjesequeenla creacindelJScrollBarse defineelcomponenteque JOptionPane.showMessageDialog(null,panel, vaacontener. "JTable", JOptionPane.PLAIN_MESSAGE); } SeusaunshowMessageDialogparamostrarelJScrollPanecon elJTableadentro.ElshowMessageDialogrecibeelpanel,el mensajeyeltipodelmensaje. elresultadodelosiguienteesestaventana. Paradefinirelnombredelascolumnasydelosdatossepuedeusarelsegundo constructorqueseexplico.Enelsiguienteejemploseindicacomousarlo. EstaesunamatrizdeString.Un vectorsepuedecrearencerrandosus public static void main(String[] args) elementosdentrodecorchetesylos { valoresseparadosporcomas.Una String [][]valores={{"camilo","juan","pepe"}, matrizesunpuesvariosarreglos {"lucas","esteban","felipe"}, separadosporcoma. {"coco","canela","fulanito"}}; Arreglode String []nombreCols={"personas A","Personas B","Personas C"}; Stringdonde estnlosnombres Seinstanciael delacolumnasde JTableconel JTable tabla=new JTable(valores,nombreCols); latabla vectorylamatriz JScrollPane panel=new JScrollPane(tabla); de datos JOptionPane.showMessageDialog(null,panel, "JTable",JOptionPane.PLAIN_MESSAGE); }

ActualizandoLaBaseDeDatos/JTable

77

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Elresultadodeestefragmentodecdigoeseste:

Sepuedeobservarlamatrizdevaloresyelnombredelascolumnas. ElJTabletienelosmtodossetValuesAt(Objectobj,intfila,intcolumna)querecibe comoparmetroelobjetoylaposicindondevaaquedarenelJTable.Ttambin tieneelmtodogetValuesAt(intfila,intcolumna)queretornaelvaloralmacenadoen unafilayenunacolumna.Lafilasseenumerandesdecerosintenerencuentalafila detitulo.

DefaultTableModel
Losconstructoresanteriorestienenelinconvenientequeesnecesariotenertodoslos datosenelmomentodelainstanciacin.Enmuchasocasionesesnecesarioaadiro hastaeliminarfilasy/ocolumnasdelJTableentiempodeejecucinloquehaceque dichasimplementacionesseanmuylimitadas.Cuandoesnecesariorealizardichas tareassobreJTablesehacensobresupropiedadTableModel.Comosedijo anteriormente,elTableModeleselquedefinecomosonycomoestnorganizadoslos datosdentrodelJTable. YaqueunTableModelesunobjetoconmuchaslimitacionesseacostumbraautilizar unobjetodeltipoDefaultTableModelelcualtienemtodosparaaadir,eliminar columnas,obtenerelnmerodefilasycolumnasdelatablaydemsutilidades. LosmtodosmsrepresentativosdeunDefaultTableModelson: getRowCount():retornaelnumerodefilasdelDefaultTableModel. getColCount():retornaelnumerodecolumnas. addColumn(ObjectnombreColumna):recibecomoparmetrounobjetoconel nombredelanuevacolumna. addRow(Object[]valoresFila):recibeunvectordevaloresyloaadecomo nuevafila.Elnmerodeelementosdelvectordebeserigualaldenmerode columnas. removeRow(intnumFila):eliminalafilaenlaposicinnumFiladel DefaultTableModel. ParausarelDefaultTableModelenelJTableseusaelmtodosetModeldelJTableque recibecomoparmetroelDefaultTableModel.Cualquiercambioquesehagaluego sobreelDefaultTableModelsereflejaenlatabla. ParaobtenerelTableModeldeunJTableseusasetModel().
78 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

publicstaticvoidmain(String[]args) { //DefaultTableModeltm=newDefaultTableModel(); DefaultTableModeltmm=newDefaultTableModel(); JTabletabla=newJTable(); tabla.setModel(tmm); JScrollPanepanel=newJScrollPane(tabla); 1.Seaadenlascolumnas tmm.addColumn("Cedula"); conaddColumn tmm.addColumn("Nombre"); tmm.addColumn("Telefono"); String[]datos={"1234","Camilo","7453321"}; tmm.addRow(datos); 2.secreaelvectorde treselementosquesonel String[]datos1={"42442","Juan","7432123"}; numerodecolumnasyse tmm.addRow(datos1); aadenalJTableatravsdel addRowquerecibeelvector. String[]datos2={"6464","Gladys","7389876"}; tmm.addRow(datos2); JOptionPane.showMessageDialog(null,panel, "JTable",JOptionPane.PLAIN_MESSAGE); JOptionPane.showMessageDialog(null, "Hay"+tmm.getColumnCount()+"Columnas\n"+ "Hay"+tmm.getRowCount()+"Filas"); CongetRowCountse obtieneelnumerodefilasy congetColumnCountel 3.Seborralasegundafila nuemro de columnas delJTable tmm.removeRow(1); JOptionPane.showMessageDialog(null,panel, "JTable",JOptionPane.PLAIN_MESSAGE); JOptionPane.showMessageDialog(null, "Hay"+tmm.getColumnCount()+"Columnas\n"+ "Hay"+tmm.getRowCount()+"Filas"); }

Elsiguienteejemplomuestraelusodelosmtodosmsimportantesdel DefaultTableModel.

ActualizandoLaBaseDeDatos/JTable

79

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Estassonlasventanasquesegenerandelcdigoanterior. 1. secreanlascolumnascon addColumn 2. Seaadenlosdatoscon addRow

3. Seborralafila1(juan)con removeRow

MostrarunResultSetenunJTable
SabiendoyacomosemanejaunJTableycmosacartodalainformacindelResultSetconel ResultMetaDatasepresentaunejemplodeaplicacindondesemuestraelresultadodeuna consultaenunJTable.

Elsiguienteejemploesunvisualizadordelasfacturasquehayahechounclienteen especial.Paralocualsediseolasiguienteinterfaz. Enlainterfazseingresalaceduladelclienteysepresionaconsultar.Enesemomento debeaparecerenlalistatodaslasfacturasquehayahechoesecliente.Cuandose escogelafacturadelalista,enJTextAreadebenaparecerlosproductosdedicha facturacomosemuestraenlafigura.


Esteesunejemployaestudiado.Laideaesmejorarlainterfazdeesta: Aesta

80 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

DondelostemdelafacturanosemuestrenenunJTextAreasinoenunJTable. LoscambiosdeesteejemploestneneleventoItemStateChangeddelJComboBoxque semuestraacontinuacin: publicvoiditemStateChanged(ItemEvente) { Consultaparaobtenerlosdatosseleccionadosque if(CBFacturas==e.getSource()) sonelcdigo,nombre,preciodelproducto,lafecha { delafactura,lacantidadquesecomprdel PreparedStatementPstmt; producto.Enelwhereestlafacturaseleccionaday ResultSetresultado; elclientedelJTextfieldyestoseponecomo incognitoparallenardespus try { Pstmt=conexion.prepareStatement ("selectcodigo_prod,nombre_prod,"+ "cantidad,precio_prod,fecha_factura"+ "fromfactura,item_factura,producto"+ "wherefactura.codigo_factura=item_factura.codigo_fact+ and"+ factura.codigo_producto=producto.codigo_prod"+ andfactura.codigo_factura=?andcedula_cliente=?"); Verpgina78 Sellenanloscampos pararecordarPstmt.setInt(1,(Integer)CBFacturas.getSelectedItem()); incognitosdelnumero los Pstmt.setString(2,TFCedulaCliente.getText()); delafacturaylacedula constructoresresultado=Pstmt.executeQuery(); del cliente. del TableModel Secreaun Stringtitulos[]={"Codigo","Nombre","Cantidad","Precio"}; TableModelconlos DefaultTableModeltm=newDefaultTableModel(titulos,0); ttulosdelas Elarreglo columnasdefinidosen esde ObjectdatosFila[]=newObject[4]; elarreglodeString tamao4 Arreglo quesellena tituloy0filas. porque conloselementosde son4 while(resultado.next()==true) una filadelResultSet. columnas { enlatabla TFFechaFact.setText(resultado.getDate(5).toGMTString()); datosFila[0]=resultado.getString(1); Sellenaenelvectorloselementos datosFila[1]=resultado.getString(2); Yaconlos delResultSetenelordendelos datosFila[2]=resultado.getInt(3); datosenel ttulosdelatabla.En[0]valaprimera datosFila[3]=resultado.getDouble(4); TableModel columnadelResultSet,quesegnla tm.addRow(datosFila); estesepone consultaescdigo_prod,en[1]va Seaadeel enelJTable } nombre_prodyasisucesivamente. vectorllenoal TablaFactura.setModel(tm); TableModely } sesigueconel whileconla catch(SQLExceptione1) otrafila { JOptionPane.showMessageDialog(null,e1.getMessage()); } }
} ActualizandoLaBaseDeDatos/JTable 81

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

YaquemostrarelresultadodeunaconsultaenunJTableestancomn,acontinuacin semuestraunaclasequeheredandotodaslascaractersticasdeunJTableyconun ResultSetcomoatributo,lomuestrasegnlosdeseosdelusuario.

82 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

TipoDeDatoBLOB
UnodelostiposdedatosenSQLeseldenominadoBLOB(BinaryLargeObject).Eneste tipodedatosealmacenalainformacindemanerabinariaporloquesepuedeusar paraguardarcualquierclasedecontenidocomopuedeserimagen,videooaudioo texto,enfin,cualquierclasedearchivo. HaytresclasesdeBLOBqueseclasificansegnlacapacidadmximaquesoportan. TinyTextyTinyBlob:Columnaconunalongitudmximade255caracteres. BlobyText:Camponomayora65535byteso65KB MediumBlobyMediumTextCamponomayora16.777.215(16MB)bytes LongBlobyLongTextCamponomayora4.294.967.295bytes(4GB).Hayque tenerencuentaquedebidoalosprotocolosdecomunicacinlospaquetes puedentenerunmximode16Mb.

LeyendounBLOBmediantelaaplicacinJAVA

ParaleerdesdelaaplicacinJAVAunblobseusaelmtodogetBlob()delResultSet.El destinofinaldelosbytesledosdependedelanaturalezadelosmismos.Sielblob contenaunaimagen,seesperaqueestasemuestreenalgunaparte. EltipodedatoBlobSQLserepresentamediantelainterfazBlobenJAVA.Esteobjeto estdefinidoenelpaquetejava.sql. Losmtodosmsimportantesdeestainterfazson: getBytes(intinicio,intfin):retornaunarreglodebytesquecontienelosdatos delblobdesdeelparmetroiniciohastaelparmetrofin. lentgh():retornaunlongconeltamaoenbytesdelcampoblob.

Comounblobesuncampoquecontieneunarreglodebytes,tambinsepuedeleer delResultSetconelparmetrogetBytes()envezquecongetBlob().Estemetodo retornaunarreglodebytesqueeselquecontienelainformacindelBlobalmacenado enlaBD Elsiguienteejemplomodificalainterfazdebuscarclienteanteriormenteexplicaday aadelaposibilidaddeverlafotodelclientesiestaestenlabasededatos.Esde aclararqueesnecesariomodificarlatablaclienteyaadirleuncampoBlob.

TipoDeDatoBLOB/LeyendounBLOBmediantelaaplicacinJAVA

83

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Estaeslanuevainterfaz. Eventoclicdelbotnbuscar. PreparedStatement stmt; ResultSet resultado; String consultaSQL; Consultaparabuscarel clienteporcedula. try { stmt=conexion.prepareStatement("select * from cliente + where cedula_cliente=?"); stmt.setString(1, TFcedula.getText()); Sellenaelcampoincognito resultado=stmt.executeQuery(); Se ejecutalasentencia Setomanlosvaloresde if (resultado.next()==true) lascolumnasdelafila { TFNombre.setText(resultado.getString2)); resultantesegnel TFTelefono.setText(resultado.getString3)); ordenenqueestn Sifotoes TFDireccion.setText(resultado.getString(4)); definidosenlabasede diferentede TFcorreo.setText(resultado.getString(5)); datos nulles porqueenesa Blob foto=resultado.getBlob(6); Seleeelcampobloben filasihaba unavariabledetipoBlob unafoto if (foto!=null) { byte[]datosImagen=foto.getBytes(1, (int)foto.length()); ImageIcon imagen=new ImageIcon(datosImagen); panelFoto.setIcon(imagen.getImage()); } SeobtienenlosbytesdelBlob Conesosbytessecrea conelmtodogetBytesdesde unImageIconysepone elprincipiocon1yhastaelfin enunJLabelconsetIcon length().
84 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

else{ JOptionPane.showMessageDialog(null, "No existe el cliente"); } } catch (SQLException e1) { JOptionPane.showMessageDialog(null, e1.getMessage()); }

EscribiendounBLOBalaBDmediantelaaplicacinJAVA
ComosedijoanteriormenteunBlobbsicamentesonunconjuntodebytesquejuntos formanalgunaclasedecontenido.Siguiendoesaidea,cuandosenecesitealmacenar undatobinarioalabasededatoshayqueencontrarlarepresentacinbinariade dichosdatosyesoesloqueseescribeenlabasededatos. ParaescribirdatosbinariosalabasededatosseusaelmtodosetBytes(ndice,valor) delPreparedStatement.Esnuestratareaentoncesencontrarlarepresentacinbinaria deldatoaalmacenar.Sidichainformacinestenunarchivoesnecesariousarun flujodeentradadedatostalcomoInputStreamoFileInputStreamparaleerlosbytes delarchivo. FileInputStreameselmedioporelcualsepuedeleerlosdatosdearchivosbinarios talescomoimgenes,videooaudio.Estosbytessepuedenalmacenarenunvector parasuposteriormanipulacinoloqueesdenuestrointers,enviaralaBD.El constructordelFileInputStreamrecibecomoparmetrounacadenaconrutadel archivoaleerounobjetoFilequelorepresente.Losmtodosmasimportantesdel FileInputStreamson: read(byte[]b):recibeunarreglobdebytedetamaonylollenaconnbytes desdeelarchivo. read(byte[]b,intoff,intlen):leedelarchivolenbytesempezandodesdeel byteoffyalmacenaesainformacionenelvectorb.

CuandosedesealeerunarchivodetextoesmejorusarunFileReadero BufferedReaderqueretornasonarreglosdecaracteresenvezquedebytes. ElsiguienteejemplomodificalainterfazdecrearClienteparapermitirescogeruna imagenalmacenadaenelcomputadoryguardarlaenlaBDenelcampofoto_cliente delatablacliente.

TipoDeDatoBLOB/EscribiendounBLOBalaBDmediantelaaplicacinJAVA

85

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Interfazcrearcliente Elfuncionamientodelainterfazestdivididoendospartes.Primeroencargarlafoto desdeunarchivoyluegoenelbotncrearguardartodoslosdatosjuntoconlafotoa labasededatos. EventodelbotncargarFoto. ObjetoFiledondesealmacenalareferencia alarchivoseleccionadoconelJFileChooser

if(BotonCargar==e.getSource()) Cuadrodedialogoparaexplorar { elPCenbuscadelaimagen FilearchivoFoto; JFileChooserexplorer=newJFileChooser(); Seabreelcuadrodedilogoparabuscarel archivo.Esteretornaunintdependiendo intopcion=explorer.showOpenDialog(this); delsiseaceptaocancelalaoperacin.Si imagen=null; seaceptaretorna JFileChooser.APPROVE_OPTION.estose if(opcion==JFileChooser.APPROVE_OPTION) puedecompobarenunif { archivoFoto=explorer.getSelectedFile(); Aquseencuentrael imagen=newImageIcon(archivoFoto.getAbsolutePath()); tamaoenbytesdel PFotoCliente.setIcon(imagen.getImage()); archivoconlength() ysecreaunarreglo try{//seinstanciaelFileInputStreamconelFiledelJFileChhoser debytesdeese FileInputStreambyteImagen=newFileInputStream(archivoFoto); tamaoqueesledo conreaddel longtam=archivoFoto.length(); FileInputStream datosImagen=newbyte[(int)tam1]; byteImagen.read(datosImagen); Seobtieneelarchivo seleccionadocon } catch(FileNotFoundExceptione1){e1.printStackTrace();} getSelectedFileque retornaunFile.Conla catch(IOExceptione1){e1.printStackTrace();} rutadeeseFile } (getAbsolutePath)se } creaunImageIcony ExcepcionesgeneradasporelFileInputStream
luegoseponeenun JLabelconsetIcon

86 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

LuegodetenerlosbytesdelaimagenenelvectordatosImagenqueesunatributo globalatodalaclase,enelbotncrearseaadenlosnuevosdatos.Tambincomo atributodelainterfazestaelImageIconimagenqueesdondeestalaimagen seleccionada. Eventocrear. Lanicadiferenciadeesteejemploconel public void actionPerformed(ActionEvent e) anterioresqueaquyasehacereferenciaala { fotodelclienteenelinsertjuntoconsucampo if (e.getSource()==BCrear) { incognito. PreparedStatement stmt; ResultSet resultado; try { stmt=conexion.prepareStatement("insert into cliente " + "(cedula_cliente,nombre_client,direccion_cliente," + "ciudad_cliente,telefono_cliente, foto_cliente) values + (?,?,?,?,?,?)"); Sellenanloscamposincognitosdellos datostipotexto. stmt.setString(1, TFCedula.getText()); stmt.setString(2, TFNombre.getText()); stmt.setString(3, TFDireccion.getText()); stmt.setString(4, TFcorreo.getText()); Losdatosdelaimagenpreviamente stmt.setString(5, TFTelefono.getText()); obtenidosdelStreamenelarreglode SilaimagenseescogiconelJFileChooser el bytesseenvanalaBDatravsdel mtodosetBytesdelPreparedStatement. ImageIconimagenesdiferentedenull. Lafotoestadesextaenlaconsulta if (imagen!=null) stmt.setBytes(6, datosImagen); else stmt.setBytes(6, null); Sinoseescoginadase envaunnullalaBD. stmt.executeUpdate(); Serealizalaactualizacincon executeUpdatedel PreparedStatement } catch (SQLException e1) { JOptionPane.showMessageDialog(null, e1.getMessage()); } } Alterminarlatransaccin,enlabasededatoshayunacopiadelaimagen seleccionadaconelJFileChooser.Estemismoprocedimientosepuedehacersilos datossondeaudioovideoocualquiertipodecontenido.

TipoDeDatoBLOB/EscribiendounBLOBalaBDmediantelaaplicacinJAVA

87

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

RESULTSET
Comosevioenapartesanteriores,elResultSetesunainterfazenlacualunobjeto StatementoPreparedStatementalmacenaelresultadodeunaconsultadetipoSelect. TambinseaprendiqueelobjetodetipoResultSetpermiterecorrerdeprincipioafin elresultadodedichaconsultaconelmtodonext()ascomoobtenerelvalordeuna columnaconlosmtodosgetXXXX(numeroonombredelacolumna). OtracaractersticanonombradadelResultSetesqueelquedaconectadoalaBasede datosdirectamente,loqueindicaquecualquiercambioquesehagaaunafiladel ResultSetseleesthaciendoalabasededatos.Esporesoqueescostumbrequeya conlosdatosenelResultSetestosseactualicenpormediodelmismoResultSetyno pormediodesentenciasSQLUpdateoDelete. EnmuchasocasionessepuedenecesitarrecorrerelResulSetdemaneraarbitrariasea haciadeatrsparaadelanteoescogercualquierfilaaleatoriamente.

PropiedadesdelResultSet.
ElResultSettienedospropiedadesimportantesqueson: resulsetTypequedefineeltipodelResultSetytienetresvaloresposiblequeson: TYPE_FORWARD_ONLY:Esteeselvalorpordefectodelapropiedadeindica queelResultSetserecorredeprincipioafin. TYPE_SCROLL_INSENSITIVE:EstevalordelapropiedadpermitealResultSet recorrenaleatoriamentelasfilasdelmismo.LaetiquetadeINSENSITIVEindica queelenResultSetnosevernreflejadosloscambiosquesehaganenlabase dedatosporotrosusuariosoaplicacionesenelmomentodeestarusndolo. TYPE_SCROLL_SENSITIVE:Tambinpermiteaccesodinmicoalasfilasdel ResultSetconlaadicinquecualquiercambioporunterceroalabasededatos severeflejadoenelResultSet. LaotrapropiedaddelResultSetesresulSetConcurrencyeindicasilaBDsepuede actualizaronoatravsdelResultSet.Estapropiedadsetrataafondomsadelante. LadefinicindeltipodeResultSetsehaceenelmomentoquesecreaelStatemento elPreparedStatementquevaadarorigenalResultSetpormediodelExecuteQuery. RecurdesequeelStatementsecreaatravsdemtodocreateStatementdelobjeto Connection. ElmtodocreateStatementoPreparedStatementdelobjetoconexinseagregandos nuevosparmetrosquesoneltipoylaconcurrenciadelResultSet.Estosparametros sonenteroscuyovalorsepuedeaveriguarusandounasconstantesqueestndefinidas dentrodelaclaseResultSet.Elnombredelasconstanteseselqueseexpreso anteriormentecomoTYPE_FORWARD_ONLY,TYPE_SCROLL_INSENSITIVEy TYPE_SCROLL_SENSITIVE.
88 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

lasintaxisparaloanterioresentonces: ParaunStatementseria Stmt=conexin.createStatement(tipo,concurrencia) YparaunPreparedStatementserentonces: Stmt=conexin.preparedStatement(consulta,tipo,concurrencia) Dondeconsultaeslacadenaqueseponeconloscamposincognitosoconsignode interrogacion. Acontinuacinunejemplo: consulta="select*fromempleadowherecedula_emp=?"; stmt=conexion.prepareStatement(consulta, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); stmt.setString(1,TFCedulaEmp.getText()); resultado=stmt.executeQuery(); EnelmomentodelacreacindelPreparedStatementsedefinequeelResultSetqueel objetostmtconelmtodoExectuteUpdateretornaravaaserdeltipo TYPE_SCROLL_INSENSITIVEyquecualquiercambioquesehagasobreelResultSet quedarareflejadoenlabasededatos.Loanteriorsehacemediantelasconstantes ResultSet.TYPE_SCROLL_INSENSITIVEyResultSet.CONCUR_UPDATABLErespectivamente. ElResultSetqueretornaelmtodoexecuteQuery()sepuederecorreraleatoriamente sinproblemas.ElprocedimientoanteriorcapacitaalResultSetparapoderusarlos siguientesmtodospararecorrersusfilas: previous():sedevuelveunafila,esteeselinversodenext,queavanzaunafila. first()vuelvealaprimerafila last()vaalaltimafila. Tambinhayotrosmtodosutilescomoson: getRow():retornaelnumerodelafilaalaqueapuntaelResultSet.Recuerde queesecursorsemuevesegnlosmtodosprevious(),next(),last()ofirst(). afterLast():ubicaelcursordespusdelaltimafila. beforeFirst():ubicaelcursorantesdelaprimerafila. EsdeanotarquesinosecambiaeltipodelResultSet,elusodeestosmtodosgenera excepcionesqueadviertenqueelResultSetsolosepuederecorrerhaciaadelante.
RESULTSET/PropiedadesdelResultSet. 89

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Enocasionesesnecesarioconocerlainformacindelresultadodelaconsulta almacenadaenelResultSetcomocuantascolumnasretornoycomosellamandichas columnas.Estainformacinsepuededeterminarusandolainterfaz ResultSetMetaDataqueesdadaporpartedelResultSetatravsdelmtodo getMetaData().Losmtodosmsrepresentativosdeestainterfazson: getColumnCount():retornaelnumerodecolumnasquehayenelResultSet productodelaconsulta. getColumnLabel(intnumColumna):retornaunStringconelnombredela columnaenlaposicinnumColumna. Ejemplo. Sedeseacrearunexploradordeclienteselcualpermitarecorrerlosclienteshacia adelanteyhaciaatras,actualizary/oborrarelclienteactual. Esteejemployaseestudioenlapagina73ylaideaesmejorarlopermitiendorecorrer losclienteshaciaadelanteyhaciaatrsyademsmostrandolafoto. Lainterfazeslasiguiente:

Seactualizayseborraelregistroactual,tambinsepuedecambiarlafotodelregistro actual. ParapoderrecorrerelResultSetdemaneraaleatoriasedebecrearelStatemento PreparedStatementconlascontantesdefinidasenlapgina88dondeseexplicacon detenimientoelResultSet. ComosedeseausarelmismoResultSetenelbotndeadelanteyeneldeatrsse declaraunResultSetglobalalaclaseyseinicializaenelconstructordelainterfaz.

90 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

Fragmentodecdigodelconstructordelainterfaz try { stmt=conexion.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); resultado=stmt.executeQuery("select * from cliente"); } catch (SQLException e1) { JOptionPane.showMessageDialog(null, e1.getMessage()); } Talycomosehizoenelejemplodelapagina73enelconstructordelainterfazse inicializaelResultSetconlosclientesparapoderlorecorrerconlosbotones. SeusaunStatementporqueesunaconsultaestticaquenodependedevalores externosyenelcreateStatementseusalaconstantedefinidadentrodelaclase ResultSetResultSet.TYPE_SCROLL_SENSITIVEparapoderrecorrerelResultSet alaeatoriamenteyseusaResultSet.CONCUR_UPDATABLEparapoderactualizarla basededatosatravsdelResultSet. EventoclicBotonAdelante. Seavanzahaciaadelante Seobtienenlas if (e.getSource()==BotonSig) comosiempreenel columnasdelafila { ResultSet.Retornatrue actualdelResultSet try { siesunafilavalida juntoconelarreglode System.out.print("hola"); bytesquerepresenta if (resultado.next()==true) losdatosdelafotocon { getBytes.(verpag Sielarreglode TFCedula.setText(resultado.getString(1)); TFNombre.setText(resultado.getString(2)); bytesledocon TFDireccion.setText(resultado.getString(3)); getBytesesnulles TFcorreo.setText(resultado.getString(4)); porquenohay TFTelefono.setText(resultado.getString(5)); fotoenlaBD.En datosImage=resultado.getBytes(6); esecasosecrea } unImageIconcon else Sinext()retornafalso esporquealcanzounafila unafoto resultado.first(); invalida.Sedevuelvealprincipioconfirst() cualquiera.Sihay foto,secreaconel arreglodebytes ImageIcon im=null; datosImage. if (datosImage!=null) im=new ImageIcon(datosImage); else im=new ImageIcon("thundercats1024x7686nm.jpg"); SeaadelaimagendelImageIcon al FotoCliente.setImagen(im.getImage()); panelFotoFotoCliente. } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); JOptionPane.showMessageDialog(null, e1.getMessage()); }
}

RESULTSET/PropiedadesdelResultSet.

91

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Paraqueelrecorridoparezcacircular,cuandosellegaalfinalconnext()sevuelveal principioconfirst().EstoesgraciasalusoTYPE_SCROLL_SENSITIVEenlacreaciondel Statement. Clicdelbotnatrs. if (e.getSource()==BotonSig) { try { System.out.print("hola"); if (resultado.previous()==true) { TFCedula.setText(resultado.getString(1)); Lanicadiferencia TFNombre.setText(resultado.getString(2)); conelbotn TFDireccion.setText(resultado.getString(3)); siguienteeseluso TFcorreo.setText(resultado.getString(4)); deprevious()envez TFTelefono.setText(resultado.getString(5)); denext()ydelast() datosImage=resultado.getBytes(6); envezdefirst() } else resultado.last(); ImageIcon im=null; if (datosImage!=null) im=new ImageIcon(datosImage); else im=new ImageIcon("thundercats1024x7686nm.jpg"); FotoCliente.setImagen(im.getImage()); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); JOptionPane.showMessageDialog(null, e1.getMessage()); } } Yendohaciaatrssellegaalprimerregistrodelaconsulta.sisedeseairmasatrs, previous()retornarafalse.Enesemomentoseusalast()parairalltimoregistrodel ResultSetypoderotravezempezarlasecuenciadefinprincipio. OtraposibilidadquetieneelResultSetesdeactualizarlabasededatossintenerque hacerunaconsultaSQLdirectasobrelamisma.Parapoderactualizarlabasededatos atravsdelResultSetesnecesariocrearelStatementquegeneraelResultSetconla constanteCONCUR_UPDATABLEdefinidaenlaclaseResultSet.Siseestablecelo anterior,elactualizarlaBDatravsdelResultSetproduceexcepciones. ParaborrarunafiladelResultSetseusaelmtododeleteRow()queborralafilaactual delResultSet.

92 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

EventobotnBorrar. if (BotonBorrar==e.getSource()) { PreparedStatement stmt; String consultaSQL; try { //se pregunta si se quiere borrar el usuario. int opc=JOptionPane.showConfirmDialog(null, "desea borrar el registro"); Seborralafilaactual.Estoseralo if (opc==JOptionPane.YES_OPTION) mismoquehacer: { Stmt=conexin.prepareStatment( resultado.deleteRow(); deletefromclientewhere } cedula_cliente=?); } Stmt.setText(1,TFCedula.getText) catch (Exception e1) Stmt.executeUpdate() { // TODO Auto-generated catch block JOptionPane.showMessageDialog(null, e1.getMessage()); } } deleteRow()realizaunaactualizacinsobrelabasededatospormediodeuna sentenciadeleteinternamente. PararealizarlaactualizacinpormediodelResultSetseusalosmtodos UpdateXXX(intnumCol,Objectvalor)dondeXXXeseltipodedatodelacolumnaa actualizar,numColeselnumerodelacolumnadentrodelResultSetqueseva actualizaryvaloresdatodeactualizacinquedebeserelmismotipodedatoqueXXX. UpdateXXX()actualizalascolumnasdelafilaactual.Yaactualizadaslascolumnasse utilizaelmtodoUpdateRow()queeselquefiniquitalaactualizacindelosdatos sobrelabasededatos. Losmtodosdeactualizacinson: Tipodedato Metodo String UpdateString(..) double UpdateDouble() Byte[] UpdateBytes() Int UpdateInt() Deestatablasepuedeinferirelnombredelosotrosmtodos.

RESULTSET/PropiedadesdelResultSet.

93

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

EventoActualizar Seactualizanlas if (BotonActual==e.getSource()) columnasenel { ResultSet.Elnmero PreparedStatement stmt; resaltado String consultaSQL; correspondeala //actualizacion del registro actual. el que se este viendo en la ventana posicindelcampoa //gracias al recorrido de los botones atras y adelante actualizarenel try { ResultSet.Siemprese resultado.updateString(1, TFCedula.getText()); actualizalafilaactual. resultado.updateString(2, TFNombre.getText()); Tambinseusael resultado.updateString(4, TFTelefono.getText()); arreglodebytespor resultado.updateString(3, TFDireccion.getText()); siestehacambiado resultado.updateString(5, TFcorreo.getText()); alcambiarlafotodel cliente resultado.updateBytes(6, datosImage); Yaactualizadaslascolumnas,se resultado.updateRow(); envalaactualizacinalabase dedatospormediode UpdateRow } catch (Exception e1) { // TODO Auto-generated catch block JOptionPane.showMessageDialog(null, e1.getMessage()); } } EstaactualizacineslamismaquesehaceatravsdelasentenciaUpdatesimilarala hechaenejemplodelapgina74. HayquerecordarqueelusodeestasentenciaespermitidograciasaqueelStatement secreconlaconstanteCONCURR_UPDATEcomoparmetrodecreateStatemt.Sise usaraCONCURR_READONLYnosepodrausarUpdateRowdelResultSet,esdecir,no sepodraactualizarlabasededatos. TambinsepuedecrearunnuevoregistroalaBDatravsdelResultSet,paraestose utilizaelmtodoMoveToInsertRow().EstemtodocreaenelResultSetunanuevafila vaca.EsanuevafilasellenaconelmtodoUpdateXXXtalycomosevioenelejemplo anterior.yaconlafilaestellena,seusaelmtodoInsertRow()paraenviaresafilaala BD.Elsiguienteejemplomuestraloanterior. //Crea la fila nueva resultado.moveToInsertRow(); llena la fila //se resultado.updateString(1, TFCedula.getText()); resultado.updateString(2, TFNombre.getText()); resultado.updateString(4, TFTelefono.getText()); resultado.updateString(3, TFDireccion.getText()); resultado.updateString(5, TFcorreo.getText()); resultado.updateBytes(6, datosImage); //se enva la fila a la BD resultado.insertRow();
94 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

LosmtodosdeleteRow,UpdateRoweInsertRowsolosepuedenutilizarcuandola consultaquetieneelResultSetinvolucraunasolatabladelabasededatos.Nose permiteelusodeestosmtodoscuandolaconsultaposeeJOINSoclausulasGroupBy.

FECHASENJAVA
Javaposeevariasclasesparaelmanejodedatostipofecha.Engeneralunafechase puedemanejarcomolaunindetrescamposenteros:unoparaelao,otroparael mesyotroparaelda.Tambinsepodrapensarenlahoradeldayentoncesse tendramscamposparalahora,elminuto,elsegundoeincluso,elmilisegundo. LasclasesparaelmanejodedefechasenellenguajeJAVAson:

Calendar.
LaclaseCalendaresunaclaseAbstractaqueposeemtodosespecialesparamanipular fechasycadaunodesuscampos(AO,MES,DIA,HORA,MINUTO,SEGUNDO).Un instantedetiempoenlaclaseCalendarestarepresentadoporunvaloren milisegundosdesdeelprimerodeenerode1970alas00:00:00.000horas,esdecir, eseeselmilisegundocero.AeseinstantedetiemposelellamalapocaoEPOCH. Parasabercuantosmilisegundoshantranscurridodesdeepochseusaelmtodo getTimeInMillis(). AlserCalendarunaclaseabstracta,estanosepuedeinstanciar,paralocualtraeel mtodogetInstance()elcualretornaunobjetoconsuscamposinicializadosalafecha yhoraactual.
Calendarahora=Calendar.getInstance(); ahoraesentoncesunobjetoCalendardondeeldia,mes,ao,minuto,segundo,horay milisegundoseinicializarontomandolosvaloresdelsistemaenelmomentodeusarelmtodo getInstance().

Obtenerloscamposdeunafecha
ParaobtenerloscamposdeunCalendarseusaelmtodoget(intparametro)donde parmetroindicaelcampoquesequiereobtener.Losvaloresdeesteparmetroestn definidosporconstantesdentrodelaclaseCalendarqueson: Calendar.YEAR:ao Calendar.MONTH:mes Calendar.WEEK_OF_YEAR:numerodelasemanaenelao. Calendar.WEEK_OF_MONTH:numerodelasemanaenelmes.
FECHASENJAVA/Calendar. 95

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Calendar.DAY_OF_MONTH:diaenelmes Calendar.DAY_OF_YEAR:diaenelao. Calendar.DAY_OF_WEEK:diaenlasemana. Calendar.HOUR:hora.Para10:35:21PMseria10 Calendar.HOUR_OF_DAY:horadeldia.ParaLas10:35:21PMseria22 Calendar.MINUTE:minutodelahora. Calendar.SECOND:segundodelminuto Calendar. MILLISECOND:milisegundodelminuto. Paraentenderacabalidadloanteriorvaseelsiguienteejemplo: //se crea el objeto ahora tipo Calendar Calendar ahora=Calendar.getInstance(); JOptionPane.showMessageDialog(null, "AO:"+ahora.get(Calendar.YEAR)+"\n"+ "MES:"+ahora.get(Calendar.MONTH)+"\n"+ "SEMANA EN EL AO:"+ahora.get(Calendar.WEEK_OF_YEAR)+"\n"+ "SEMANA EN EL MES:"+ahora.get(Calendar.WEEK_OF_MONTH)+"\n"+ "DIA DEL MES: "+ ahora.get(Calendar.DAY_OF_MONTH)+"\n"+ "DIA DEL AO: "+ahora.get(Calendar.DAY_OF_YEAR)+"\n"+ "DIA DE LA SEMANA:"+ahora.get(Calendar.DAY_OF_WEEK)+"\n"+ "HORA:"+ahora.get(Calendar.HOUR)+"\n"+ "HORA EN EL DIA: "+ahora.get(Calendar.HOUR_OF_DAY)+"\n"+ "MINUTO:"+ahora.get(Calendar.MINUTE)+"\n"+ "SEGUNDO: "+ahora.get(Calendar.SECOND)+"\n"+ "MILISEGUNDO: "+ahora.get(Calendar.MILLISECOND)); Cuandosecorrielprogramalafechaylahoraeran: 6deoctubredel2008alas5:12:18PM Estotienecomosalida: HayquetenerencuentaqueLosmesesseenumerandesde011yeldomingoesel primerdia.
96 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

ManipulacindelasFechas.
LaclaseCalendarposeeciertosmtodosparamanipularelvalordesusatributoscomo son: add(intf,intv):estemtodosumaalcampoidentificadoporelparmetrofelvalor delparmetrovsiguiendolasreglascalendaras.LasreglasCalendarasindicanquesi seaumentauncampomasalldesuslmitespermitidos,elcampoinmediatamente superiordebeincrementarseenunoyas,sucesivamente,loscampossuperiores. Elparmetroftomaelvalordealgunadelasconstantesexplicadasanteriormente. Ejemplo: lafechaes:6deoctubrede2008alas5:29:31PM. Octubreeselmes9(empezandodesde0)ysedeseasumar7mesesalafechaactual. Ahora.add(Calendar.MONTH,7) Elobjetoahoratienelasiguientefecha: 6demayode2009alas5:29:31PM.Dondeelaoaumentodebidoaquelmes sobrepasoelnmeromximodemeses12y9ms7es16esdecir,elmes4omayo perodelaosiguienteo2009 Otromtodoparalamanipulacindefechaesroll(intf,intv)quecumplelamisma funcindeaddperosinseguirlasleyescalendricas. Ejemplo: Lamismafechaanterior::6deoctubrede2008alas5:29:31PMselesuman7mese conroll Ahora.roll(Calendar.MONTH,7)dondeseobtieneelmismoresultadosoloquenohay cambiodeao:6demayode2008alas5:29:31PM. Esdeaclararqueparalosmtodosanterioressepuedenhacerincrementosnegativos loqueproducedecrementosdefecha. after(CalandarotraFecha)ybefore(CalendarotraFecha)sonmtodosquesirvenpara determinarsiunafechaestadespusoantesdeotra.Estosmtodosretornan verdaderoofalso.

FECHASENJAVA/Calendar.

97

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Ejemplo: Fecha1=10deDiciembrede2008. Fecha2=12deAgostode2008 Siseevalafecha1.before(fecha2)estodeberetornarfalsoporquelafecha1esta despusdefecha2.Loquesepreguntaaquessilafecha1estaantesde fecha2.fecha1.after(fecha2)retornaraverdaderoporquelafecha1siestadespus defecha2.

OtrasClasesparaelmanejodeFecha.
Otrasclasesquepermitenlamanipulacindefechasson:

GregorianCalendar:
ClasequeheredatodaslascaractersticasdeCalendareimplementaelcalendario Gregorianoqueeselqueusamosenlaactualidadenlamayoradelmundo.Eslaclase queserecomiendaausar. ParausarunGregorianCalendarsedebeinstanciarunobjetodeesetipo. GregorianCalendarfecha=newGregorianCalendar() Tambinsepuedeinstanciarconunafechadeterminada GregorianCalendarfecha=newGregorianCalendar(ao,mes,da) Aquelconstructorrecibecomoparmetroelao,mesyeldaenelquesequiere iniciarelobjeto. GregorianCalendarposeelosmismosmtodosdeCalendar.

Java.util.DateyJava.sql.Date
Java.util.Dateesotraclasequepermiteelmanejodefechas.AdiferenciadeCalendar ysusderivadasesunaclasemuyprimitivaydestinadaadesaparecerenfuturas implementacionesdellenguajejavayaqueexistenmejoresalternativasde implementacion Paradeclararunjava.util.Dateseinstanciaunobjetodeestaclaseasi: Dated=newDate().Aqulafechaylahorasonladelsistema. Dated=newDate(ao,mes,dia):fechaconeldia,mesyaodelamisma.Estemtodo estadepreciado,esdecir,noseimplementaraenfuturasimplementacionesoes peligrosodeusaroexistenmejoresalternativas.
98 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

CAMILOANDRSFERRERBUSTOS

EAM

java.sql.Dateesunaclaseespecialparamanejarfechasqueinvolucrenelaccesoa
unabasededatosJDBC.Estaclaseheredatodassuscaractersticasdelaclase java.util.Date.EstaeslaclaseautilizarconlosmtodossetDateogetDatedeun ResultSet. LaclaseCalendarysushijasretornanunobjetotipojava.util.Dateconlainformacin delafechaatravsdelmtodogetTime()ytambinsepuedecambiarlafechadeun Calendarenvindoleunjava.util.DateatravsdelmtodosetTime(). Yaqueestasclasessellamanigualessiseusanlasdosenelmismoprogramahayque especificarelpaqueteenelqueestnenelmomentodedeclararlaseinstanciarlas.Si soloseusaunadeellas,soloesnecesarioimportarelpaquete(java.util.*ojava.sql.*) correspondienteydeclararelobjetocomoDate.Dependiendoelpaqueteimportado elobjetosertilosql.

ConversinDeFechas.
Yaqueunafechasepuedemostrardemuchasmanerasseadelaformacorta (12/10/2008)mediana(12deoctubrede2008)olarga(Domingo,12deOctubrede 2008)javabrindaunaclaseAbstractaespecialparadarformatoauntipodedato Fechatipojava.util.Date. LaclasequemsseusaparatalfinesDateFormat.Estaesunaclaseabstractatil paratransformarunafechaacadena.AlserunaclaseAbstractanonecesita instanciarseyposeeelmtodogetDateInstance()paracrearunobjetodeestetipo. DateFormatdf=DateFormat.getDateInstance(intstyle)querecibeunenteroque poseetresvaloresdistintosqueson: DateFormat.LONG:paramostrarfechaslargar. DateFormat.MEDIUM:parafechasmedianas. DateFormat.SHORT:paramostrarfechasdemaneracorta. DateFormat.FULL:muestralafechaconelnombredeldadelasemana. Elmtodoformat(Datefecha)recibecomoparmetrounDateylotransformaenun Stringconlafechaconvertidasegnloestablecidoenstyle Elsiguienteejemplomuestralosdiferentesestilosparamostrarunafecha: Fecha Corta ahora=new GregorianCalendar(); DateFormat df=DateFormat.getDateInstance(DateFormat.SHORT); JOptionPane.showMessageDialog(null, df.format(ahora.getTime()));

FECHASENJAVA/ConversinDeFechas.

99

2008II

ACCESOADATOSCONJAVA:NOTASDECLASE

Fecha Mediana ahora=new GregorianCalendar(); DateFormat df=DateFormat.getDateInstance(DateFormat.MEDIUM); JOptionPane.showMessageDialog(null, df.format(ahora.getTime()));

Fecha Larga ahora=new GregorianCalendar(); DateFormat df=DateFormat.getDateInstance(DateFormat.LONG); JOptionPane.showMessageDialog(null, df.format(ahora.getTime()));


Fecha Completa ahora=new GregorianCalendar(); DateFormat df=DateFormat.getDateInstance(DateFormat.FULL); JOptionPane.showMessageDialog(null, df.format(ahora.getTime()));

100 ACCESOAUNABDPORMEDIODEUNAAPLICACINJAVA

You might also like