Você está na página 1de 26

J A V A Inicial INFOPUC

INSTITUTO DE INFORMATICA

p o n t if ic ia UNIVERSIDAD CATÓLICA d e l p f.r ú

No es necesario crear una instancia de la clase externa para una instancia de la


clase interna. Pero no es posible acceder a la clase externa desde una instancia
de la clase interna estática.

La forma de declaración de una clase interna estática es la siguiente:

public class ClaseExterna{


static class Claselnterna{
Claselnterna(){
System.out.printlnfEn constructor de Claselnterna");
}
public boolean flag= false;

}
}

La referencia a la clase estática es la siguiente:


ClaseExterna.Claselnterna claselnterna = new ClaseExterna.Claselnterna();

La palabra “static” puede ser usada como un modificador de acceso en la


declaración de una clase interna. La clase interna puede declarar variables y
métodos estáticos.

9. Clases internas anónimas

Las clases internas anónimas son aquellas clases que no tienen un nombre. No
se pueden instanciar una clase anónima y son definidas en el método de la clase
externa.

Este tipo de clases internas son utilizadas mayormente en clases que manejen
eventos, como son aquellas que pertenecen a los paquetes java.awt o
javax.swing. Es una manera de construir clases en base a interfaces, sin utilizar
la palabra reservada implements.

La clase anónima tiene las siguientes características:


- La definición de una clase interna esta definida en el punto de construcción de
una instancia de la clase interna, es decir, la clase es instanciada y declarada en
el mismo lugar.

El formato de la declaración es la sgte:

new nombreClaseolnterface() {
//definición de la clase interna
}

62
JAVA Inicial INFOPUC
INSTITUTO DE INFORMATICA

PONTIHCIA UNIVERSIDAD CA TÓ LICA del PERÚ

donde :
• Si nombreClaseoInterface es una clase C, entonces la clase anónima
extiende de C.
• Si nombreClaseoInterface es una interface i, entonces la clase anónima
implementa I, extendiendo de la clase O bject.

No puede declarar un constructor debido a que la clase anónima no tiene un


nombre asignado. Además, el cuerpo de la clase interna debe ser pequeño.

Características adicionales:
• Una clase puede ser una subclase de otra clase explícita o puede
implementar una interface pero no se permite que sea una subclase e
implemente una interface al mismo tiempo.
• Si una clase anónima extiende de una clase existente, tiene la opción de
agregar y re-escribir métodos de la clase existente o clase padre.

Considerar que toda clase interna anónima que implemente una interface,
extiende de la clase Object por defecto.

Las variables locales pueden ser ahora designadas como final. Los objetos de
clases internas anónimas pueden pasar con seguridad una copia de estos,
sabiendo que no podrán ser cambiados. Son asignados una sola vez si no han
sido seteados cuando han sido declarados.

Un bloque de “inicialización” es como un bloque estático sin la palabra “static”.


Se ejecuta cuando las variables de instancia son inicializadas (solo antes del
constructor) y puede ser usada en una clase interna anónima.

10. Acceso e instanciación de clases internas


Como crear instancias e invocar métodos de clases internas.

El acceso a una clase interna es como sigue:

ClaseExtema.Claselnterna varClaselnterna = new ClaseExterna().new


Claselnterna();

Los objetos internos tienen una referencia “this” al objeto externo:


return X.this.cant; // retorna el campo cant en el objeto externo del tipo X.

El campo “cant” de la clase externa puede ser referida sin la calificación “X.this”
si no hay ambigüedad, esto es si la clase Y no tiene un campo “cant”.
Los objetos internos cuando son instanciados en una clase fuera de su clase
externa, debe calificar el tipo de puntero con el nombre de la clase externa y
debe colocar el calificador “new” con la referencia del objeto externo:

X x = new X(); // objeto de clase externa


X.Y y = x.new Y(); // objeto de clase interna
J A V A inicial INFOPUC
INSTITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD CATÓLICA d e l p e rú

Al compilar, se generan las siguientes clases:

paquete.ClaseExterna
paquete.ClaseExterna$Claselnterna

Para las clases anónimas, las variables locales en el mismo ámbito de la


declaración de la clase deben ser manejadas por el objeto interno.

Recordar las clases internas y sincronización: los métodos de instancia de la


