Академический Документы
Профессиональный Документы
Культура Документы
Son
implementaciones de diferentes estructuras de datos en Java.
Estructuras de datos y Marco de Referencia de Colecciones. Todas las clases e interfaces que
forman el marco de colecciones se llaman estructuras de datos. Son contenedores que agrupan
mltiples elementos y representan como una sola entidad. Este marco nos permite guardar,
acceder, recuperar y manipular los elementos de datos que contienen. Estas clases son
encontradas en el paquete java.util. Las interfaces en este marco nos proveen de una estructura
bsica requerida para interactuar con los diferentes tipos de APIs. Nos permiten manipular las
colecciones sin preocuparnos por su representacin.
La Interfaz Collection. Es usada para manipular colecciones. Las clases concretas proveen
implementaciones para esta interfaz. Algunas colecciones permiten duplicados, otras no. Esta
interfaz puede usarse para transmitir una coleccin de objetos entre mtodos. Tpicamente, las
implementaciones tienen un constructor que acepta una Collection como parmetro. Esto le
permite al programador asignar un tipo de Collection a otro tipo, aunque sean diferentes sub-
tipos.
Object[] toArray();
Object[] toArray(Object a[]):
}
En el cdigo anterior, los mtodos add() y remove() devuelven true si la coleccin es modificada
despus de ser llamados. El mtodo contains() especifica si la coleccin contiene un objeto dado.
Los mtodos que afectan a toda la coleccin se llaman mtodos a nivel de coleccin.
Tambin podemos recorrer la coleccin con los mtodos de arreglos. Esta interfaz provee dos
mtodos para convertir una coleccin en arreglo. Una vez que la coleccin es convertida, puede
ser recorrida como si fuera un arreglo.
La Interfaz Set. Es una coleccin de elementos. No puede haber elementos duplicados en un Set.
Por ejemplo, podemos representar un conjunto de gerentes en la compaa, o un conjunto de
amigos. El mtodo equals() revisa cada objeto aadido a la coleccin para asegurarse que no
exista un objeto similar en el Set. El mtodo add() regresa false si el elemento ya existe y no
ocurren cambios en el Set.
La Clase HashSet. Se usa para guardar elementos de Set en una tabla hash. No garantiza el orden
de los elementos, porque el proceso de hashing no se presta a la creacin de Sets ordenados. Esta
clase extiende de la clase abstracta AbstractSet e implementa las interfaces Set, Cloneable y
Serializable.
}
}
Estas operaciones nos permiten obtener una vista ordenada de la porcin de SortedSet donde
todos los elementos:
Es importante notar que esta interfaz hereda las operaciones iterator y toArray de Set, pero
funcionan diferentes.
La Clase TreeSet. Implementa la interfaz Set y garantiza el orden de iteracin. Los objetos son
ordenados ascendentemente y guardados de forma de rbol binario de bsqueda a fin de que el
acceso y recuperacin de objetos sea fcil. Esta clase extiende de AbstractSet e implementa Set,
Cloneable y Serializable.
La Interfaz List. Una lista es una coleccin de elementos en un orden particular. La lista puede
contener elementos duplicados. Esta interfaz extiende de la interfaz Collection y tiene un ndice de
elementos. El ndice, que es un entero, denota la posicin de los elementos en la lista. Tambin
nos ayuda a incluir un nuevo elemento en la lista en una posicin especfica. Provee todas las
operaciones de la interfaz Collection, ms:
El mtodo add() est sobre-cargado para dar la habilidad de aadir un elemento en un ndice
especfico o al final de la coleccin como un vector. Lo mismo para aadir toda una coleccin a
partir de un ndice. El mtodo set() remplaza el elemento en la posicin especfica, el mtodo get()
regresa el elemento en la posicin especfica. El mtodo remove() est sobre-cargado para poder
borrar elementos por ndice o por valor. El mtodo listIterator() est sobre-cargado para regresar
un objeto ListIterator de toda la lista o solo de una parte empezando desde un ndice.
La Clase Vector. Es similar a un arreglo, pero el tamao del arreglo es esttico y el del vector
dinmico. Los arreglos pueden guardar valores primitivos o referencias a objetos. Sin embargo,
todos los elementos deben ser del mismo tipo. Los vectores no pueden guardar datos primitivos, y
s pueden contener cualquier combinacin de tipos de objeto. Los arreglos son accedidos a travs
de un ndice entero basado en cero. El mtodo elementAt(index) de la clase Vector se usa para
recuperar una referencia dada en el ndice especificado. Se requiere hacer cast al recuperar el
valor, ya que este mtodo regresa una referencia de tipo Object. Esta clase extiende de
AbstractList e implementa las interfaces List, Cloneable y Serializable. La capacidad inicial de un
vector es 10, y dobla su tamao cuando se llena el vector. Se puede indicar la capacidad inicial y
tambin el incremento de la capacidad.
La Clase ArrayList. Es similar a Vector, pero no tiene los mtodos elementAt() y addElement().
La Clase LinkedList. Aade nueva funcionalidad a la clase Vector. Tiene un constructor sobre-
cargado LinkedList(Collection c), que construye una lista inicializada con los elementos de la
coleccin c. Tiene mtodos como addFirst() y addLast, para aadir elementos al inicio o al final,
getFirst() y getLast() para obtener datos, y removeFirst() y removeLast() para borrar datos. Esta
clase extiende de AbstractSequentialList e implementa List, Cloneable y Serializable.
La Interfaz Map. En ocasiones, hay situaciones donde tenemos dos conjuntos de objetos, que son
mapeados a travs de alguna relacin. Los mapas se usan para mantener una coleccin de pares
de llave-valor, donde tanto la llave como el valor son objetos. Para eso usamos la interfaz Map. No
hereda de la interfaz Collection.
Cada llave puede mapearse con un mximo de un valor. Sin embargo, dos llaves diferentes pueden
apuntar al mismo objeto. No es posible tener llaves repetidas. Para aadir una entrada a un mapa,
se deben proveer tanto la llave como el valor. Estos son los contenidos de la interfaz Map:
La Clase Hashtable. Una tabla hash es una estructura de datos que mapea llaves a valores. Se usa
en circunstancias cuando no es necesario acceso secuencial. Permite a los desarrolladores un
medio ms especfico de acceso a datos diferente a valores ndices. La clase Hashtable extiende de
la clase Dictionary e impelementa las interfaces Map, Cloneable y Serializable.
La creacin y uso de una clase Hashtable es similar a la clase Vector. La instanciacin de esta clase
resulta en una tabla vaca, donde los elementos son aadidos usando el mtodo put(), con
argumentos llave y valor de tipo Object. Para guardar y recuperar exitosamente objetos de una
tabla hash, los objetos usados como llave deben implementar los mtodos hashCode() y equals(),
que la mayora de las clases en Java ya los implementan. El mtodo get() se usa para recuperar
valores basada en la llave que es pasada como argumento. Si no se encuentra la llave, se regresa
null. El mtodo remove() borra un elemento usando una llave como argumento. Este mtodo no
hace nada si la llave no est presente en la tabla.
La Clase HashMap. Esta es la mejor clase para implementar la interfaz Map. Ofrece todas las
operaciones de mapas, pero no garantiza el orden del mapa. Esta clase extiende de ABstractMap e
implementa Map, Cloneable y Serializable.
Las operaciones iterator y toArray funcionan diferente que la interfaz Map. Un iterador puede ser
obtenido usando la operacin iterator, con la cul podemos recorrer a SortedMap en un orden
particular. Se puede obtener un arreglo con el mtodo toArray, que tiene todos los elementos
(llaves y valores) de SortedMap en un orden particular.
La Clase TreeMap. Provee una implementacin de la interfaz SortedMap, que usa un rbol binario
de bsqueda para guardar los objetos en orden ascendente. Los tiempos de acceso y recuperacin
son rpidos. TreeMap tambin garantiza el orden de iteracin. Esta clase extiende de AbstractMap
e implementa las interfaces SortedMap, Cloneable y Serializable.
La Interfaz Enumeration. Puede usarse para recorrer cada elemento de una coleccin. Una serie de
elementos, uno a la vez, se generar mediante un objeto que implemente la interfaz Enumeration.
Esta interfaz tiene los mtodos:
La Interfaz Iterator. Se usa para recorrer cada elemento de una coleccin. Ofrece la misma
funcionalidad que la interfaz Enumeration, con un mtodo adicional que permite borrar un objeto.
Esto la hace preferible que Ennumeration.
La Interfaz ListIterator. Extiende de la interfaz Iterator. Aunque Iterator est diponible para todas
las colecciones de API, esta interfaz ListIterator provee mtodos adicionales a los provistos por
Iterator para manipulacin especfica de listas. Solo est disponible para las colecciones que
implementen la interfaz List. ListIterator nos permite ciclarnos a travs de la lista hacia delante y
hacia atrs. Tambin permite insercin y remplazo de elementos de la lista.
public int compare(Object obj1, Object obj2). Compara dos objetos. Si el primero es menor
que el Segundo, regresa un entero negativo. Si es igual, regresa un cero. Si no, regresa un
entero positivo
La Clase Collections. Esta clase tiene una coleccin de mtodos estticos, que son bsicamente
algoritmos asociados con estructuras de datos. Extiende de Object y puede realizar operaciones
sobre colecciones. Los mtodos incluyen:
Set Singleton. En Java, podemos obtener un conjunto singleton a travs del mtodo
Collections.singleton. Lo podemos usar para borrar todas las apariciones de un elemento
especfico en una coleccin.
collect.removeAll(Collections.singleton(element));
Tambin podemos usarlo para borrar todas las llaves que estn mapeadas a un valor particular.
Consideremos una coleccin, en la que los empleados (llave) estn mapeados a departamentos
para diferentes proyectos (valores). Asumamos que queremos borrar todos los empleados que
trabajan en proyectos de construccin:
employees.values().removeAll(Collections.singleton(CivilEngineers));
La Clase Arrays. Extiende de Object. Esta clase tiene un conjunto de mtodos estticos. Hay
mtodos para ordenar y para buscar (se debe ordenar antes de buscar), y mtodos que permiten
que los arreglos sean vistos como listas.
Colecciones en varios escenarios. Las siguientes reglas generales pueden usarse para determinar
qu objeto Collection usar:
VOLUMEN 8. UNIDAD 3
A travs de la API de conectividad a bases de datos de Java (JDBC), podemos conectarnos a toda
clase de bases de datos.
Trabajando con Bases de Datos. Hay tres tipos de BD, relacionales, objeto-relacionales y
orientadas a objetos.
Pasos involucrados en acceso a la BD. Para que podamos leer o escribir a la BD, necesitamos una
conexin entre el programa Java y el manejador de BD. Esto depende del driver de la BD provista
por el vendedor del RDBMS. Los pasos a seguir son:
java.sql.DriverManager
java.sql.Driver
java.sql.Connection
java.sql.Statement
java.sql.ResultSet
Estas son las cinco clases e interfaces bsicas. Tambin hay ms sofisticadas:
java.sql.ResultSetMetaData
java.sql.DatabaseMetaData
java.sql.PreparedStatement
java.sql.CallableStatement
Tipos de Drivers JDBC. JDBC soporta cuatro tipos de driver, que estn clasificados basados en su
capacidad de soportar lo siguiente:
Independencia de plataforma
Performance
Administracin del desplegado
Los cuatro tipos estn nombrados de 1 a 4, con el driver con mayor nmero proveyendo niveles
superiores de capacidad:
Tipo 2: Native-API Driver. Usan APIs nativos de la BD para comunicarse con ella. Hay drivers
especficos para comunicarse con Oracle, etc. Estos drivers usan la Java Native Interface (JNI). Solo
pueden correrse localmente, y no pueden ser usados en applets.
Tipo 3: Net-Protocol Driver. Son drivers de Java puros. No requieren instalacin especfica en la
mquina del cliente. Siguen un flujo de comunicacin de tres capas con la BD. Las peticiones de
datos son pasadas a un servidor middleware, que a su vez se comunica con la BD.
Tipo 4: Native-Protocol Driver. Tambin son puros. Pueden comunicarse con la BD directamente.
Convierten las llamadas JDBC protocolos DBMS especficos. Solo los vendedores de DBMS
proveen estos drivers.
Cargando el Driver. Para cargar un driver, necesitamos usar el mtodo forName() en la clase Class
con el nombre del driver como argumento. Esta clase est definida como public y final. No tiene
constructor pblico. Los objetos Class representan clases e interfaces en una aplicacin Java. Son
construdos automticamente por la JVM al cargarse las clases y por llamadas al mtodo
defineClass() en el cargador de la clase.
Class.forName(com.ibm.db2.jdbc.net.DB2Driver);
La Clase DriverManager. Su principal funcin es manejar un grupo de drivers JDBC. Esta clase, en la
etapa de inicializacin, tratar de cargar las clases Driver que estn referenciadas en las
propiedades del sistema, jdbc.drivers. Podemos usar esta clase para configurar los drivers JDBC
que usa la aplicacin. Cuando invocamos el mtodo getConnection(), el DriverManager que hemos
cargado para la aplicacin o applet, busca un driver conveniente del grupo de drivers que fueron
cargados.
Realizando una conexin. Podemos ejecutar estatutos SQL dentro del contexto de Connection y
obtener los resultados despus de ejecutarlos. Podemos usar el mtodo getMetaData() para
obtener informacin acerca de la BD conectada, como procedimientos almacenados, tablas, etc. Si
auto-commit est habilitado, los cambios hechos a la BD son automticamente modificados y
guardados. Si no, explcitamente debemos invocar el mtodo commit para actualizar y grabar los
cambios.
protocolo:<sub-protocolo>:<sub-nombre>
jdbc:odbc:Sample
Connection connection;
connection = DriverManager.getConnection(databaseURL,user2,abcd);
Una conexin es una sesin de BD individual. Podemos tener cualquier nmero de conexiones en
un programa.
Creando Objetos Statement. Al conectarnos, podemos crear estatutos SQL: UPDATE, INSERT,
DELETE Y SELECT. La interfaz Statement provee mtodos para hacer estas llamadas. Regresa el
nmero de renglones en caso de los tres primeros estatutos. Regresa el resultado para SELECT.
Primero declaramos el objeto Statement y a travs del objeto Connection creamos un estatuto
usando el mtodo createStatement(). La interfaz provee los siguientes mtodos:
El String pasado como argumento sigue la sintaxis de SQL. Para usar SELECT, debemos usar la
interfaz ResultSet.
Todos son mtodos sobrecargados que toman un entero o un string como argumentos. El
argumento entero es el nmero de columna, y el string es el nombre de la columna de la tabla. Si
se usa el nmero, se tiene que especificar en el mismo orden que fue especificado en el estatuto
SELECT.
Todas las clases e interfaces usadas con BD lanzan SQLException, que necesita ser atrapada y
manejada.
}
public static void main(String args[])
{
try
{
DBAAccesor dba = new DBAAccesor();
dba.insertData();
dba.retriveData();
dba.updateData();
dba.deleteData();
}
catch (SQLException e)
{
System.out.println(e);
}
catch (Exception e)
{
System.out.println(e);
}
}
}
Interfaz ResultSetMetadata.
}
void displayAboutResultData() throws SQLException
{
ResultSetMetaData rsmd;
int nullable;
ResultSet rs = null;
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM student");
rsmd = rs.getMetaData();
System.out.println("El numero de columnas es: " +
rsmd.getColumnCount());
System.out.println("El nombre de la columna 1 es: " +
rsmd.getColumnName(1));
System.out.println("El tipo de la columna 1 es: " +
rsmd.getColumnType(1));
nullable = rsmd.isNullable(1);
switch (nullable)
{
case 0: System.out.println("La columna " +
rsmd.getColumnName(1) + " no es nula");
break;
case 1: System.out.println("La columna " +
rsmd.getColumnName(1) + " es nula");
break;
default: System.out.println("La columna " +
rsmd.getColumnName(1) + "no se sabe su estatus");
}
}
public static void main(String[] args)
{
try
{
JDBCSample jdbcs = new JDBCSample();
jdbcs.displayAboutResultData();
}
catch (Exception e)
{
System.out.println(e);
}
}
}
La Clase DatabaseMetaData. Esta clase da informacin de la base de datos. Tiene alrededor de 150
mtodos, para proveer informacin de si la conexin es solo lectura, el nombre del usuario de la
conexin, las llaves primarias de una tabla, las tablas presentes en la base de datos, la URL de la
base de datos, el nombre del driver JDBC.
}
public void displayDatabaseMetaData() throws SQLException
{
DatabaseMetaData dmd;
dmd = conn.getMetaData();
System.out.println("La URL es: " + dmd.getURL());
System.out.println("El nombre del usuario es: " +
dmd.getUserName());
System.out.println("El nombre del driver es: " +
dmd.getDriverName());
if (dmd.isReadOnly())
System.out.println("La BD es de solo lectura");
else
System.out.println("La BD no es de solo lectura");
}
public static void main(String[] args)
{
try
{
MetaDataSample mds = new MetaDataSample();
mds.displayDatabaseMetaData();
}
catch (Exception e)
{
System.out.println(e);
}
}
}
JDBC 2.0. Incorpora los tipos de datos SQL3, tambin conocidos como SQL-99. Las nuevas
interfaces son:
ResultSets desplazables
Modificaciones batch
Inserciones, modificaciones y borrado programticos
Soporte para zonas horarias en las clases Date, Time y Timestamp
VOLUMEN 8. UNIDAD 5
La Clase PreparedStatement. Sirve para crear un estatuto SQL una vez y usarlo cada vez que
deseemos correrlo. Es una llamada pre-compilada a la base de datos que requiere parmetros
para enlazarse. Con esta clase, que recibe como argumento el estatuto SQL, el estatuto ser
enviado a la DBMS inmediatamente, donde se compila solo una vez, mientras que un objeto
Statement contiene estatutos no-compilados, que se compilan cada vez que se ejecuta el estatuto.
Los valores para el estatuto SQL se proveen cuando el estatuto es utilizado. Cuando usamos el
objeto PreparedStatement, no especificamos valores al tiempo de creacin del objeto. Solo
colocamos separadores de lugar usando el smbolo ? y despus sustituimos cada smbolo ? con el
valor real.
stmt.setInt(1,100);
stmt.setString(2,Dennis);
stmt.execute();
Las primeras dos lneas establecen los valores en el orden que las columnas estn establecidas. El
primer smbolo ? corresponde a 1, el segundo a 2, y as sucesivamente. El 1 y 2 son llamados
ndices de parmetros. Los mtodos setXXX enlazan los parmetros de entrada con los valores.
As, un 100 se establecer para col1 y Dennis para col2. El tercer estatuto simplemente ejecuta el
estatuto pre-compilado. No usamos executeUpdate(). Sin embargo, si usamos un estatuto SELECT,
tambin debemos usar executeQuery().
Procedimientos Almacenados. Hasta ahora, hemos incrustado estatutos SQL en el cdigo Java y los
enviamos a la BD. Con los procedimientos almacenados, que es un concepto de BD disponible de
ese lado, podemos poner los estatutos en una caja negra, darle un nombre a la caja negra y
llamarla desde cualquier cdigo Java mediante ese nombre. Las similitudes y diferencias entre los
procedimientos almacenados y un PreparedStatement son:
Ambos son llamadas a SQL pre-compiladas, residentes en el lado del servidor. La rapidez
de ejecucin es alta en ambos.
Un PreparedStatement usa comodines y se enva al servidor. Los valores se enlazan
cuando el estatuto es invocado.
Un procedimiento almacenado es invocado como una funcin normal, usando el nombre
del procedimiento y pasndole argumentos.
Un PreparedStatement solo requiere parmetros de entrada.
Un procedimiento almacenado permite a los programadores enlazar parmetros de
entrada y salida
Con un procedimiento almacenado, el programador solo necesita saber la interfaz de
llamada a la base de datos.
Cuando el procedimiento almacenado se crea, reside en la BD. El programa realiza una llamada a
ellos usando el objeto CallableStatement. Pueden ser creados usando la interfaz del DBMS o
mediante programas de Java. El siguiente es un estatuto SQL para crear un procedimiento
almacenado:
BEGIN
OPEN cursor1;
END
Es posible crear procedimientos almacenados con comodines que sean despus remplazados por
valores durante la llamada. Hay tres tipos de parmetros posibles, IN, OUT e INOUT. Para
especificar comodines en procedimientos almacenados, necesitamos declararlos y entonces
usarlos.
BEGIN
END
Habiendo creado el procedimiento, necesitamos escribir un programa que lo llame y lo use. Para
ello, necesitamos usar la interfaz CallableStatement y el mtodo prepareCall() de la interfaz
Connection. Este mtodo toma un argumento con la siguiente sintaxis:
{call nombreProcedimiento}
cstmt.setInt (1,100);
cstmt.executeUpdate();
cstmt.setInt (1,100);
cstmt.registerOutParameter(2,java.sql.Types.VARCHAR);
cstmt.executeUpdate();
rs = cstmt.executeQuery();
String s = cstmt.getString(2);
public class StoredProcedureUsage
{
public static void main(String[] args)
{
try
{
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
Connection conn =
DriverManager.getConnection("jdbc:db2:Sample","db2admin","db2admin");
System.out.println("Llamando al procedimiento
almacenado: ");
CallableStatement cstmt = conn.prepareCall("{call
PRODUCTSFINDPROC(?,?)}");
cstmt.setInt(1,100);
cstmt.registerOutParameter(2,java.sql.Types.VARCHAR);
cstmt.executeQuery();
System.out.println("Nombre: " + cstmt.getString(2));
cstmt.close();
conn.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Manejo de transacciones
Soporte a cursores
Procesamiento de mltiples ResultSets
Soporte a cursores. Permite que una aplicacin obtenga un cursor asociado con un ResultSet a
travs del mtodo getCursorName(). Se deben pasar dos argumentos al createStatement() o al
prepareStatement() para indicarle al compilador que el objeto ResultSet es desplazable. Los dos
argumentos son: tipo de ResultSet y concurrencia del ResultSet. El tipo puede ser cualquiera de las
variables de clase definidas:
Usando el mtodo setFetchDirection() del ResultSet, podemos hacer que el cursor se mueva hacia
delante o hacia atrs. Este mtodo toma un parmetro entero, que puede ser una de las
siguientes variables de clase:
Procesamiento de ResultSet mltiples. En algunos casos podemos necesitar que una aplicacin
retorne mltiples ResultSet. Esto se logra usando el mtodo Statement.getmoreResults(), que
regresa true si el siguiente resultado en un objeto ResultSet. La aplicacin puede obtener el
siguiente ResultSet llamando Statement.getResultSet(). Para procesarlos, nos ciclamos a travs de
la base de datos mientras que Statement.getMoreResults() sea true.
try
{
conn =
DriverManager.getConnection("jdbc:db2:Sample","db2admin","db2admin");
}
catch (SQLException sqle)
{
sqle.printStackTrace();
while (sqle = sqle.getNextException()) != null)
sqle.printStackTrace();
}
La Clase SqlWarning. Se usa para guardar errores no fatales. Extiende de SQLException. Los
programadores pueden usar el mtodo getWarnings() para listar todos los errores.
La Clase DataTruncation. Est encadenada a un error no fatal o lanzada como excepcin cuando
JDBC encuentra datos truncados. Si leemos un flotante como entero, se encadena un error no fatal
y si escribimos un flotante como entero, se lanza una excepcin.
Las Clases Date, Time y Timestamp. Heredan de java.util.Date. Estn extendidas para proveer
diferentes niveles de granularidad a la informacin existente en Date.
La clase Types. Esta clase define constantes usadas para identificar tipos SQL genricos, llamados
tipos JDBC. Nunca se instancia. Algunas de las variables de clase que mantiene son ARRAY, BIT,
BINARY, CHAR, CLOB, DATE, INTEGER, NUMERIC, REAL y VARCHAR.