Вы находитесь на странице: 1из 29

Colecciones de API. Una coleccin se puede definir como un conjunto de objetos.

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.

public interface Collection


{
boolean add(Object element);
boolean contains(Object element);
boolean equals(Object element);
int hashCode();
boolean isEmpty();
Iterator iterator();
boolean remove(Object element);
int size;

boolean addAll(Collection c);


void clear();
boolean containsAll(Collection c);
boolean removeAll(Collection c);
boolean retainAll(Collection c);

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.

addAll() aade todos los elementos de la coleccin especificada a la coleccin actual.


clear() borra todos los elementos de la coleccin.
containsAll() regresa true si la coleccin contiene todos los elementos presentes en la
coleccin pasada como parmetro.
retainAll() retiene solo los elementos actuales provistos en la coleccin pasada como
parmetro. Borra los elementos que no se encuentran en la coleccin parmetro.
Iterator() regresa un objeto Iterator. Nos permite recorrer la 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.

public class HashSetExample


{
public static void main(String[] args)
{
Set<String> argumentList = new HashSet<String>();
for (int i = 0; i < args.length; i++)
if (!argumentList.add(args[i]))
System.out.println("Elemento duplicado " +
args[i]);
System.out.println("Tamano del Set de elementos diferentes "
+ argumentList.size() + " " + argumentList);
Set<String> otra = new HashSet<String>();
otra.addAll(argumentList);
System.out.println("La copia contiene " + otra.size() + " " +
otra);
otra.remove("perro");
System.out.println("La copia contiene " + otra.size() + " " +
otra);

}
}

La Interfaz SortedSet. Los elementos de esta interfaz estn ordenados ascendentemente, o en su


orden natural o de acuerdo al comparador disponible durante la creacin del objeto. Las
comparaciones de un SortedSet se realizan con el mtodo compareTo(). Esta interfaz provee ms
mtodos que son:

public interface SortedSet extends Set


{
public SortedSet headSet(Object endElement);
public SortedSet subSet(Object startElement, Object
endElement);
public SortedSet tailSet(Object startElement);
public Object first();
public Object last();
public Comparator comparator();
}

Estas operaciones nos permiten obtener una vista ordenada de la porcin de SortedSet donde
todos los elementos:

Son estrictamente menores que endElement


Se encuentran entre startElement (inclusive) y endElement exclusive
Son mayores o iguales a startElement
Podemos obtener el elemento menor del Set
Podemos obtener el elemento mayor del Set
Podemos obtener el comparador usado para ordenar los elementos. Si se ordena de forma
natural, el mtodo regresa null

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.

public class TreeSetRetainExample


{
public static void main(String args[])
{
Set<String> firstSet = new TreeSet<String>();
Set<String> secondSet = new TreeSet<String>();
firstSet.add("RAT");
firstSet.add("CAT");
firstSet.add("MAT");
firstSet.add("BAT");
secondSet.add("BALL");
secondSet.add("CAP");
secondSet.add("MAT");
System.out.println("El primer Set contiene: " + firstSet);
System.out.println("El segundo Set contiene: " + secondSet);
Set<String> symmetricSet = new TreeSet<String>(firstSet);
symmetricSet.addAll(secondSet);
System.out.println("Los valores de ambos Sets: " +
symmetricSet);
Set<String> tempSet = new TreeSet<String>(firstSet);
tempSet.retainAll(secondSet);
symmetricSet.removeAll(tempSet);
System.out.println("Los valores de ambos Sets excepto
repetidos : " + symmetricSet);
System.out.println("Los valores comunes: " + tempSet);
}
}

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:

Acceder a un elemento especificando su posicin


Buscar un elemento especfico
Realizar operaciones de iteraciones de lista
Realizar operaciones de rangos de elementos

public interface List extends Collection


{
public void add(int index, Object element);
public boolean addAll(int index, Collection c);
public Object get(int index);
public Object remove(int index);
public Object set(int index, Object element);
public int indexOf(Object element);
public int lastIndexOf(Object element);
public ListIterator listIterator();
public ListIterator listIterator(int index);
public List subList(int startIndex, int endIndex);
}

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.

El mtodo indexOf() regresa el ndice de la primera ocurrencia del elemento o -1 si la lista no


contiene el elemento especificado. El mtodo lastIndexOf() regresa el ndice de la ltima
ocurrencia del elemento o -1 si la lista no contiene el elemento especificado. El mtodo subList()
regresa un subconjunto de List dentro del rango provisto.

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.

public class MergeList


{
public static void main(String[] args)
{
Vector<String> v = new Vector<String>();
v.addElement("Manzana");
v.addElement("Platano");
MergeList tempList = new MergeList();
tempList.merge(v);
tempList.arrayListDisplay(v);
}
private void arrayListDisplay(Collection<String> c)
{
ArrayList<String> tempList = new ArrayList<String>(c);
System.out.println(tempList);
}
private void merge(Collection<String> c)
{
LinkedList<String> merger = new LinkedList<String>(c);
merger.addFirst("Naranja");
merger.add("Pomelo");
merger.removeLast();
System.out.println(merger);
}
}

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:

public interface Map


{
public boolean containsKey(Object key);
public boolean containsValue(Object value);
public Object get(Object key);
public void put(Object key, Object value);
public void remove(Object key);
public void putAll(Map t);
public Set entrySet();
public Set keySet();
public Collection values();
}

Las operaciones bsicas definidas en la interfaz realizan lo siguiente:

Determinar si el mapa tiene la llave especificada


Determinar si el mapa tiene el valor especificado con al menos una llave
Obtener el valor que est mapeado a una llave especfica
Mapear un valor especfico con una llave especfica en el mapa
Borrar el mapeo de una llave especfica
Copiar todos los mapeos del mapa especificado al mapa actual
Obtener una vista de conjunto de los mapeos
Obtener una vista de conjunto de las llaves
Obtener una vista de coleccin de los valores

La siguiente es la interfaz Entry usada para elementos entrySet:

public interface Entry


{
public boolean equals(Object obj);
public Object getKey();
public Object getValue();
public int hashCode();
public Object setValue(Object value);
}

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.

public class MapDemo


{
public static void main(String args[])
{
Map<Integer, String> courseHash = new Hashtable<Integer,
String>();
courseHash.put(new Integer(1),"Ingles");
courseHash.put(new Integer(2),"Espanol");
courseHash.put(new Integer(3),"Mate");
System.out.println(courseHash.get(new Integer(3)));
System.out.println(courseHash);
Map<Integer, String> marksMap = new HashMap<Integer,
String>();
marksMap.put(new Integer(1),"Ingles");
marksMap.put(new Integer(2),"Espanol");
marksMap.put(new Integer(3),"Mate");
System.out.println(marksMap.get(new Integer(2)));
System.out.println(marksMap);
}
}

La Interfaz SortedMap. Aade la misma funcionalidad de ordenamiento que SortedSet le aade a


la interfaz Set. El orden puede ser ascendente, natural y de acuerdo a un comparador disponible
durante la creacin del objeto. Esta interfaz extiende de Map y realiza importantes comparaciones
usando el mtodo compareTo().

public interface SortedMap extends Map


{
SortedMap subMap(Object fromKey, Object toKey);
SortedMap headMap(Object toKey);
SortedMap tailMap(Object fromKey);
Object first();
Object last();
Comparator comparator();
}

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.

public class TreeMapExample


{
private static final Integer ONCE = new Integer(1);
public static void main(String args[])
{
Map<String, Integer> map = new TreeMap<String, Integer>();
for (int j = 0; j < args.length; j++)
{
Integer frecuency = (Integer) map.get(args[j]);
map.put(args[j], (frecuency == null? ONCE : new
Integer(frecuency.intValue() + 1)));
}
System.out.println("Numero de palabras distintas detectadas "
+ map.size());
System.out.println(map);
}
}

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:

public boolean hasMoreElements(). Se utiliza para determinar si hay ms elementos


presentes en la coleccin

public Object nextElement(). Se usa para acceder al siguiente elemento disponible en la


coleccin

public class EnumerationExample


{
public static void main(String[] args)
{
Vector<String> v = new Vector<String>();
v.addElement("Manzana");
v.addElement("Platano");
v.addElement("Sandia");
v.addElement("Pera");
Enumeration<String> enume = v.elements();
while (enume.hasMoreElements())
System.out.println(enume.nextElement());
}
}

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.

public interface Iterator


{
boolean hasNext();
Object next();
void remove();
}
public class IteratorExample {
public static void main(String[] args)
{
ArrayList<String> aList = new ArrayList<String>();
aList.add("Manzana");
aList.add("Platano");
aList.add("Chicozapote");
Iterator<String> i = aList.iterator();
while (i.hasNext())
System.out.println(i.next());
}
}

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 interface ListIterator extends Iterator


{
void add(Object o);
boolean hasPrevious();
int nextIndex();
Object previous();
int previousIndex();
void set(Object o);
}

public class IterationListExample


{
public static void main(String args[])
{
List<String> l = new ArrayList<String>();
l.add("Peral");
l.add("Jacaranda");
l.add("Macuilis");
l.add("Guayacan");
ListIterator<String> li = l.listIterator();
String val = "Peral";
String newVal = "Tulipan";
for (li = l.listIterator(); li.hasNext();)
if (val == null ? li.next()==null :
val.equals(li.next()))
li.set(newVal);
li = l.listIterator();
while (li.hasNext())
System.out.println(li.next());
}
}
La Interfaz Comparator. Provee control sobre el orden de las colecciones. Podemos especificar el
orden pasando un comparador al mtodo que realiza el ordenamiento. Esta interfaz tiene los
siguientes mtodos:

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

public Boolean equals(Object obj). Determina si el objeto pasado como argument es


tambin un comparador imponiendo el mismo orden que el comparador actual.

public class CollectionExample implements Comparator<String>


{
@Override
public int compare(String o1, String o2)
{
return o1.toLowerCase().compareTo(o2.toLowerCase());
}
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("MAT");
list.add("CAT");
list.add("BAT");
list.add("ball");
list.add("MAT");
System.out.println("Resultado del ordenamiento ignorando
mayusculas");
Collections.sort(list,new CollectionExample());
Iterator<String> iter = list.iterator();
while (iter.hasNext())
System.out.println(iter.next());
System.out.println("Resultado del ordenamiento con
mayusculas");
Collections.sort(list);
iter = list.iterator();
while (iter.hasNext())
System.out.println(iter.next());
}
}

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:

Ordenamiento. En orden ascendente o de acuerdo al orden natural de los elementos


Bsqueda
Valor mximo de una coleccin
Shufling. Revolver la coleccin de manera aleatoria
Poner al revs la coleccin

public class AlgorithmsExample


{
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("MAT");
list.add("CAT");
list.add("BAT");
list.add("BALL");
System.out.println("Los valores de la lista son: " + list);
Collections.reverse(list);
System.out.println("Los valores de la lista al reves son: " +
list);
Random rnd = new Random();
Collections.shuffle(list,rnd);
System.out.println("Los valores de la lista aleatoria son: "
+ list);
System.out.println("La llave se encontro en el indice " +
Collections.binarySearch(list,new String("BAT")));
Collections.sort(list);
System.out.println("Los valores de la lista ordenados son: "
+ list);
}
}

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.

public class ArraysExample


{
public static void main(String[] args)
{
String objectArray[] = new String[]
{"MAT","CAT","BAT","BALL"};
System.out.println("Los valores de la lista son: " +
Arrays.asList(objectArray));
Arrays.sort(objectArray);
System.out.println("Los valores de la lista ordenada son: " +
Arrays.asList(objectArray));
int index = Arrays.binarySearch(objectArray, "BAT");
System.out.println("El indice de BAT es " + index);
}
}

Colecciones en varios escenarios. Las siguientes reglas generales pueden usarse para determinar
qu objeto Collection usar:

Si la secuencia no es importante, se deben usar las versiones hash para mejorar el


performance.
Un HashSet debe usarse si no se requieren duplicados, mientras que HashMap debe
usarse si se desea una relacin llave-valor.
Solo Vector.Stack y Hashtable estn sincronizadas y tienen buen performance
considerando los requerimientos de sincronizacin.
TreeSet y TreeMap pueden usarse para versiones ordenadas de sus clases respectivas.
ArrayList es similar a Vector sin sincronizacin.
LinkedList es mejor para situaciones con alto trfico de insercin y borrado. El acceso
general en este caso es mucho menor que ArrayList.
Iterators lanzan ConcurrentModificationException si se modifican mientras el iterador est
activo. El uso de Enumerator no soporta esto.

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:

Cargar un driver que conecte el programa Java y la BD en memoria.


Establecer una conexin a la base de datos a travs del driver.
Ejecutar estatutos SQL usando la conexin establecida.
Cerrar la conexin.
La API JDBC. Para trabajar con JDBC, necesitamos importar clases e interfaces en el paquete
java.sql.

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

Entendamos como estas clases e interfaces nos ayudan a realizar la programacin:

El DriverManager carga el driver requerido directamente


La aplicacin utiliza DriverManager para establecer conexiones a la BD
El Driver crea las conexiones internamente
La aplicacin usa el objeto Connection para obtener objetos Statement
Los conjuntos de resultados son recibidos de objetos Statement por la aplicacin
La aplicacin deriva datos del objeto ResultSet
El objeto Connection agrega el objeto DatabaseMetaData
El objeto Statement agrega el objeto ResultSet
El objeto ResultSet agrega el objeto ResultSetMetaData
El PreparedStatement hereda de Statement
El CallableStatement hereda de PreparedStatement

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:

JDBC-ODBC driver (Tipo 1).


Native-API driver (Tipo 2)
Net-Protocol driver (Tipo 3)
Native-Protocol driver (Tipo 4)
Tipo 1: JDBC-ODBC Driver. ODBC significa Open DataBase Connectivity. Estos drivers son
especficos a una BD y se require que conviertan llamadas de API JDBC para comunicarse con la
BD. Estos drivers se conocen como puentes. Solo pueden correrse localmente, y no pueden ser
usados en applets.

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);

Al invocar Class.forName automticamente creamos una instancia de la clase Driver y la registra


con el DriverManager. No creamos una instancia explcita del Driver. Ya que est cargado, puede
ser conectado a un DBMS.

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.

El mtodo getConnection() toma tres argumentos:


La URL de la BD
El ID del usuario
La contrasea del usuario

Una URL de BD consiste en tres partes, separadas por dos puntos:

protocolo:<sub-protocolo>:<sub-nombre>

El protocolo es la fuente de datos del JDBC. El sub-protocolo es especfico a una implementacin


JDBC. Normalmente toma el nombre de la DBMS y la versin. El sub-nombre es especfico a la
DBMS y le dice al driver dnde necesita conectarse la aplicacin.

jdbc:odbc:Sample

La conexin a IBM UDB DB2:

Connection connection;

String databaseURL = jdbc:db2://PALPRIMER:8000/; //hostname:puerto

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:

executeUpdate(): Para INSERT, UPDATE y DELETE.


executeQuery(): Para ejecutar estatutos que regresen un objeto ResultSet.

El String pasado como argumento sigue la sintaxis de SQL. Para usar SELECT, debemos usar la
interfaz ResultSet.

Usando ResultSet. El ejemplo muestra su uso:

Statement stat = connection.createStatement();


ResultSet res = stat.executeQuery("SELECT * FROM tableName");

El mtodo executeQuery() puede regresar ms de un rengln, que es capturado en el ResultSet.


Para iterar a travs de l, usamos el mtodo next() provisto en la interfaz, y se usa an para el
primer rengln. Para recuperar los datos, usamos los mtodos getXXX de la interfaz, y los ms
comunes son:
getInt()
getString()
getFloat()
getLong()
getShort()
getDate()
getTime()
getByte()

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 class DBAAccesor


{
Connection conn;
Statement stmt;
DBAAccesor() throws SQLException, ClassNotFoundException
{
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
conn =
DriverManager.getConnection("jdbc:db2:Sample","db2admin","db2admin");
}
void insertData() throws SQLException
{
stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO products (id,nombre) VALUES
(1,'PAPEL')");
stmt.close();
}
void retriveData() throws SQLException
{
ResultSet rs;
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT id, nombre FROM products");
System.out.println("Tabla de productos");
while (rs.next())
System.out.println("Id: " + rs.getInt(1) + "Nombre: " +
rs.getString(2));
rs.close();
}
void updateData() throws SQLException
{
stmt = conn.createStatement();
stmt.executeUpdate("UPDATE products SET nombre = 'HOJA' WHERE
id=1");
stmt.close();
}
void deleteData() throws SQLException
{
stmt = conn.createStatement();
stmt.executeUpdate("DELETE products WHERE id=1");
stmt.close();

}
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);
}
}
}