clase interna pueden acceder los datos de objeto exterior (campos).

11. Interfaces: Roles y herencia múltiple

Definiciones

Las interfaces son objetos especiales que no heredan de la clase Object. Una
interface es parecida a una clase abstracta pero tiene la característica que sus
métodos no son implementados, sólo declarados.

A diferencia de una clase abstracta, una interface no es especificada y todos sus


métodos son abstractos, es decir sólo declarados.

Una interface no cuenta con variables de instancia, aunque puede contener


variables estáticas con acceso final consideradas como constantes.

Sintaxis para declaración de una interface :

interface Id Interface {
TipoDeRetorno IdMetodol (ListaDeParametrosI);
TipoDeRetorno ldMetodo2 (ListaDeParametros2);

Tipo IdVariableFinaM = ValorConstante; // NO USAR


Tipo ldVariableFinal2 = ValorConstante; // NO USAR

Roles y Herencia Múltiple

Una clase se encuentra definida y caracterizada por sus propiedades y su


comportamiento. A su vez, las similitudes de estas características permiten que
las clases sean agrupadas en jerarquías de herencia. Sin embargo, ya se ha

64
J A V A Inicial INFOPUC
INSTITUTO D£ INFORMÁTICA

PONTIFICIA UNIVERSIDAD CATÓ LICA d e l p e rú

visto que una clase sólo puede extender de una y sólo una clase, de la que
hereda sus propiedades y comportamiento.

En algunas ocasiones, clases que no se encuentran en el mismo árbol de


herencia, requieren compartir características similares. En este contexto, puede
apreciarse que sería de mucha utilidad un mecanismo que permita “heredar” o
implementar de mas de una clase, las características comunes requeridas.

Si por algún motivo se requiere expandir el diseño para tratar con objetos de
tipol y objetos de tipo2, podrá apreciarse que la clasificación establecida no se
adecuaría a este nuevo esquema: si bien no se puede heredar de ambas clases
pero pueden contener métodos comunes.

En Java esta necesidad de herencia múltiple se solucionó parcialmente con una


construcción (un tipo compuesto) llamada interface, que en pocas palabras es un
tipo especial de clase que puede ser usada por otras clases como una
“superclase adicional”.

12. Implementación de interfaces

Sintaxis, miembros de una interfaz, posibilidad de extender varias veces.

Para que una clase pueda implementar una interface, sólo requiere implementar
cada uno de los métodos declarados en la interface.

Sintaxis:

class NuevaClase [extends SuperClase] implements Idlnterfazl,


Idlnterfaz2, ... IdlnterfazN {
// cuerpo-de-la-clase
}

Como una clase puede implementar más de una interface, a través de este
mecanismo se puede especificarse una especie de herencia múltiple, pero sólo a
nivel de descripciones de métodos y no de implementaciones como en otros
lenguajes.

En el siguiente ejemplo, se ha creado previamente la clase Animal. Los animales


(subclases de Animal) que emitan sonido necesitarán implementar la interface
“Sonoro” y los que se muevan necesitarán implementar la interface “Móvil”. Una
implementación para la clase Perro podría ser:
public class Perro extends Animal implements Móvil, Sonoro {
String nombre;
public Perro() {
nombre = "Perro";
}

65
J A V A Inicial ►INFOPUC
INSTITUTO D£ INFORMÁTICA

PONTIHCIAUNIVERSIDAD CATÓLICA DELretó

public String movimiento(){


return "patas";
}
public String sonido() {
return "GUAU";
}
}

Al ser una interface un tipo especial de clase, pueden declararse variables de


referencia y crearse objetos de ese tipo. Siguiendo con el ejemplo, podría
definirse una clase “Oidor”:

class Oidor {
String sonidoEscuchado;
void escuchar (Sonoro objetoSonoro) { // acepta un objeto de alguna
sonidoEscuchado = objetoSonoro.sonido(); // clase que implemente Sonoro
}
}

La clase Oidor tiene un método “escuchar" que tiene como argumento la


interface Sonoro, de esta manera, la clase tendrá una objeto de alguna clase que
implemente la interface Sonoro.

13. Colecciones de objetos

Cuando se necesitan características más sofisticadas para almacenar objetos,


que las que proporciona un simple array, Java pone a disposición del
programador la librería de colecciones.

La nueva librería de colecciones parte de la premisa de almacenar objetos, y


diferencia dos conceptos en base a ello:

* Colección (Collection): un grupo de elementos individuales, siempre con


alguna regla que se les puede aplicar. Una List almacenará objetos en una
secuencia determinada y, un Set no permitirá elementos duplicados.

* Mapa (Map): un grupo de parejas de objetos clave-valor, como la Hastable


ya vista. En principio podría parecer que esto es una Collection de parejas,
pero cuando se intenta
implementar, este diseño se
vuelve confuso, por lo que
resulta mucho más claro
tomarlo como un concepto
separado. Además, es
conveniente consultar
porciones de un Map creando
una Collection que represente
a esa porción; de este modo,
un Map puede devolver un Set
JAVA Iniciaf INFOPUC
INSTITUTO DE INFORMATICA

p o n t if ic ia UNIVERSIDAD CATÓ LICA d e l p e rú

de sus claves, una List de sus valores, o una List de sus parejas clave-valor.
Los Mapas, al igual que los arrays, se pueden expandir fácilmente en múltiples
dimensiones sin la incorporación de nuevos conceptos: simplemente se monta
un Map cuyos valores son Mapas, que a su vez pueden estar constituidos por
Mapas, etc.

Entre otras características, las clases de esta librería se redimensionan


automáticamente, por lo que se puede colocar en ellas cualquier número de
objetos, sin necesidad de tener que ir controlando continuamente en el programa
la longitud de la colección.

14. Objetos envolventes

Relación de los Wrappers más importantes y su utilización

Los tipos de datos primitivos tienen clases envolventes, que nos sirve para
manejar objetos que representen estos tipos de datos.

Tipo Primitivo Tipo Envolvente


boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
void Void

Es posible usar las clases envolventes tales como Integer o Double, para colocar
valores primitivos en una colección.
JA V A Inicial INFOPUC
INSTITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD CATÓLICA d e l p e rú

68
JAVA Inicial -1NFOPUC
INSTITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ

Capítulo 5
Manejo de Excepciones

1. Manejando errores
2. Jerarquía de clases
3. Clase Throwable
4. Clase Exceptíon
5. Clase Error
6. Capturando excepciones
7. throw: lanzando excepciones
8. throws: lanzando excepciones n capturadas
9. finally: independizando código de las capturas
10. Excepciones en métodos sobrescritos

69
J A V A Inicial INFOPUC
INSTITUTO D£ INFORMÁTICA

PONTIFICIA UNIVERSIDAD CATÓ LICA d e l p e rú

70
J A V A Inicial INFOPUC
INSTITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD CATÓLICA d e l PERÚ

1. Manejando errores

Definiciones.

El desarrollar aplicaciones sin “huecos” es uno de los principales factores, sino el


principal, para que un software o sistema de información se diga de calidad. Sin
embargo, para lograr esa ansiada y pocas veces reconocida calidad
generalmente es necesario invertir tanto o más tiempo en la lógica de
tratamiento de errores que en el objetivo mismo de la aplicación.

El éxito que tenga el desabollador en contemplar la totalidad de situaciones que


puede generar una excepción y su buen manejo garantizará la eficacia de la
aplicación.

Java provee mecanismos para la notificación y manejo de errores y excepciones


que, además de apoyar esta eficiencia en el desarrollo, no se desvían del
paradigma de objetos visto a lo largo de todo el lenguaje.

Métodos de nivel “bajo” detectan los errores mientras los de “alto” nivel (quienes
invocan a los anteriores) deberán manejar estos errores y excepciones, que
fueron lanzadas como objetos.

Una excepción es una condición anormal que surge en una secuencia de código
durante su ejecución.

En Java, una excepción es un objeto que describe una condición excepcional


producida en un fragmento de código. Esta excepción se detecta en tiempo de
ejecución y no durante la compilación del código.

2. Jerarquía de clases

La jerarquía de clases es la
siguiente:

71
J A V A Inicial INFOPUC
INSTITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD CATÓLICA Da rtKÚ

Subclases más utilizadas:

AcINotFoundException Referencia a un ACL inexistente


(Lista de Control de Acceso)
AWTException Excepción de Absract Window
Toolkit
Bad Location Exception Referencia una localizacion que no
existe.
ClassNotFoundException Clase no encontrada
CloneNotSupported Exception Clase no implementa la interface
Cloneable.
DataFormatException Error en formato de fecha.
IHegalAccessException Acceso a clase que no es public ni
esta en el mismo paquete
InstantiationException La clase es abstracta o es una
interface.
Interrupted Exception Hilo está esperando, durmiendo, o
en pausa durante mucho tiempo y
otro hilo lo interrumpe usando el
método interrupt.
lOException Excepción de Entrada/Salida
NoSuchFieldException Clase no tiene un campo de
nombre especificado.
NoSuchMethod Exception Clase no tiene un método de
nombre especificado.
PropertyVetoException Cambio de una propiedad tiene
valor inaceptable.
RuntimeException Superclase de excepciones
durante la operación normal del
JVM
Sen/e rN otActive Exception Servidor no esta activo
SQLException Error en ejecución de sentencia
SQL.

3. Clase Throwable

La clase Throwable representa todas


las condiciones excepcionales.

La clase Throwable es la superclase


de todas las excepciones y errores en
el lenguaje Java. Solo los objetos que
son instancia de esta clase (o de una

72
JAVA Inicial ►
INFOPUC
INSTITUTO D£ INFORMÁTICA

p o n t if ic ia UNIVERSIDAD CATÓ LICA D 6l p e rú

de sus subclases) son lanzadas por el JVM o por el indicador throw. Sólo esta
clase puede o una de sus subclases puede ser el tipo de argumento en una
sección catch.

Instancias de dos subclases, Error y Exception, son usadas para indicar que
situaciones excepcionales han ocurrido. Típicamente, estas instancias son
recientemente creadas en el contexto de la situación excepcional tal que incluya
información relevante.

Por convención, la clase Throwable y sus subclases tiene dos constructores: uno
de ellos no tiene argumento, el otro constructor tiene de argumento un String que
puede ser usado para producir un mensaje de error.

4. Clase Exception

La clase Exception es una subclase de Throwable y es la base para todas las


excepciones definidas por el usuario. Se utiliza para condiciones excepcionales
que los programas de usuario necesitan capturar. Extendiendo de esta subclase
se pueden crear condiciones excepcionales propias para que otros las capturen
y manejen.

La clase Exception y sus subclases son una forma de lanzadores que indican
condiciones en que una aplicación puede fallar.

En el punto de detección de una circunstancia excepcional, un objeto excepción


es lanzado.

Un llamador (en forma directa o indirecta) es quien reconoce que:


• Un método invocado puede lanzar una excepción, y
• Acepta la responsabilidad para manejarlo, llamando este método dentro
del bloque try.

Un apropiado bloque catch es asociado con el bloque try.

Un bloque finally opcional puede ser asociado con el bloque try, en el cual se
ejecutará el código independiente del error o excepción.

Las excepciones son superiores a códigos de error cuando no está garantizado


un manejo de errores en forma encapsulada y local. Las excepciones no pueden
ser ignoradas, pueden fácilmente pasar gran cantidad de información. Separa la
lógica normal vs. lógica de errores.
J A V A Inicial INFOPUC
INSTITUTO D £ INFORMATICA

p o n t if ic ia UNIVERSIDAD CATÓLICA d e l PERÚ

5. Clase Error

La subclase Error define las condiciones que no se deberían capturar en


condiciones normales.

La clase Error es una subclase de Throwable que indica serios problemas que
una aplicación podría colocar en un bloque try...catch.

Sólo instancias de la clase Throwable o de sus subclases podrán ser originadas


por la máquina virtual de Java o por la sentencia throw.

En términos prácticos, la clase sirve para contener una “instantánea” (snapshot)


del contenido del stack de ejecución del hilo en el momento que la instancia
respectiva fue creada. También puede contener una cadena de texto para
ampliar la información del error.

6. Capturando excepciones

Relación de sentencias para el manejo de errores

Los bloques try-catch y anidamiento de éstos.

Si bien el sistema (el intérprete Java) es muy eficiente y puede capturar diversas
excepciones y mostrar el detalle, por lo general lo que se requiere es seguir
manteniendo el control del flujo de un programa.

Entonces deberá capturarse y manejarse la excepción.

“try' se utiliza para especificar el bloque que debe protegerse frente a todas las
excepciones. Inmediatamente al bloque try se incluye la cláusula “catch” para
especificar el tipo de excepción que se desea capturar.

El ámbito de la cláusula catch está restringido a las sentencias del bloque try
precedente.

Lo lógico es construir bloques catch que resuelvan la condición excepcional, por


ejemplo dejando a las variables en un estado de manera que pueda continuarse
con la ejecución. Si un método no maneja una excepción, entonces será decisión
de quien lo invocó el manejarla. Así se “sube” sucesivamente por la cadena de
llamadas hasta que se llegue al manejador (en tiempo de ejecución) de Java,
quien detalla todas las llamadas.

74
J A V A Inicial INFOPUC
INSTITUTO DE iNFOftMATICA

p o n t if ic ia UNIVERSIDAD CATÓLICA d e l p e rú

En ocasiones, un mismo bloque puede originar más de una condición


excepcional, entonces puede colocarse varias cláusulas catch, las que se
comprobarán en la secuencia que fueron especificadas, por lo tanto es
recomendable que las clases de excepción más específicas sean colocadas
primero.

Ejemplo:
try {
/* bloque de código 7
}
catch (ClaseDeExcepcionl e) {
/*manejador de excepciones
para ClaseDeExcepcionl */
}

catch (ClaseDeExcepcion2 e) {
/*manejador de excepciones
para ClaseDeExcepcion2 7
throw (e);
}

finally {
/*manejador de excepciones
por omisión */
}

Anidamiento de try ... catch

Los bloques try se anidan de forma similar a los ámbitos de las variables. En un
bloque try puede especificarse una llamada a un método y en este último puede
colocarse la sentencia try para proteger otro bloque. Así sucesivamente.

Si un método no tiene un manejador (cláusula catch) para un tipo de excepción,


se sube por la cadena de llamadas (al bloque try que invocó), hasta llegar
incluso al manejador de excepciones de Java.

7. throw: lanzando excepciones

La sentencia throw se utiliza para lanzar explícitamente una excepción.

Cuando un error es detectado, una excepción es señalada al usar la sentencia


throw, la cual permite crear una nuevo objeto excepción o relanzar a uno
existente.
J A V A Inicial IN F O P U C
in s t it u t o d e in f o r m á t ic a

p o n t if ic ia UNIVERSIDAD CATÓLICA d e l p e rú

Para lanzarla, debe tenerse la excepción (una variable de referencia a una


instancia de la clase Throwable) a lanzar. Esta puede ser la capturada en un
catch o también una nueva (con el operador new).

Sintaxis:
throw objetoThrowable;

El flujo de programa no continua con la siguiente instrucción sino que se


inspecciona el bloque try-catch de su nivel para ver si la excepción del catch
coincide con el tipo de la instancia Throwable del throw. Si no, se inspecciona el
bloque try-catch que la engloba y así hasta llegar incluso al manejador de
excepciones de Java.

La sentencia throw siempre termina el método y le brinda a quien lo invocó la


oportunidad de capturar la excepción.

8. throws: lanzando excepciones no capturadas

La sentencia throws se utiliza para especificar la lista de excepciones que un


método puede lanzar.

Sintaxis:
tipo método (argumentos) throws NstaDeExcepciones { . . . }

Para la mayoría de las subclases de Exception, Java obligará a especificar esta


lista de excepciones o sino a manejarla (try-catch) en el método.

Cada excepción es manejada por el bloque try ... catch, según sea la clase
Exception o una subclase de ella.

Esta regla no se cumple para la clase (y subclases de) Error ni


Run TimeException.

9. finally: independizando código de las capturas

La cláusula finally, usado para limpieza de código, puede ser asociado con un
bloque try ... catch y siempre será ejecutado.

La cláusula finally se utiliza para asegurar que un bloque de código se


ejecutará, independientemente de las excepciones que se produzcan y/o que se
capturen.

76
JAVA Inicial ►INFOPUC
INSTITUTO DE INFORMÁTICA

p o n t if ic ia UNIVERSIDAD CATÓ LICA d e l p e rú

Este bloque se ejecutará aunque ninguna de las cláusulas catch haya logrado
atrapar una excepción y antes que se ejecute la siguiente sentencia al bloque
try-catch.

Siempre que un método vaya a devolver el control a quien lo invocó, mediante


una excepción no capturada o con un retorno explícito (con la sentencia retum),
se ejecutará el bloque finally antes del final del método.

Aunque la cláusula finally es opcional, será muy útil en caso de haber asignado
muchos recursos en un método donde pueden ocurrir excepciones; el bloque
finally podrá servir para liberar los mismos.

10. Excepciones en métodos sobrescritos

Cuando se extiende una clase y se sobre escribe un método, el compilador de


Java indicará que el nuevo método no puede ser declarado como lanzador de
excepciones de clases que no hayan sido referenciadas en el método original.

Ver en el siguiente ejemplo:

public class lnicial(){


public void metodolni() throws IOException{
}
}

public class Aceptadol extends lnicial(){


public void metodolni() throws IOException{
}
}
public class Aceptado2 extends lnicial(){
public void metodolni() {
}
}
public class Aceptado3 extends lnicial(){
public void metodolni() throws lOException, EOFException {
}
}

public class NoAceptadol extends lnicial(){


public void metodolni() throws lOException, MlegalAccessException{
}
}
public class NoAceptado2 extends lnicial(){
public void metodolni() throws Exception{
}

77
J A V A Inicial INFOPUC
INSTITUTO DE INFORMÁTICA

p o n t if ic ia UNIVERSIDAD CATÓ LICA d e l p e rú

}
Las clases Aceptadol, Aceptado2 y Aceptado3 tiene definido correctamente el
método “metodolni”, pues este método sobre escrito no puede lanzar cualquier
excepción que no sea subclase de lOException. En la clase Aceptado3, vemos
que el “metodolni” lanza la excepción EOFException, que es subclase de
lOException. Pero en la clase NoAceptadol este método lanza la excepción
MlegalAccessException la cual es subclase de Exception pero no de lOException,
este tipo de declaraciones no es permitido. La clase NoAceptado2 sufre el
mismo error.

78
JAVA Inicial INFOPUC
INSTITUTO D£ INFORMÁTICA

PONTIFICIA UNIVERSIDAD CA TÓ LICA d e l p e rú

Capítulo 6
Acceso a Bases de Datos

1. El API JDBC
2. El bridge jdbc-odbc
3. Otras categorías de drivers
4. Estructura de una aplicación JDBC
5. DriverManager
6. Conectándose a una base de datos
7. Ejecución de consultas
8. Conversiones de tipos de datos
9. Otras características de JDBC
10. PreparedStatement
11. CallableStatement

79
J A V A Inicial INFOPUC
INSTITUTO DE INFORMÁTICA

PONTIHC1A UNIVERSIDAD CATÓLICA d e l PERÚ


JAVA Inicial INFOPUC
INSTITUTO DE iNFORMÁTSCA

p o n t ih c ia UNIVERSIDAD CATÓ LICA del p

1. El API JDBC

La especificación Java DataBase Connectivity, más conocida por sus siglas


JDBC, constituye una interface para programar aplicaciones (API) con el objetivo
de acceso a bases de datos relaciónales.

Como está escrita en Java, entonces obviamente constituye un conjunto de


clases e interfaces. Estas están agrupadas en el paquete java.sql.

JDBC está implementado en dos niveles:

• El nivel de driver, que consiste en implementaciones específicas de


interfaces (provistas por el desabollador del driver) que trabajan con un
manejador de base de datos relacional (RDBMS) específico.

• El nivel de la aplicación, que consiste en la clase DriverManager que


maneja los drivers siendo utilizados por una aplicación para acceder una
base de datos en particular.

JDBC API JDBC Protocolos de


Driver API acceso a la Base
de Datos

Esta abstracción de un DBMS no sólo permite conectarse y acceder datos de


bases de datos heterogéneas al mismo tiempo y usando los mismos métodos,
sino que encapsula (escondiéndolos del desabollador) los detalles de
implementación (sockets, streams de E/S, etc.).

La idea es que el desabollador, a través de simples llamadas a métodos pueda:


• Crear una conexión a base de datos
• Ejecutar una consulta (query)
• Manejar los resultados de consultas, etc.

La aplicación desarrollada por el programador interactúa con JDBC a través del


Driver Manager y el Driver JDBC instalado. A esto se le denomina el API JDBC.

81
J A V A Inicial INFOPUC
INSTITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD CATÓLICA d e l p e rú

El driver JDBC a su vez se comunica con la base de datos usando


potencialmente protocolos propietarios de ésta.

La capa del DriverManager se ubica en esa posición debido a que esconde a


driver JDBC de la aplicación. La aplicación sin embargo realiza la mayor parte
de la comunicación con la base de datos directamente a través del driver por
medio de objetos proveídos por el Manager.

2. El bridge JDBC-ODBC

Sun ha desarrollado un puente (bridge) entre JDBC y ODBC. Ambas


especificaciones están basadas en el estándar X/Open, que es una interfaz (API)
a nivel de comandos SQL.

Este tipo de driver usa el driver ODBC específico para la base de datos que se
desea acceder.

Requiere que el driver ODBC se encuentre disponible en la máquina cliente


donde está corriendo la aplicación Java.

3. Otras categorías de drivers

Driver categoría 2

Este tipo de driver utiliza Java para hacer llamadas al API de acceso (protocolo)
del DBMS que debe estar disponible en el cliente. Este último es quien provee la
conectividad y acceso a la base de datos.

Entonces el driver es una implementación parcial en Java y depende que el


ejecutable (código binario) del API al DBMS se encuentre en el cliente.

Driver categoría 3

Este tipo de driver utiliza los protocolos de red que vienen con el JDK (Kit de
desarrollo de Java) para conectarse a un servidor. En este último se traducen los
requerimientos a transacciones específicas del DBMS.

Esta forma no requiere la existencia de código ejecutable en el lado del cliente,


pero implica la necesidad de un componente middleware para procesar las
transacciones específicas.

82
JAVA Inicial ►
INFOPUC
INSTITUTO DE INFORMATICA

PO NTlH C !A UNIVERSIDAD CATÓ LICA DEL PERÚ

Todas las funciones que no son especificadas en Java son de responsabilidad


del middleware.

El protocolo genérico de red es flexible pues no requiere código instalado en el


cliente, es así que con el mismo driver puede accederse a diferentes bases de
datos (un ambiente heterogéneo).

Driver categoría 4: Nativo

Este tipo de driver está enteramente escrito en Java y se comunica directamente


a la Base de datos con el protocolo de red del DBMS.

Esta comunicación directa se implementa a través de conexiones de red


(sockets).

4. Estructura de una aplicación JDBC

Antes de conectarse a una base de datos debe cargarse el driver JDBC.

Luego de conectarse con la base de datos puede crearse una instancia de clase
Statement. Este objeto es el utilizado para representar la sentencia SQL, la
misma que puede ser de tres tipos:

Statement
Sentencia SQL estática, definida en el programa y sin variables host

PreparedStatement
Sentencia SQL dinámica, que contiene variables host y/o partes variables a
definirse en tiempo de ejecución.

CallableStatement
Llamada a un procedimiento almacenado en el DBMS.

Al ejecutar la sentencia (utilizando el objeto Statement), el resultado se recibe en


un objeto tipo ResultSet, que será quien contenga las filas del resultado de la
sentencia (generalmente un SELECT).

Para procesar el conjunto resultado se utilizan los métodos del objeto ResultSet.

Generalmente será necesario “barrer” o moverse en el resultado. Para esto, se


utiliza el método nextQ para avanzar de fila.
J A V A Inicial INFOPUC
INSTITUTO DE INFORMATICA

p o n t if ic ia UNIVERSIDAD CATÓLICA d e l p e rú

5. DriverManager

La clase DriverManager controla la carga de clases de drivers específicos y


provee el servicio de manejar el conjunto de drivers JDBC.

Esta clase primero trata de cargar un driver por omisión, que es el referido en la
propiedad del sistema jdbc.drivers.

Los drivers también pueden ser cargados dinámicamente en tiempo de ejecución


utilizando el método estático forName de la clase Class.

Ejemplo:
Class.forName(“com.mysql.jdbc. Driver”);

Cuando el método getConnection es invocado DriverManager cargará los drivers


según lo especificado.

6. Conectándose a una base de datos

Las conexiones a la base de datos son realizadas mediante el DriverManager.

Se utiliza el método:
DriverManager.getConnection(String url, String user, String passw);

Al momento de indicar la fuente de datos, la ubicación del recurso debe


especificarse como un URL JDBC, de la siguiente forma:

protocolo:subprotocolo://servidor:puerto/subnombre

por ejemplo :
jdbc:mysql://localhost:3306/dbname

Cuando una aplicación se conecta a una base de datos a través de JDBC crea
un objeto tipo (que implementa la interface) Connection:
Connection conn = DriverManager.getConnection(...);

84

X
J A V A Inicial IN F O P U C
BsSTJTUTG DE INFORMATICA

p o n t if ic ia UNIVERSIDAD CATÓ LICA d e l p e rú

7. Ejecución de consultas

Las dos clases principales para la ejecución de consultas en el API JDBC son
Statement y ResultSet.

El objeto Statement representa una sentencia SQL cualquiera hecha a la base


de datos (ya sean DDL, DML o DQL).

El flujo se sentencias estándar sería:


Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQueryfselect * from ta b la r);
// realizar diferentes operaciones
while (rs.next()) {
String dato = rs.getString(l);
}
stmt.close();

Los comandos DQL usan el método executeQuery() que devuelve un objeto


ResultSet, el cual mantiene un cursor que inicialmente se ubica en la 1ra fila. El
método next() avanza a la siguiente fila del resultado. Los comandos DDL y
DML usan executeUpdateQ que devuelve un int (código de error).

8. Conversiones de tipos de datos

Tipo SQL Método de Resultset Tipo Java


— . char getString String
varchar getString String
longvarchar getString String
numeric getBigDecimal java.math.BigDecimal
decimal getBigDecimal java.math.BigDecimal
bit getBoolean boolean
tinyint getByte byte
smallint getShort short
integer getlnt int
bigint getLong long
— real getFIoat float
float getDouble double
double getDouble double
date getDate java.sql.Date
time getTime java.sql.Time

85
J A V A Inicial | íf i| N J ÍJ f
IN F O P U C
INSTITUTO DE INFORMÁTICA

PO NTIHCIA UNIVERSIDAD CATÓLICA d e l p e rú

9. Otras características de JDBC

Se pueden utilizar las interfaces DatabaseMetaData y ResultSetMetaData para


inspeccionar los nombres de las tablas, nombres de columnas, etc.

Las conexiones JDBC son inicializadas en el modo auto-commit, con cada


sentencia SQL ejecutada como transacciones separadas.