Trabajando con Interfaces MetaData. La interfaz ResultSetMetaData provee ms informacin


sobre los objetos ResultSet. La clase DatabaseMetaData se relaciona con el objeto Connection.

Interfaz ResultSetMetadata.

Nombre del mtodo Regresa Descripcin


getColumnCount() int El nmero de columnas en el objeto
getColumnLabel(int col) String El ttulo de la columna para desplegar
getColumnName(int col) String El nombre de la columna
getColumnType(int col) String El tipo SQL de la columna
getColumnTypeName(int col) String El nombre especfico de la BD de la columna
getTableName(int col) String El nombre de la tabla de la columna
IsCaseSensitive(int col) boolean Si es importante maysculas/minsculas
isNullable(int col) boolean El estatus de nulo de la columna
isReadOnly(int col) boolean Si la columna puede ser modificada o no
isSearchable(int col) boolean Si la columna puede usarse en la clusula WHERE

public class JDBCSample


{
Connection conn;
Statement stmt;
public JDBCSample() throws SQLException, ClassNotFoundException
{
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
conn =
DriverManager.getConnection("jdbc:db2:Sample","db2admin","db2admin");

}
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 class MetaDataSample


{
Connection conn;
Statement stmt;
public MetaDataSample() throws SQLException, ClassNotFoundException
{
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
conn =
DriverManager.getConnection("jdbc:db2:Sample","db2admin","db2admin");

}
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:

Array: Mapea a un tipo de datos arreglo de SQL


Blob: Interfaz para los objetos binarios grandes (SQL BLOB)
Clob: Interfaz para los objetos caracteres grandes (SQL CLOB)
Ref: Una referencia a un tipo estructurado de SQL. Puede ser guardado en
almacenamiento persistente
SQLData: La interfaz usada para el mapeo de tipos de datos definidos por el usuario de
SQL
SQLInput: Un stream de entrada que contiene un stream de valores representando una
instancia de SQL estructurado o tipo distinct
SQLOutput: Un stream de salida para escribir los atributos de tipos definidos por el usuario
a la BD
Struct: El mapeo estndar para un tipo de datos estructurado de SQL
JDBC 2.0 tambin provee una nueva excepcin llamada BatchUpdateException, que se lanza
cuando se encuentra un error durante una modificacin batch.

Las siguientes son algunas de las nuevas funcionalidades aadidas:

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.

PreparedStatement stmt = con.prepareStatement(INSERT INTO tableName (col1, col2)


VALUES (?,?));

Usamos prepareStatement() en lugar de createStatement(). Los valores sern pasados as:

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().

public class PreparedStatementExample


{
Connection conn;
PreparedStatement ipStmt, rpStmt;
public PreparedStatementExample() throws SQLException,
ClassNotFoundException
{
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
conn =
DriverManager.getConnection("jdbc:db2:Sample","db2admin","db2admin");
ipStmt = conn.prepareStatement("INSERT INTO suppliers
(id,nombre) VALUES (?,?)");
rpStmt = conn.prepareStatement("SELECT * FROM suppliers WHERE
id = ?");
}
public void insertData() throws SQLException
{
int id[] = {1,2,3};
String nombre[] = {"Juan","Pedro","Luis"};
for (int i = 0; i < 3; i++)
{
ipStmt.setInt(1,id[i]);
ipStmt.setString(2,nombre[i]);
ipStmt.execute();
}
ipStmt.close();
}
public void retrieveData() throws SQLException
{
ResultSet rs;
rpStmt.setInt(1,2);
rs = rpStmt.executeQuery();
System.out.println("Tabla de proveedores: ");
while (rs.next())
System.out.println("Id: " + rs.getInt(1) + " Nombre: "
+ rs.getString(2));
rs.close();
}
public static void main(String[] args)
{
try
{
PreparedStatementExample ps = new
PreparedStatementExample();
ps.insertData();
ps.retrieveData();
}
catch (Exception e)
{
System.out.println(e);
}
}
}

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:

CREATE PROCEDURE procName()

BEGIN

DECLARE cursor1 CURSOR WITH RETURN FOR SELECT * FROM tableName;

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.

CREATE PROCEDURE productsFindProc(IN id INTEGER, OUT pname VARCHAR(200))

BEGIN

SET pname = (SELECT pname FROM products WHERE pid = id);

END

public class StoreProcedureCreation


{
public static void main(String[] args)
{
try
{
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
Connection conn =
DriverManager.getConnection("jdbc:db2:Sample","db2admin","db2admin");
Statement stmt = conn.createStatement();
String createProc = "CREATE PROCEDURE PRODUCTSFINDPROC
( IN id INTEGER, OUT pname VARCHAR(200)) " +
"BEGIN " +
"SET pname = (SELECT PNAME FROM PRODUCTS WHERE PID =
id);" +
"END";
stmt.executeUpdate(createProc);
System.out.println("Procedimiento creado");
stmt.close();
conn.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

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}

Cuando esto es realizado, el procedimiento almacenado queda registrado con el objeto


Statement. A continuacin usamos executeQuery(), executeUpdate() execute().

CallableStatement cstmt = con.prepareCall({call PRODUCTSPROC (?)});

cstmt.setInt (1,100);

cstmt.executeUpdate();

Si utilizamos un parmetro de salida, en el cdigo Java que invoca el procedimiento, necesitamos


invocar un mtodo llamado registerOutParameter()) de CallableStatement para registrar al
parmetro como un parmetro de salida.

CallableStatement cstmt = con.prepareCall({call PRODUCTSFINDPROC (?,?)});

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();
}
}
}

Otras funcionalidades. JDBC provee las siguientes funcionalidades:

Manejo de transacciones
Soporte a cursores
Procesamiento de mltiples ResultSets

Manejo de transacciones. No siempre es deseable hacer auto-commit. Para que los


programadores puedan controlar el commit de las transacciones, JDBC implementa un mtodo
llamado setAutoCommit(), que toma un valor true para indicar el auto-commit, y false para indicar
que el programador inducir el commit de transacciones explcito, mediante el mtodo commit().
Adems, en ocasiones los datos deben sufrir un roll-back. Para ello usamos el mtodo rollback().
Estos tres mtodos estn disponibles en la clase Connection.

public class TransactionPairsExample


{
public static void main(String[] args)
{
Connection conn = null;
Statement stmt;
PreparedStatement salesUpdate;
PreparedStatement totalUpdate;
String updateSales = "UPDATE product SET sales = ? WHERE name
= ?";
String updateTotal = "UPDATE product SET total = total + ?
WHERE name = ?";
String query = "SELECT name, sales, total FROM product";
try
{
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
conn =
DriverManager.getConnection("jdbc:db2:Sample","db2admin","db2admin");
salesUpdate = conn.prepareStatement(updateSales);
totalUpdate = conn.prepareStatement(updateTotal);
int[] wsales = {105,50,0,105};
String[] products =
{"Lavaplatos","Sonido","Camara","TV"};
conn.setAutoCommit(false);
for (int i = 0; i < products.length; i++)
{
salesUpdate.setInt(1,wsales[i]);
salesUpdate.setString(2,products[i]);
salesUpdate.executeUpdate();
totalUpdate.setInt(1,wsales[i]);
totalUpdate.setString(2,products[i]);
totalUpdate.executeUpdate();
conn.commit();
}
conn.setAutoCommit(true);
salesUpdate.close();
totalUpdate.close();
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next())
{
String product = rs.getString("name");
int sale = rs.getInt("sales");
int total = rs.getInt("total");
System.out.println(product + " " + sale + " " +
total);
}
stmt.close();
conn.close();
}
catch (SQLException e1)
{
System.err.println("Excepcion de SQL " +
e1.getMessage());
if (conn != null)
{
try
{
System.err.println("La transaccion esta en
roll-back");
conn.rollback();
}
catch (SQLException e2)
{
System.err.println("Excepcion de SQL " +
e2.getMessage());
}
}
}
catch (Exception e)
{
System.out.println(e);
}
}
}

Ahora un ejemplo de procesamiento batch:

public class BatchUpdateExample


{
public static void main(String[] args) throws SQLException
{
ResultSet rs = null;
Connection conn;
Statement stmt;
try
{
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
conn =
DriverManager.getConnection("jdbc:db2:Sample","db2admin","db2admin");
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.addBatch("INSERT INTO product
VALUES('VB',101,3400,12,0)");
stmt.addBatch("INSERT INTO product
VALUES('OPP',101,3400,12,0)");
stmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
rs = stmt.executeQuery("SELECT * FROM product");
System.out.println("Tabla despues de insertar: ");
while (rs.next())
{
String name = rs.getString("name");
int id = rs.getInt("id");
float price = rs.getFloat("price");
int sales = rs.getInt("sales");
int total = rs.getInt("total");
System.out.println(name + " " + id + " " +
price);
System.out.println(sales + " " + total);
}
rs.close();
stmt.close();
conn.close();
}
catch (BatchUpdateException e)
{
System.err.println("Estado SQL " + e.getSQLState());
System.err.println("Mensaje " + e.getMessage());
System.err.println("Cuenta de modificacion ");
int[] updateCounts = e.getUpdateCounts();
for (int i = 0; i < updateCounts.length; i++)
System.err.println(updateCounts[i]);
}
catch (Exception e)
{
System.out.println(e);
}
}
}

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:

TYPE_FORWARD: El cursor solo puede ir hacia delante.


TYPE_SCROLL_INSENSITIVE: Objeto deslizable pero insensible a cambios hechos por otros.
TYPE_SCROLL_SENSITIVE: Objeto deslizable sensible a cambios hechos por otros.

La concurrencia puede ser cualquiera de las variables de clase definidas:

CONCUR_READ_ONLY: El modo de concurrencia no puede ser modificada.


CONCUR_UPDATABLE: El modo de concurrencia puede ser modificada.

Las siguientes son las interfaces de estos mtodos sobrecargados:

Statement createStatement(int resultSetType, int resultSetConcurrency)

PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)

Ya que el ResultSet es deslizable, el cursor puede moverse y apuntar a renglones especficos, en


los cuales se pueden realizar modificaciones y borrados. La siguiente lista muestra algunos
mtodos para movimiento del cursor:

absolute(int): Para moverse a un rengln especfico


afterLast(): Para moverse al final, despus del ltimo rengln
beforeFirst(): Para moverse al inicio, antes del primer rengln
first(): Para moverse al primer rengln
last(): Para moverse al ltimo rengln
previous(): Para moverse al anterior rengln, similar a next()

public class ScrollableResultSet


{
public static void main(String[] args) throws SQLException
{
Connection conn;
Statement stmt;
try
{
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
conn =
DriverManager.getConnection("jdbc:db2:Sample","db2admin","db2admin");
stmt =
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_REA
D_ONLY);
ResultSet srs = stmt.executeQuery("SELECT id, name FROM
product");
srs.absolute(4);
int rowNum = srs.getRow();
System.out.println("El numero de renglon es: " +
rowNum);
srs.relative(-3);
rowNum = srs.getRow();
System.out.println("El numero de renglon es: " +
rowNum);
srs.relative(2);
rowNum = srs.getRow();
System.out.println("El numero de renglon es: " +
rowNum);
srs.absolute(1);
System.out.println("Despues del ultimo? " +
srs.isAfterLast());
if (!srs.isAfterLast())
{
String name = srs.getString("name");
int id = srs.getInt("id");
System.out.println(name + " " + id);
}
srs.afterLast();
while (srs.previous())
{
String name = srs.getString("name");
int id = srs.getInt("id");
System.out.println(name + " " + id);
}
srs.close();
stmt.close();
conn.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

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:

FETCH_FORWARD: Procesa de primero a ltimo.


FETCH_BACKWARD: Procesa de ltimo a primero.

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.

Clases de soporte de JDBC. Existen varias clases e interfaces de soporte.

La Clase SQLException. Extiende de java.lang.Exception y provee informacin relacionada a errores


de BD. Incluye informacin sobre lo siguiente:

El string SQLState describe el error, de acuerdo a las convenciones XOPEN.


Cdigos de error especficos del vendedor. Generalmente un nmero encontrado en la
documentacin. El mtodo getMessage() de Exception describe el error.

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.

Вам также может понравиться