Para ejecutar varias sentencias en una misma transacción:


• Deshabilitar auto-commit, setAutoCommit(false).
• El objeto Connection se convierte en la transacción.
• Invocar los métodos commit() o rollback().

10. PreparedStatement

El objeto PreparedStatement provee métodos del tipo setXXX para lograr pasar
parámetros a sentencias SQL.

Una vez que un parámetro es seteado, puede ser utilizado para múltiples
ejecuciones de esta sentencia (hasta que una llamada del tipo setXXX sea
hecha subsecuentemente a ese parámetro o se realice una llamada al método
clearParametersO).

El objeto PreparedStatement utiliza signos de interrogación (?) en su sintaxis que


actúan como variables para los parámetros a utilizar en la sentencia SQL.

Adicionalmente a los métodos setXXX, existen también métodos setObject que


realizarán conversiones a tipos de datos SQL específicos. Por ejemplo:
Java.útil.Date hoy = new java.útil.Date();
Stmt.setObject(3, hoy, Types.TIME);

86
JAVA Inicial INFOPUC
INSTITUTO DE INFORMATICA

p o n t ih c ia UNIVERSIDAD CATÓ LICA del p

11. CallableStatement

El API JDBC provee un estándar en la sintaxis para las llamadas a


procedimientos almacenados.

El objeto CallableStatement es creado mediante la invocación al método


prepareCall del objeto Connection, y éste puede ser creado de dos formas:

? = cali nombre_procedimiento (arg1, arg2, ...)


Cali nombre_procedimiento (arg1, arg2, ...)
Todos los parámetros de entrada deben ser inicializados mediante los métodos
setXXX().

Los parámetros de salida deben tener registrados el tipo de datos SQL al que se
refieren por medio del método registerOutParameter().

87

Você também pode gostar