Programación en Java

Contenido
 Java
 Introducción
 Primer programa
 Programación básica
 Programación orientada a objetos
 Excepciones
 Archivos JAR
 API Java
 Fechas y cadenas
 Colecciones
 Tratamiento de archivos
 Redes
 Programación multihilo
 Acceso a datos (JDBC)
 Arquitectura
 Conexiones
 Comandos y consultas
 Transacciones

Introducción a Java

Origen y arquitectura de Java

Origen de Java  Deriva de C y C++  Creado por James Gosling y otros ingenieros de Sun Microsystems  Se creó en 1991 en sólo 18 meses  Primero se llamó Oak  Se creó para dispositivos electrónicos ante la necesidad de crear un lenguaje independiente de la plataforma  En 1994 cambia su orientación hacia Internet  Se utiliza el nombre Java  JDK 1.0 aparece en 1996 .

Tipos de Aplicaciones en Java  Con Java se pueden hacer varios tipos de aplicaciones:  Aplicaciones normales  Applets  Componentes JavaBeans  Servlets  JSP  Enterprise Java Beans (EJB) .

no es código ejecutable  La máquina virtual Java (JVM) ejecuta el bytecode  Se necesita una JVM para cada plataforma  Lento pero seguro  Compilador Just-In-Time (JIT)  La JVM utiliza cargadores de clases para obtener los bytecodes del disco o de la red .Código binario (ByteCode)  Genera bytecode.

Características de Java  Simple  Gestión de memoria  Orientado a Objetos  Arquitectura neutral  El núcleo API  Interpretado y de  Robusto alto rendimiento  Multihilo  Distribuido .

Ediciones de Java 2  JDK Micro Edition (J2ME)  Para dispositivos electrónicos  JDK Standard Edition (J2SE)  Para ordenadores de sobremesa  JDK Enterprise Edition (J2EE)  Para empresas  Java Server Pages  Servlets  Java support for XML  Enterprise JavaBeans (EJB) .

0.1.class appletviewer miarchivo.El Kit de desarrollo de Java (JDK Standard Edition)  Gratis  Versiones del JDK: 1. 1.7.3. 1. 1.4. 1.8  Se compone de las librerías estándar (clases o APIs) y utilidades:  Compilador: javac miarchivo. 1.java  Intérprete: java miarchivo.java . 1.6. 1. 1.5.2.class  Documentador: javadoc miarchivo.

Entorno de ejecución (JRE)  Gratis  Permite ejecutar cualquier aplicación Java en el cliente  Se compone de las librerías estándar (clases o APIs) y el intérprete .

Java Plug-in  Hace que los applets y los componentes JavaBeans los ejecute el JRE que tenga instalado el cliente en vez de la máquina virtual del navegador  Tiene como ventaja el poder utilizar las novedades de la última versión  Instalación automática.bat del JDK . aparece un icono en el panel de control  Para que funcione hay que cambiar las etiquetas de los applets con la utilidad HtmlConverter.

. C++ o ensamblador ..La máquina virtual Java (JVM)  CPU por software que tiene los bytecodes por juego de instrucciones  Los bytecodes son de la forma: <opcode><.parámetros>  La JVM verificará aquellos bytecodes que hayan atravesado la red  El intérprete traduce los bytecodes a instrucciones específicas del sistema operativo/hardware  Escrita en C.

Rendimiento  JVM más lenta que los ejecutables tradicionales:  El proceso de verificación lleva su tiempo  Conversión de los bytecodes a instrucciones de máquina nativa  Múltiples chequeos de seguridad  Las instrucciones de Java son código del tamaño de un byte  Java se ha implementado como una máquina de pila en la memoria  Garbage collection .

es decir.  El cargador de clases  Recupera las clases de la red.Seguridad  No hay punteros  Garbage Collection  Hay tres componentes principales:  El verificador de código  Se asegura que los bytecodes se ajustan a la especificación de JVM. se determina que actividades puede realizar la JVM y bajo que circunstancias . guardando las de cada servidor en un sitio diferente para evitar interferencias  El gestor de seguridad  Chequea la política de seguridad.

Entornos de programación  JDK + editor  IDE completo  Notepad  Eclipse  TextPad  NetBeans  UltraEdit  Borland JBuilder  JEdit  IBM Websphere  Emacs  Oracle JDeveloper  BEA WebLogic Workshop  Xinox JCreator .

..out. Primer programa en Java // archivo HolaMundo.java class HolaMundo { public static void main(String args[]) { System. } // fin de main() } // fin de class HolaMundo Uy! Un HolaMundo! Qué original. .println("Hola mundo!")..

librerias> segundito…  Genera código intermedio 100101 interpretable por la 011101 máquina virtual HolaMundo.java ___________  ___________  -d <dir.java javac HolaMundo.destino> class Ho Esto estará  -sourcepath <dir.fuentes> en un public vo  -classpath <dir.class (bytecode) Bytecode .Primer programa en Java Compilación Código fuente HolaMundo.

class en la máquina virtual  Busca un método public static void main(String args[]) dentro de la clase y lo ejecuta  Se debe proporcionar la ruta de acceso a todas las clases que se utilicen dentro del programa .clases>  Ejecuta la clase HolaMundo.Primer programa en Java Ejecución  java HolaMundo  -classpath <dir.

Programación Java Programación básica .

class por cada clase (pública o privada) .archivos java  Una sola clase pública por archivo  Al compilar se genera un .

Comentarios  Una línea  // Comentario  Multilinea  /* Comentario  Comentario */  Comentario para documentación  /** * Comentario JavaDoc */ .

 Asignación de variable  i = 5.c.Variables  Declaración de variable  int i. .b.  Declaración múltiple  int a.  Declaración + asignación  int i = 5.

if (x == y) { int z = x + y.println(x).out. } System. System.println(y).out. // Error } . System.println(z).Visibilidad de variables  Los bloques de código (llaves) definen el alcance de las variables void funcion(int x) { int y = 5.out.

int.Tipos de datos  Básicos (por valor)  boolean  byte. short. long  float. double  char (Unicode)  Clases (String es una clase)  Matrices (arrays) .

* / %  4.5F  Lógicos  Booleanos & && | || ^ !  true false  De Bit  Carácter & | ^ ~ << >> >>>  'A'  Asignación = ++ -.Expresiones  Literales  Operadores  Numéricos  Aritméticos + . 0xFF. 4. 071.+= -= . 5e6  Comparación == != > >= < <=  3L.  -4..  Cadena  Condicional  "Hola" ?:  "Dos\nLineas" .5..

 Estrechamiento: Conversión a un tipo más pequeño  Se necesita utilizar el operador de cast  int i = (int)l.Conversión de tipos  Ensanchamiento: Conversión a un tipo más grande  La conversión es automática  long l = 65. .

else { // Código default: } //Código break.. ? .Sentencias condicionales switch (i) { if (a>b) { case 0: // Código //Código } break. } ¿.

while (i > 0) { // Código break.i<10.Bucles for (i=0.i++){ do { // Código // Código } } while (i>0).  Siguiente iteración . }  Terminar bucle continue.

 String palabras[].length.  Los índices válidos van desde 0 a .Matrices  Las matrices son objetos de la clase Array  Declaración:  String[] palabras.  Creación:  String[] palabras = new String[5].  String[] palabras = { "Hola".  Obtener tamaño:  int tam = palabras. "mundo" }  Acceso a elementos:  palabras[0] = "Adiós".length .1 .

 matriz[0][0] = 3.length devuelve el tamaño de la primera componente. 1: 2: .  .  matriz[1] = new int[3].  matriz[0] = new int[2]. no el tamaño total de la matriz  Se pueden crear matrices no uniformes  int[][] matriz = new int[3][]. 0:  matriz[2] = new int[1].Matrices multidimensionales  Se utilizan matrices de matrices  int[][] matriz = new int[4][4].

Programación Java Programación orientada a objetos .

Clases  La clase es el núcleo de Java  Una clase define un nuevo tipo de dato  Una clase es una plantilla para un objeto  Un objeto es una instancia de una clase  A las propiedades y los métodos se les llama miembros de la clase .

tipo variable2. tipo metodo1(parámetros) { // cuerpo del método } tipo metodo2(parámetros) { // cuerpo del método } } .Forma general de una clase class NombreClase { tipo variable1.

} }  El punto de entrada a la aplicación es a través del método main( ) que es llamado por la JVM .println(“Hasta luego Lucas”).out. Ejemplo de clase  La clase más pequeña podría ser así: class MiClase { // la máquina virtual llama al método main() public static void main (String args[]) { System.

4.Una clase sencilla  Creación de la clase class Caja { double ancho. // también: Caja objCaja = new Caja().ancho = 20. double alto.alto = objCaja. . objCaja.3.fondo = 30. objCaja. objCaja = new Caja(). double fondo. }  Creación del objeto a partir de esa clase Caja objCaja.

ej. Point  p1. antes de crear el objeto) se indica con la palabra clave null  La asignación entre objetos copia la referencia.  p1 = new Point(10.10). HEAP  Point p2.x = 5 p1: x=10 x=5 y=10 y=10 p2: . no el contenido del objeto  Point p1. PILA  p2 = p1.Referencias a objetos  Las variables de tipo objeto almacenan referencias  El objeto se almacena en el "montón" (heap)  Una referencia nula (p.

 Constantes: Todo mayúsculas (con subrayados entre palabras)  final double PI = 3..}  Miembros. en Java se utilizan las siguientes reglas para identificadores:  Clases e interfaces: Mayúsculas cada palabra  class MiClaseRectangulo {.miempresa. mayúsculas las siguientes  void escribeEntero(int entero) {.141592.Nomenclatura Java  Por convención...  Paquetes: Todo minúsculas (no se suele utilizar más de una palabra)  package com.  final int VELOCIDAD_LUZ = 299792458.}  int numLinea. . variables y parámetros: Minúsculas la primera palabra..proyecto.

} .Métodos  Forma general de un método: tipo nombreMetodo(tipo1 param1. tipo2 param2) { // cuerpo del metodo }  Si no devuelve resultado se indica void como tipo del método  Para devolver un valor: return valor.  Ejemplo: double volumen( ) { return ancho * alto * fondo.

Constructores  Método que ejecuta el operador new  Si no existe. java crea uno por defecto  Para tareas de inicialización  Ejemplo: Caja( ) { ancho = alto = fondo = 0. } .

fondo).valor = valor. } .alto.add(this). }  Llamada a otros constructores Caja(Caja c) { this(c. }  Pasar el propio objeto como parámetro void Guardar(ArrayList lista) { lista.ancho.c. int setValor (int valor) { this. se utiliza this  Acceso a miembros con nombre conflictivo int valor.c.this  Para acceder al propio objeto.

abs(valor) * 1. Java utiliza el tipo y/o el nº de argumentos para saber a qué método llamar .16.16. } double incremento (double valor) { return Math. Sobrecarga de métodos  Dos o más métodos dentro de la misma clase con el mismo nombre y distintos parámetros float incremento (float valor) { return Math. }  También se pueden sobrecargar los constructores  Cuando se invoca un método sobrecargado.abs(valor) * 1.

boolean)  Un objeto se pasa por referencia  (arrays. char. etc. int.Parámetros  Se pueden pasar objetos a los métodos como parámetros  Un tipo simple se pasa por valor  (byte.)  Los métodos pueden devolver objetos . Strings. short. double. long. float.

Control de acceso  Modificadores de acceso de los miembros:  public  Los miembros pueden ser accedidos desde cualquier parte del programa  private  Los miembros sólo pueden ser accedidos desde dentro de la misma clase  protected  Los miembros pueden ser accedidos desde otro paquete pero a clases que sean subclases directas de su clase  nada (por defecto)  Los miembros sólo pueden ser accedidos desde dentro del mismo paquete .

Protección de acceso  Acceso a miembros de una clase: Desde private nada protected public (package) Misma clase Sí Sí Sí Sí Subclase del mismo paquete No Sí Sí Sí No subclase del mismo paquete No Sí Sí Sí Subclase de diferente paquete No No Sí Sí No subclase de diferente paquete No No No Sí .

} } .valor = valor.Métodos accesores (propiedades)  Las variables de instancia se suelen declarar privadas  Se añaden métodos getXXX() y setXXX() para obtener y establecer el valor de dichas variables public class Propiedades { private int valor. public int getValor() { return this.valor. } public void setValor(int valor) { this.

static  Métodos static:  Se puede llamar a un método static o a una variable static sin crear el objeto de la clase  Variables static:  Las variables static actúan como variables globales (todas las instancias de la clase comparten la misma variable static)  Bloques de código static:  Es lo primero que se ejecuta. incluso antes que el constructor .

ya que no se va a crear ningún objeto para lanzar el método  No devuelve ningún resultado (void)  Recibe como parámetro un vector de cadenas.}  Debe ser público.Método main  Una aplicación Java necesita contener al menos una clase ejecutable  Para poder ejecutar una clase Java. accesible desde fuera del paquete  Debe ser estático... que corresponden a los argumentos de línea de comandos que se proporcionan a la aplicación al ejecutarla . ésta debe definir un método main con la siguiente signatura:  public static void main (String arg[]) {.

Herencia  Se define una clase padre (superclase) que da características comunes (variables y métodos) a todas sus clases hijas (subclases)  Se utiliza la palabra clave extends  No hay limite en el nivel de profundidad de la herencia  Java no soporta herencia múltiple .

out. j: “ + j).println(“i: “ + i + “.println(“i: “ + i + “. } } class B extends A { int k. j. void verij() { System.out. j: “ + j + “. k: “ + k). } } . void verijk() { System.Ejemplo de herencia class A { int i.

.  Object obj = s.  Estrechamiento: Conversión a un tipo derivado  Se debe utilizar el operador de cast  s = (String)obj.Conversión de referencias  Se puede asignar una referencia a un objeto a una referencia de un tipo compatible  Clase en la jerarquía de clases base  Interfaz implementado por el objeto  Ensanchamiento: Conversión de un tipo derivado a un tipo base o interfaz  Se puede realizar la asignación directamente  String s = "Hola".

Java añade la llamada al constructor por defecto super()  Acceder a un miembro de la superclase: super.miembro .super  Acceso a miembros de la clase base  Llamar al constructor de la superclase: super(parámetros)  Si no se llama explícitamente a un constructor de la clase base.

Sobreescritura de métodos  Un método de una subclase que tiene el mismo nombre y parámetros que la superclase  Cambia la implementación proporcionada por la clase base  Sobrecarga de métodos: Varios métodos con el mismo nombre pero diferentes parámetros .

 Las llamadas son iguales.Polimorfismo  Se llama polimorfismo a tener un mismo método con distintas implementaciones  Se consigue a través de la sobreescritura de los métodos Vehiculo v = new Moto(). v. v.Frenar( ).Frenar( ). pero la implementación que se ejecuta es distinta . v = new Coche().

 Una subclase de una clase abstracta debe implementar todos los métodos abstractos o declararse como abstracta  No se pueden crear objetos de clases abstractas .Clases abstractas  Proporcionan una implementación parcial de la clase  Los métodos no implementados se declaran como abstract y la clase también abstract tipo nombreMetodo(parámetros).

final  Usos de la palabra clave final:  Para definir constantes final int cancel = 2.  Para evitar la sobreescritura final void metodo( ) { // cuerpo del método }  Para evitar la herencia final class A { // cuerpo de la clase } .

La clase Object  Es una clase definida por Java  Todas las demás clases son subclases de Object  Métodos importantes de la clase Object:  clone( ) para clonar un objeto  equals( ) para comparar contenido de objetos  toString( ) para visualizar un objeto .

Asignar tipos primitivos a Object  Para cada tipo primitivo. existe una clase asociada que lo representa. i = objInt. .  Para poder asignar un valor de tipo primitivo a una variable de tipo Object hay que construir un objeto de la clase correspondiente  Se puede recuperar el valor primitivo a partir del objeto int i = 5.intValue(). Integer objInt = (Integer)obj. Object obj = new Integer(i).

Novedades JDK 1. int j = i. .5  Autoboxing: Conversión automática de tipos primitivos a sus clases correspondientes Integer i = 3.

long l = Long.toString(2).toString(2). String st = Long.valueOf("2"). String st = Boolean. float f = Float.floatValue().valueOf("2"). String st = Float. .toString(). String st = Double. long l = Long.toString(2).valueOf(2).doubleValue(). double d1 = Double.valueOf("2").  Convertir String a número double d = Double.longValue().Conversión número-cadena  Los objetos de encapsulación de tipos primitivos proporcionan además métodos estáticos de conversión a y desde cadena  Convertir número a String String st = String.parseLong("2").parseDouble("2"). float f = Float.parseFloat("2").valueOf("true").

Interfaces  Permite abstraer completamente la interfaz de una clase utilizando la palabra clave interface  Una clase puede implementar cualquier número de interfaces a través de la palabra clave implements  Cada clase que implemente una interfaz. PERO NO ES RECOMENDABLE  Las interfaces se pueden extender . tiene que ser abstract  Se pueden utilizar interfaces para importar constantes. debe implementar todos los métodos de la interfaz  Si una clase implementa una interfaz pero no implementa todos los métodos.

no su implementación Se puede crear directamente un objeto No se puede crear directamente un de la clase base objeto de tipo interfaz (salvo clases abstractas) . tipo de miembros variables estáticas y métodos La clase base puede proporcionar Un interfaz sólo aporta la definición del implementación a los métodos método. Herencia vs Interfaces Implementación Herencia de clases de interfaces Se pueden implementar todos los Sólo se puede tener una clase base interfaces que se quiera Una clase base puede tener cualquier Un interfaz sólo puede tener constantes.

*. azul. duro(5). verde. } } . por lo que se les pueden añadir variables y métodos public enum Moneda { pela(1).lang. } private final int value.Novedades JDK 1. Moneda(int value) { this. libra(100).System.println(s).5  Enumerados:  enum Color { rojo. chapa(25). } }  import static: Permite acceder a miembros estáticos de una clase sin el nombre de la clase import static java. public int value() { return value.value = value. class Consola { public void Escribir(String s) { out. amarillo }  Son clases.

imagen.  Carpeta: java\awt\imagen  Los paquetes se deben organizar de forma lógica .Paquetes  Es un conjunto de clases agrupadas bajo un nombre  Permiten dar a 2 clases el mismo nombre siempre que estén en diferentes paquetes  Para crear un paquete se utiliza la palabra clave package como primera línea del código fuente package paquete1.  La jerarquía de paquetes coincide con la estructura de directorios  package java.awt.

La variable de entorno CLASSPATH  Sirve para decirle al compilador y al intérprete donde deben buscar las clases que se utilizan en el programa: Set CLASSPATH=.jar.1\lib\j2ee. IMPORTANTE: si no se añade el .3.1\lib\system\ifxjdbc.3.3.. Set JAVA_HOME = C:\jdk1.3.jar.. no encuentra las clases aunque estemos dentro del mismo directorio  También es necesario definir el classpath para el jdk y alguna variable más: Set CLASSPATH = .1_02 Set J2EE_HOME = C:\j2sdkee1.C:\j2sdkee1.jar // para Informix  Probablemente también sea necesario alguna otra variable para el entorno de desarrollo que estemos utilizando: Set FORTE4J_HOME = C:\forte4j // para el entorno Forte de Sun .3.c:\MiJava\MisPaquetes.1\lib\j2eetools. (punto) en el classpath.C:\j2sdkee1.1 Set J2EE_CLASSPATH = C:\j2sdkee1.

se puede indicar en cada clase a qué paquete pertenece class MiFecha extends java.Date { // código de la clase } .Importar paquetes  La palabra clave import nos permite importar clases que residen en otros paquetes import paquete1.util. import java.Date.*. class MiFecha extends Date { // código de la clase }  Esta sentencia no es necesaria.util.

Gestión de errores  Hay dos clases de error en Java:  Exception: Errores recuperables  Error: Errores graves no recuperables Throwable Exception Error .

Capturar excepciones  Para detectar si se produce una excepción se utiliza la construcción  Se puede indicar la clase concreta de excepción que se quiere capturar try { // Código que se prueba } catch (Exception e) { // Código si hay excepción } .

out. el flujo int a = 5. de programa entra en int c = a/b. específicas } . int b = 0.  Se deben ordenar los } catch poniendo catch (Exception e){ primero las System.println( excepciones más "Error inesperado: " + e. Orden de los catch  Cuando se produce try { una excepción.println( "Error aritmetico).getMessage()). el primer catch que } capture una clase de catch (ArithmeticException ae){ excepción compatible System.out.

..finally  Hay operaciones que se quieren realizar tanto si hay error como si todo va bien  Ejemplo: Cerrar una conexión a BD  Se utiliza la cláusula finally  El bloque finally siempre se ejecuta try { // . } catch (Exception ex) { // Se ejecuta si hay error } finally { // Siempre se ejecuta } .

se propaga al método anterior en la pila de llamadas  Los métodos que pueden producir excepciones contienen la cláusula throws  void metodo(int a) throws IOException {. existen dos opciones:  Capturar la clase de excepción indicada  Incluir una cláusula throws para la excepción .}  Cuando se llama a un método que tiene cláusula throws...Propagación de excepciones  Si una excepción no se captura.

Excepciones propias  Se puede crear una clase propia de excepción. el nombre de una clase de excepción suele terminar con la palabra Exception public class MiException() extends Exception{ public string getMessage() { return "Error propio". construyendo una clase derivada de Exception  Normalmente se sobreescriben los métodos getMessage() y toString()  Por convención. . } }  Para lanzar la excepción se utiliza la instrucción throw  throw new MiException().

Archivos JAR  Las aplicaciones y librerías Java se suelen empaquetar en archivos JAR  Formato ZIP  Contienen toda la estructura de clases (archivos .class)  Incluyen un archivo de información META-INF/Manifest.mf (archivo de manifiesto)  Pueden incluir archivos adicionales  Los archivos JAR se pueden ejecutar directamente o especificar como rutas de ClassPath .

0 Created-By: 1. el atributo Main- Class indica cual es la clase que contiene el método main (punto de entrada de la aplicación) .0-rc (Sun Microsystems Inc.archivo de manifiesto  Ejemplo de archivo manifest.mf Manifest-Version: 1.5.App  IMPORTANTE: Terminar todas las líneas con salto de linea  Para aplicaciones ejecutables.) Main-Class: paquete.

 Ejecutar archivo JAR  java –jar archivo.jar .Tratamiento de archivos JAR  Crear archivo JAR: Se utiliza jar.jar MiManifiesto .  Indicar el archivo de manifiesto  jar cvfm archivo.jar .exe  Crear un jar con el contenido del directorio  jar cvf archivo.

API Java: Fechas .

 Fecha / hora actual  La mayoría de los métodos de esta clase están desaconsejados (deprecated) en favor de las clases Calendar y DateFormat  getTime y setTime convierten la fecha en un número de milisegundos (long)  compareTo permite comparar fechas .Date representa un instante en el tiempo.util. con precisión de milisegundos  Date d = new Date().Date  La clase java.

util. se puede utilizar Calendar en lugar de Date .Calendar es una clase abstracta con métodos para obtener y establecer los valores de una componente de una fecha/hora  Los objetos Calendar se crean con una factoría (metodo estático que crea objetos del propio tipo)  Calendar c = Calendar.Calendar (GregorianCalendar)  java.getInstance().  Devuelve la fecha/hora actual  La subclase concreta que se utiliza normalmente es GregorianCalendar  En la mayoría de los casos.

no de 1 a 12  Por claridad. MONTH.JANUARY .getTime()) . es recomendable utilizar las constantes Calendar.  El método set establece el valor de un componente  c. Calendar. WEEK_OF_YEAR.  Componentes de la fecha:  MILLISECOND.. DATE. HOUR.. SECOND. AM_PM. DECEMBER  getTimeInMillis() devuelve la fecha/hora como un número de milisegundos (como Date. DAY_OF_MONTH. YEAR.Componentes de una fecha  El método get devuelve un componente de la fecha/hora  int year = c.set(Calendar.15). DAY_OF_WEEK. WEEK_OF_MONTH.get(Calendar.YEAR).DAY_OF_MONTH. ERA  ATENCIÓN: Los meses van de 0 a 11. MINUTE.

getDateTimeInstance().parse("31/10/1975").  Para trabajar con horas  DateFormat f = DateFormat.format(d). .  Para trabajar con fechas  DateFormat f = DateFormat.  El método format convierte fechas a cadenas  String s = f.  Para trabajar con fecha/hora  El método parse convierte cadenas a fechas (Date)  Date d = f.DateFormat  java.getTimeInstance().DateFormat es una clase abstracta que permite convertir valores de fecha a cadena y viceversa  Los objetos se crean por medio de una factoría  DateFormat f = DateFormat.text.getDateInstance().

SimpleDateFormat  Para forzar una determinada representación de fecha se puede utilizar la clase derivada SimpleDateFormat  El formato de fecha-hora se establece como una cadena de texto  Al crear el objeto  SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy").  Después se utilizan los métodos estándar de DateFormat para realizar las conversiones .  Con el método applyPattern  f.applyPattern("dd/MM/yyyy hh:mm").

API Java: Cadenas .

No se pueden modificar directamente.  Por eso es seguro realizar asignaciones entre variables String .String  La clase String sirve para almacenar cadenas de texto Unicode  Las cadenas de texto son inmutables.

 b = s1.equalsIgnoreCase(s2).concat(s2).Operaciones con String I  Longitud  i = s.length().compareToIgnoreCase(s2).compareTo(s2).  s3 = s1.  i = s1.startsWith(s2).endsWith(s2).  Comparación  b = s1.  i = s1. .  b = s1.  Concatenación  s3 = s1 + s2.equals(s2).  b = s1.

trim().  i = s1.indexOf(s2).s2).  s4 = s1.  Obtener subcadena  s2 = s1.replaceFirst(s1.s2).Operaciones con String II  Obtener carácter  c = s.  Quitar espacios  s2 = s1.  Reemplazos  s4 = s1.substring(i1.replaceAll(s1.i2).  Buscar subcadenas  i = s1.charAt(0).lastIndexOf(s2). .

toCharArray(). .split(" ").  Dividir en partes  String[] palabras = s.valueOf(i).toLowerCase().Operaciones con String III  Construcción  s = String.format("Nº: %d".  s = String.  Conversión mayúsculas/minúsculas  s2 = s1.toUpperCase().  Pasar a matriz de char  char[] c = s.  s2 = s1.i).

..Copia el contenido de la segunda cadena  Si esta operación se repite muchas veces con una misma cadena.Copia el contenido de la primera cadena  3.Reserva memoria para la cadena final  2.. el rendimiento se degrada exponencialmente .Concatenación masiva  La operación de concatenación es muy costosa:  1.

StringBuffer / StringBuilder  La clase StringBuffer representa un string modificable. sin copiar los contenidos  Cuando se queda sin memoria.  Se puede modificar su contenido directamente. reserva el doble .

c)  Modifica el carácter situado en la posición pos .Métodos StringBuffer I  length()  Devuelve la longitud de la cadena contenida  setLength()  Establece la longitud  Se rellena con el carácter nulo '\u0000'  capacity()  Devuelve el tamaño reservado  ensureCapacity(n)  Reserva al menos la capacidad indicada  setCharAt(pos.

pos2.s)  Sustituye los caracteres desde la posición pos1 a pos2–1 por la cadena s  reverse()  Invierte el orden de los caracteres .s)  Inserta una cadena en una posición determinada  Sobrecargado para cualquier tipo de datos  delete(pos1.Métodos StringBuffer II  append(s)  Añade una cadena al final  Sobrecargado para cualquier tipo de datos  insert(pos.pos2)  Elimina los caracteres desde la posición pos1 a pos2-1  replace(pos1.

Práctica String vs StringBuffer  Realizar un bucle de 10000 iteraciones que va concatenando un carácter a una cadena  Implementarlo con concatenación de String  Implementarlo con StringBuffer  Medir el tiempo que tarda en realizar la operación con cada método  Cambiar el número de iteraciones y comprobar el impacto en el rendimiento .

API Java: Colecciones .

pertenecientes al paquete java.Java Collections Framework  Está basado en una jerarquía de interfaces.util .

Interfaces de colecciones  Collection: Representa un grupo de objetos  Sin implementación directa  Set: Colección desordenada que no puede contener duplicados  List: Colección ordenada (secuencia) que puede contener duplicados  Map: Objeto que almacena pares clave-valor  No puede haber claves duplicadas  Una clave corresponde con un único valor .

Ordenación de elementos  Se pueden construir colecciones ordenadas de elementos  Los elementos implementan la interfaz Comparable  Utilizando un objeto que implemente la interfaz Comparator  SortedSet: Set que mantiene sus elementos ordenados con un Comparator  SortedMap: Map que mantiene sus elementos ordenados con un Comparator .

 Conversión a matriz  Object[] toArray().Collection  Operaciones básicas  int size()  boolean isEmpty().  Operaciones en bloque  boolean containsAll(Collection c).  boolean addAll(Collection c).  void clear().  boolean contains(Object element).  Iterator iterator().  boolean add(Object element). .  Object[] toArray(Object a[]).  boolean retainAll(Collection c).  boolean removeAll(Collection c).  boolean remove(Object element).

next(). i. for (Iterator i = c.  hasNext() permite saber si quedan elementos por obtener  next() devuelve el siguiente elemento de la colección  remove() elimina de la colección el último elemento devuelto por next() Collection c = obtenerColeccion().iterator(). } } . ){ if (i.hasNext().remove().Iteradores  Todas las colecciones se pueden recorrer con un iterador que proporcionan.equals("borrame")) { i.

Set  No añade ningún método específico  Impementación: HashSet .

 Impementación: TreeSet . SortedSet tailSet(Object fromElement). Object last().SortedSet  Añade los métodos: SortedSet subSet(Object fromElement. SortedSet headSet(Object toElement). Object toElement). Comparator comparator(). Object first().

búsqueda y rango. Permite utilizar el iterador ListIterator Object get(int index). List subList(int from.  Impementaciones: ArrayList. int indexOf(Object o). boolean addAll(int index. ListIterator listIterator(int index). Collection c).List  Añade métodos de acceso por posición. void add(int index. int lastIndexOf(Object o). Object element). Object element). Object set(int index. int to). LinkedList . Object remove(int index). ListIterator listIterator().

Object next(). boolean hasPrevious().ListIterator  Permite ir hacia delante y hacia atrás. Object previous(). int nextIndex(). void add(Object o). void remove(). . void set(Object o). insertar y modificar elementos boolean hasNext(). int previousIndex().

. int size(). boolean containsValue( Object value). Object value) Object get(Object key) Object remove(Object key) boolean containsKey( Object key).Map  Trabaja con pares clave-valor  Operaciones básicas Object put( Object key. boolean isEmpty().

Map  Operaciones en bloque void putAll(Map t). public Collection values(). public interface Entry { Object getKey(). Object setValue(Object v). void clear(). Object getValue(). public Set entrySet(). }  Implementación: HashMap .  Obtener colecciones asociadas public Set keySet().

Object lastKey(). SortedMap subMap(Object fromKey. SortedMap headMap(Object toKey). Object firstKey(). SortedMap tailMap(Object fromKey). Object toKey).SortedMap  Añade los métodos: Comparator comparator().  Implementación: TreeMap .

List orig) max(Collection c) max(Collection c.Collections  La clase Collections proporciona métodos estáticos para realizar operaciones sobre colecciones sort(List l) sort(List l. Random r) binarySearch(List l. Comparator cmp) . Object o. Comparator c) reverse(List l) fill(List l. Object o) copy(List dest. Comparator c) shuffle(List l) shuffle(List l. Comparator cmp) min(Collection c) min(Collection c. Object o) binarySearch(List l.

modificar y  Cada registro de la agenda eliminar registros de la debe contener:  Nombre corto agenda  Nombre completo  Opciones de menú:  Dirección  Listado de agenda  Teléfono  Consultar registro  E-mail  Modificar registro  Se accede a los registros por  Añadir registro el nombre corto  Eliminar registro  Salir .Práctica: Agenda de teléfonos  Aplicación de consola que  La aplicación debe implemente una agenda de permitir consultar. teléfonos añadir.

5  Tipos genéricos:  Todas las colecciones se pueden parametrizar con el tipo de elemento que contienen List<String> lista = new ArrayList<String>().  Bucle for para iteradores  Se añade una sintaxis alternativa para el bucle for que permite recorrer de manera sencilla colecciones y matrices for (String s : lista) { System.out. } .println(s). lista.Novedades JDK 1.add("Hola").

Tratamiento de archivos .

… . tipo de archivo.Clase File  Sirve para manejar directorios y archivos  Renombrar / Mover  Borrar  Crear directorios  Listar archivos  Acceder a propiedades  Fecha modificación.

Métodos de File String getName() String getParent() long length() boolean renameTo(File dest) boolean delete() boolean canRead() / boolean canWrite() boolean exists() boolean mkdir() File[] list() / File[] listFiles() long lastModified() / void setLastModified(long t) boolean isDirectory() boolean isFile() boolean createNewFile() .

Ejemplo File f1 = new File(“C:\prueba.out.listFiles(). } File dir = new File(“C:\”).println(archivos[i]. } else { f1.createNewFile(). i++) { System. File[] archivos = dir. if (f1. for (int i=0.getName() ).length.txt”). } .delete().exists()) { f1. i<archivos.

Flujos de datos
 Paquete java.io
 Tenemos flujos de datos de una fuente a un receptor
 Java soporta dos tipos de datos en los flujos:
 Bytes
 Caracteres Unicode
 Stream: cualquier tipo de secuencia de bytes que
pueda ser leída o escrita
 InputStream, OutputStream
 Reader: objeto para leer caracteres Unicode
 Writer: objeto para escribir caracteres Unicode

InputStream
 Ofrece los siguientes métodos
//lectura
int read()
int read(byte[] buffer)
int read(byte[] buffer, int offset, int length)

//cerrar flujo
void close()

//cantidad bytes disponibles
int available()

//descarta la cantidad de bytes especificada
long skip(long n)

OutputStream
 Ofrece los siguientes métodos
//escritura
void write()
void write(byte[] buffer)
void write(byte[] buffer, int offset, int length)

//cerrar flujo
void close()

//fuerza la grabación en la salida
void flush()

int offset.Reader  Ofrece los siguientes métodos //lectura int read() int read(char[] cbuf) int read(char[] cbuf. int length) //cerrar flujo void close() //si está disponible para leer boolean ready() //descarta la cantidad de caracteres especificada long skip(long n) .

int length) void write(String string) Void write(String string.int offset.int offset. int length) //cerrar flujo void close() //fuerza la grabación en la salida void flush() .Writer  Ofrece los siguientes métodos //escritura void write() void write(char[] cbuf) void write(char[] cbuf.

Flujos directos Tipo Flujos de caracteres Flujos de byte archivo FileReader FileInputStream FileWriter FileOutputStream Memoria CharArrayReader ByteArrayInputStream (Array) CharArrayWriter ByteArrayOutnputStream Memoria StringReader N/A (String) StringWriter Pipe PipeReader PipeInputStream PipeWriter PipeOutputStream .

Flujos de procesamiento
 Realizan conversiones a otro flujo
 También se les llama flujos de filtro
 Un flujo de entrada de filtro se crea con una
conexión a un flujo de entrada existente
 Cuando leemos de él, accedemos a
caracteres de otro flujo de entrada
 Se usan para convertir una secuencia de
datos más usable para la aplicación que está
escribiendo

Lista de flujos de
procesamiento
Tipo Flujo de caracteres Flujo de Bytes

Buffering BufferedReader BufferedInputStream
(mejora rendimiento) BufferedWriter BufferedOutputStream
Filtrado FilterReader FilterInputStream
(clases abstractas) FilterWriter FilterOutputStream
Conversión de bytes a caracteres InputStreamReader
OutputStreamReader
Serialización de objetos ObjectInputStream
ObjectOutputStream
Serialización de datos primitivos DataInputStream
DataOutputStream
Soporte números de línea LineNumberReader LineNumberInputStream
Formateo de datos primitivos PrintWriter PrintStream

Otros (no pertenecen a java.io): CipherInputStream
Cifrado / descifrado CipherOutputStream

Cadenas de flujos
 Un programa suele encadenar una serie de
flujos para procesar los datos
 Encadenamiento flujos de entrada
Data Source Program
FileInputStream
BufferedInputStream DataInputStream

 Encadenamiento flujos de salida
Program Data Sink
FileOutputStream
DataOutputStream BufferedOutputStream

close(). } input. //leemos el primer buffer charsRead = input.Read(buffer).write(buffer. .Ejemplo //defino los flujos de entrada y salida FileReader input = new FileReader(args[0]).0. FileWriter output = new FileWriter(args[1]). output.Read(buffer).charsRead).close(). int charsRead. char[] buffer = new char[128]. charsRead = input. while(charsRead != -1){ output.

Clase BufferedReader  Maneja el proceso de buffering  Optimiza el rendimiento  Permite leer un flujo de texto línea a línea  readLine()  Es un flujo de procesamiento .

0.length()). bufOutput.newLine().close().write(line. BufferedReader bufInput = new BufferedReader(input).readLine(). FileWriter output = new FileWriter(args[1]).close().line. } bufInput. BufferedWriter bufOutput = new BufferedWriter(output). Ejemplo 2 FileReader input = new FileReader(args[0]). line = bufInput. String line. //leemos la primera línea line = bufInput. bufOutput. while(line != null){ bufOutput. .readLine().

Jerarquía clase InputStream FileInputStream ObjectInputStream PipedInputStream DataInputStream InputStream SequenceInputStream PushbackInputStream FilterInputStream BufferedInputStream StringBufferInputStream LineNumberInputStream ByteArrayInputStream .

Jerarquía clase OutputStream FileOutputStream DataOutputStream ObjectOutputStream PushbackOutputStream OutputStream FilterOutputStream BufferedOutputStream LineNumberOutputStream PipedOutputStream ByteArrayOutputStream .

FileInputStream / FileOutputStream  Podemos especificar la ruta del archivo del que queremos leer o escribir  FileInputStream: si el archivo no existe.dat”). se sobrescribe FileInputStream infile = new FileInputStream(“read. .dat”). da error  FileOutputStream: si el archivo existe. FileOutputStream outfile = new FileOutputStream(“write.

Jerarquía clase Reader BufferedReader LineNumberReader PipedReader InputStreamReader FileReader Reader FilterReader PushbackReader StringReader CharArrayReader .

Jerarquía clase Writer BufferedWriter StringWriter OutputStreamWriter FileWriter Writer FilterWriter PipedWriter PrintWriter CharArrayWriter .

InputSteamReader /
OutputStreamReader
 Podemos especificar la codificación de
caracteres que vamos a leer, si es
diferente a la local
InputStreamReader ir = new InputStreamReader(System.in, “ISO-8859-1”);

 ISO 8859-1 corresponde con ASCII +
caracteres occidentales (acentos, ñ,...)

FileReader / FileWriter
 Son análogas a encadenar:
 InputStreamReader
sobre FileInputStream
 OutputStreamWriter
sobre FileOutputStream
 Utilizan codificación de caracteres por
defecto

Redes

uno de entrada y otro de salida  Las conexiones socket TCP/IP están implementadas en el paquete java.net .Sockets  Son los puntos finales de una comunicación entre procesos  Para comunicarse por red. Java utiliza el modelo de flujos  Un socket puede tener asociados dos flujos.

Configurar la conexión  Una máquina debe ejecutar un programa que esté esperando una conexión y otra debe intentar acceder a la primera  Debemos proporcionar la dirección a la que conectarnos y el puerto  Los puertos van del 0 al 65535  Inferiores al 1024 están reservados  Para establecer la conexión las dos máquinas deben acordar el mismo puerto .

close() .close() Socket.accept() Cliente Socket(host. Modelo de conexiones Servidor ServerSocket(puerto #) ServerSocket.puerto #) Socket() (intenta conectarse) OutputStream OutputStream InputStream InputStream Socket.

write(“Hola”). bw.close().close(). BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s1out)). bw. OutputStream s1out = s1. Ejemplo Servidor TCP/IP ServerSocket s = new ServerSocket(5432).getOutputStream(). s1. } . while (true){ Socket s1 = s.accept().

0.5432).0. dis. .1”.println(dis.readUTF()). System.out.close().getInputStream(). InputStream is = s1. DataInputStream dis = new DataInputStream(is).Ejemplo cliente TCP/IP Socket s1 = new Socket(“127.close(). s1.

Programación multihilo .

Thread  Un proceso es un programa en ejecución  Uno o más hilos constituyen un proceso  Un hilo está compuesto por:  Una CPU virtual  El código que ejecuta la CPU  Los datos sobre los que trabaja el código .lang.Hilos  Paquete java.

println(“Hola “ + i). if (i==50) { break.out. public void run(){ i = 0. while(true) { System. } } } } .Creación de un hilo I  Necesitamos una clase que implemente el interfaz Runnable class HolaRunner implements Runnable{ int i.

Thread t = new Thread(r).Creación de un hilo II  Ahora creamos un objeto de la clase Thread pasando como argumento una instancia de la clase HolaRunner HolaRunner r = new HolaRunner().  Un hilo siempre comienza su ejecución en el método run de su instancia Runnable cargada (r) . t.start().

 Estos hilos comparten los mismos datos y el mismo código  Hasta que no ejecutamos el método start el hilo no comienza . Thread t2 = new Thread(r).Multihilos  Podemos crear tantos hilos como queramos Thread t1 = new Thread(r).

sleep(10).Planificación de hilos  Un hilo puede estar en varios estados:  Runnable  Running  Blocked  Se puede llamar al método sleep para parar el hilo  Thread. // Milisegundos  Pasaría a blocked .

también podemos pararlo antes de que acabe  Haremos que finalice el método Run .Finalización de un hilo  Cuando un hilo completa su ejecución no puede ejecutarse nuevamente  Si queremos.

Métodos boolean isAlive() void setPriority() Thread.MIN_PRIORITY Thread.yield() .sleep() Thread.MAX_PRIORITY void join() void join(long timeout) Thread.NORM_PRIORITY Thread.

start(). public static void main(String args[]) { Thread t = new MyThread()...Otra forma de crear hilos  La clase Thread implementa el interfaz Runnable. } . por lo tanto se puede crear un hilo creando una clase que extienda de Thread public class MyThread extends Thread{ public void run() { . } } .. t..

comprobamos el estado del objeto  Obtenemos la bandera de bloqueo asociada al objeto .Palabra clave synchronized  Podemos tener problemas si varios hilos acceden a los mismos datos  Necesitamos asegurarnos de que los datos están en estado consistente antes de comenzar otro hilo  Al usar synchronized.

el hilo para su ejecución hasta que la consiga . } } }  Al ejecutar la orden synchronized. i++. Ejemplo synchronized public class Probando{ public void prueba(char c){ synchronized(this) { datos[i] = c. intenta obtener la bandera de bloqueo  Si no la consigue.

Uso synchronized  Sólo funciona si todos los accesos a los datos ocurren dentro de bloques sincronizados  Estos datos se deben declarar private public void push(char c){ synchronized(this){ //código } } ó public synchronized push(char c){ //código } .

hay que establecer un orden en los bloqueos para obtenerlos y liberarlos en orden inverso .Bloqueo mutuo (Deadlock)  Ocurre cuando un hilo espera un bloqueo que tiene otro y ese otro espera un bloqueo que tiene el primero  Para prevenirlo.

Métodos wait y notify  Son métodos para comunicación entre hilos  wait: un hilo envía esta llamada. queda pausado y libera el bloqueo  notify: otro hilo notifica a un hilo pausado que continúe  El hilo despertado podrá obtener el bloqueo nuevamente cuando se libere y continuará con la siguiente instrucción tras el wait  Para hacer estas llamadas tenemos que tener un bloqueo sobre el objeto  Tienen que estar dentro de un bloque synchronized .

Acceso a datos JDBC .

 JDBC 2.  Manipulación del conjunto de resultados  Mapeo de tipos entre SQL y Java  Transacciones.  Statements de JDBC.DD.Acceso a datos  JDBC 1.0  JDBC 3.2  Tipos de drivers  Carga de los Drivers  Establecimiento de conexiones a BB.0 .

JDBC 1.2  Interfaces  Clases  CallableStatement  Date  Connection  DriverManager  DatabaseMetaData  DriverPropertyInfo  Driver  Time  PreparedStatement  TimeStamp  ResultSet  Types  ResultSetMetaData  Excepciones  Statement  DataTruncation  SQLException  SQLWarning .

DriverManager . TimeStamp. Relación entre clases executeQuery ResultSet getMoreResults Statement commit. getXXX CallableStatement getConnection Numeric. Time. etc. abort execute createStatement getXXX Prepared prepareStatement Connection Statement setXXX prepareCall Tipos de Datos Date.

Drivers JDBC  Un driver JDBC es un módulo Java que traduce los métodos estándar JDBC en llamadas a la base de datos de destino  Hay cuatro tipos de drivers distintos:  Tipo 1 : Puente JDBC-ODBC  Tipo 2 : API Nativo  Tipo 3: Protocolo de red abierto (puro Java)  Tipo 4: Protocolo de red propietario (puro Java) .

JdbcOdbcDriver Oracle Oracle ODBC Driver Cliente de API ODBC BBDD Java JDBC Manager SQLServer SQLServer ODBC Driver  Muy dependiente de la plataforma Windows  Requiere instalación en la máquina cliente  Demasiadas capas: Impacto en la eficiencia Access  No apto para entornos de producción ni de aplicaciones comerciales.jdbc.odbc.ODBC sun. Driver tipo 1: Puente JDBC . MS Access ODBC Driver .

étc) Cliente de API Controlador del Tipo2 BBDD Java JDBC (código binario y Java) BBDD  Implementado como una combinación de código nativo y Java  Muy dependiente de la plataforma  Requiere instalación en la máquina cliente . DB2. Driver tipo 2: API nativa Protocolo específico del vendedor (SQL*Net.

Driver tipo 3: Protocolo de red abierto Cliente de API Controlador JDBC BBDD Java JDBC Tipo 3 (Java Puro) Protocolo de Comunicaciones estándar (HTTP) IDS Server Servidor Remoto (Intermediario) de Acceso a Base de Datos  Integramente en Java  Sin instalación Oracle SQLServer Access  Aplicaciones inter/intranet .

jdbc.driver. Driver tipo 4: Protocolo de red propietario oracle.OracleDriver Cliente de API Controlador JDBC BBDD Java JDBC Tipo 4 (Java Puro) Oracle Protocolo de Red propietario: SQL*Net jdbc:oracle:thin:[<user>/<password>]@<host>:<port>:<sid>  Integramente en Java  Sin instalación  Aplicaciones inter/intranet .

hay que cargarlo en memoria previamente .Crear una conexión  La clase DriverManager es la responsable de cargar y descargar los controladores JDBC y crear conexiones  Deduce el driver que se debe utilizar a partir de la URL de conexión  Para que DriverManager sea capaz de utilizar un determinado driver JDBC.

odbc.SelectMethod=cursor.sqlserver. URL de conexión  El formato de la URL de conexión depende del driver  Siempre comienza con jdbc:driver:  ODBC: sun.jdbc.jdbc.jdbc.SQLServerDriver  jdbc:microsoft:sqlserver://localhost:1433.JdbcOdbcDriver  jdbc:odbc:NombreDSN  SQL Server: com.jdbc.Driver  jdbc:mysql://localhost:3306/test .  Oracle: oracle.microsoft.mysql.OracleDriver  jdbc:oracle:thin:@localhost:1521:orcl  MySQL: com.driver. DatabaseName=Northwind.

} catch (ClassNotFoundException e) { // mensaje de error} } Connection con = DriverManager.jdbc. .getConnection( "jdbc:odbc:myDataSource". "admin". "pwd").odbc.JdbcOdbcDriver"). Ejemplo: Crear conexión try { Class.forName("sun.

 ResultSetMetaData rsmd = rs.getColumnCount()].getMetaData().  ResultSet tablas = dmd. .getTables(……).  int colType[] = new int[rsmd.getMetaData().  ResultSetMetaData  Se obtiene de un objeto ResultSet  Devuelve información sobre las columnas que forman el ResultSet  ResultSet rs = stmt.Metadatos  DatabaseMetaData  Se obtiene de la conexión  Devuelve información acerca de la estructura de la base de datos  DatabaseMetadata dmd = con.executeQuery(sqlString).

Statement  Para ejecutar consultas o modificaciones sobre la BD. se utiliza el método executeUpdate(sentenciaSQL)  Devuelve el número de filas afectadas . se puede pasar al siguiente con getMoreResults()  Para realizar una modificación (o cualquier operación que no devuelva datos). se utiliza el método executeQuery(sentenciaSQL)  Devuelve un objeto ResultSet  Si se obtienen varios conjuntos de datos. hay que crear antes un objeto Statement  Se utiliza el método createStatement() de la conexión  Una instancia de Statement se puede reutilizar para realizar varias operaciones  Para realizar una consulta.

executeUpdate( "UPDATE PRODUCTS SET NAME='CocaCola' " + "WHERE PRODUCTID=1"). Ejemplo: Statement Statement st = con. ResultSet rs = st.createStatement().executeQuery( "SELECT * FROM PRODUCTS"). st. .

devuelve null  El método getUpdateCount() devuelve el número de registros actualizados .Método execute  El método execute(sql) permite ejecutar un Statement cuando no se sabe si contiene una consulta o una sentencia de actualización  Devuelve true si es una consulta  Devuelve false si es una actualización  El método getResultSet() devuelve el conjunto de resultados obtenido  Si no es una consulta.

.getInt(1) o rs.. etc.getInt("ID")  close() cierra el ResultSet  El ResultSet de JDBC 1.). devuelven el valor de una columna  Se pueden obtener por posición o por nombre (las posiciones empiezan en 1)  rs.ResultSet  El resultado de una consulta es un objeto ResultSet  next() permite pasar a la siguiente fila  devuelve true si ha podido leer la fila  getInt(. getString(.2 sólo permite avanzar por las filas hacia delante y leer las columnas de izquierda a derecha una sola vez .).

System. .println(rs.out.println(rs. while (rs. System.out.getString(1)). System. } rs.println().out.print("ID: ").getInt(0)).out. ResultSet rs = st.close().print("Nombre: "). System.executeQuery( "SELECT * FROM PRODUCTS").out.createStatement().Ejemplo: ResultSet Statement st = con.next()) { System.

JOINS  No todos los gestores de BD realizan igual las combinaciones de tablas (joins)  JDBC proporciona una sintaxis especial que el driver se encarga de traducir  SELECT d. e.deptno} .name AS Departamento.deptno=e.* FROM {oj dept d left outer join emp e on d.

 Reciben la posición del parámetro y el valor que toma  La posición empieza en 1 . setString.PreparedStatement  Si se va a lanzar la misma operación varias veces con distintos parámetros se puede optimizar utilizando PreparedStatement (deriva de Statement)  La sentencia se precompila y es más eficiente  Los objetos PreparedStatement se crean con el método prepareStatement(sql) de la conexión  Los parámetros se indican en la SQL con ?  Los valores de los parámetros se establecen con los métodos setInt. etc.

Ejemplo: PreparedStatement PreparedStatement ps = con.setInt(1. ResultSet rs = ps. . ps.executeQuery().prepareStatement( "SELECT * from Autor " + "WHERE ID=?").1).

?)}"  Parámetros  Entrada: como en PreparedStatement  Salida: se deben registrar antes de la ejecución con el método registerOutParameter(pos.CallableStatement  Se utiliza para llamar a procedimientos almacenados  Se crean con el método prepareCall(sql)  La SQL tiene la estructura: "{call nombre_proc(?.tipo)  Se ejecuta llamando al método execute()  El resultado se obtiene llamando al método getResultSet() .

next()) { System.?. cs.java." + rs. cs.INTEGER). Ejemplo: PreparedStatement CallableStatement cs = con.getString(2)). String nombre = "José García".Types.prepareCall( "{call InsertarEmpleado(?. while (rs.nombre).?)}").println("Insertado empleado: " + rs. ResultSet rs = ps. int edad = 43 cs.getString(1) + " . . } int id = cs.setInt(2.edad).registerOutParameter(3.executeQuery().sql.setString(1.out.getInt(3).

Transacciones  Por defecto. las transacciones se controlan manualmente  Se inician al ejecutar cualquier Statement  commit() acepta la transacción  rollback() descarta la transacción . las conexiones funcionan en modo autocommit  Cada operación conlleva su propia transacción  Si se deshabilita autocommit (setAutoCommit(false)).

Concurrencia de transacciones  Cuando se ejecutan a la vez distintas transacciones se pueden presentar los siguientes problemas  Lecturas sucias: Se leen datos insertados por otras transacciones que aún no se han confirmado  Lecturas no repetibles: Se lee la misma fila dos veces seguidas y se obtienen datos distintos (modificaciones de otras transacciones)  Lecturas fantasma: Se leen varias filas que cumplen cierto criterio dos veces seguidas y se obtienen filas distintas (inserciones o borrados de otras transacciones) .

TRANSACTION_NONE  No utiliza transacciones  Connection.)  Connection.Niveles de aislamiento  Se especifican en el método setTransactionIsolation(.TRANSACTION_READ_COMMITED  Permite lecturas no repetibles y lecturas fantasma  Connection.TRANSACTION_REPEATABLE_READ  Permite sólo lecturas fantasma  Connection. no repetibles y fantasma  Connection...TRANSACTION_SERIALIZABLE  Se asegura la consistencia de todas las lecturas .TRANSACTION_READ_UNCOMMITED  Permite lecturas sucias.

JDBC 2.0  Mejoras en ResultSet  ResultSet desplazables  ResultSet actualizables  Actualizaciones en lote  Tipos de datos avanzados  Optimización de conexiones (pooling)  Uso de JNDI (Java Naming and Directory Interface) para localizar bases de datos  Conjuntos de datos con soporte JavaBean (RowSet)  Transacciones distribuidas (JTS: Java Transaction Services) .

Mejoras en ResultSet
 createStatement(SCROLLTYPE,UPDATETYPE)
 SCROLLTYPE
 Resultset.TYPE_FORWARD_ONLY
 Desplazamiento sólo hacia adelante
 Resultset.TYPE_SCROLL_INSENSITIVE
 Permite desplazamiento, pero no ve cambios realizados por otros
 Resultset.TYPE_SCROLL_SENSITIVE
 Permite desplazamiento y ve los cambios
 UPDATETYPE
 Resultset.CONCUR_READ_ONLY:
 Sólo lectura
 Resultset.CONCUR_UPDATABLE
 Permite modificar los datos

Desplazamiento por ResultSet
 void afterlast();  boolean last();
Se desplaza a la posición

siguiente de la última fila  Se posiciona en la última fila
 boolean isAfterLast();  boolean isLast();
 Indica si está posicionado  Indica si está en la última fila
después de la última fila
 void beforefirst();  boolean next();
 Se desplaza a la posición anterior  Se mueve a la siguiente fila
a la primera fila  boolean previous();
 boolean isBeforeFirst();
 Indica si está posicionado antes
 Se mueve a la fila anterior
de la primera fila  boolean relative(int n);
 boolean first();  Se mueve n filas desde la fila
 Se posiciona en la primera fila actual
 boolean isFirst();  boolean absolute(int n);
 Indica si está en la primera fila
 Se posiciona en la fila nº n

ResultSet actualizables
 Actualización de filas
 Los métodos updateInt(col,valor),
updateString(col,valor), etc. modifican
una columna de la fila actual con el valor indicado
 El método updateRow() almacena los cambios
en la BD
 Si se desplaza el ResultSet antes de llamar a
updateRow() se pierden los cambios
 El método cancelRowUpdates() restaura los
valores originales de la fila

ResultSet actualizables  Inserción de filas  Desplazarse a la "fila de inserción" con el método moveToInsertRow()  Introducir los datos con los métodos updateXXX()  Guardar la fila con insertRow()  Borrado de filas  Se utiliza el método deleteRow() .

..  Devuelve un array con el número de filas afectadas por cada sentencia del lote .")  Se envían las sentencias a la BD  int[] rowCounts = st.updateBatch().  Se añaden sentencias al Statement  st.setAutoCommit(false).  Se contruye un Statement  Statement st = con.Actualizaciones en lote  Se deshabilita autocommit  con.createStatement ().addBatch(".

Tipos de datos avanzados  DISTINCT  STRUCT  ARRAY  BLOB  CLOB  REF .

JDBC 3.0  SavePoints (transacciones parciales)  Pool de PreparedStatement  Recuperación de claves autogeneradas  Soporte de cursor Hold  Posibilidad de mantener varios ResultSet abiertos a la vez .

createStatement().setSavepoint("SAVEPOINT_1").rollback(svpt1). .executeUpdate( "INSERT INTO TAB1(COL1) VALUES ('PRIMERO')"). Savepoint svpt1 = con.SavePoints  Permite deshacer parcialmente una transacción: Statement stmt = con. con. con.commit(). stmt. stmt.executeUpdate( "INSERT INTO TAB1 (COL1) VALUES ('SEGUNDO')").

getGeneratedKeys().RETURN_GENERATED_KEYS ). Statement.)".) VALUES (.Obtener claves generadas  Indicar en executeUpdate el parámetro Statement..executeUpdate( "INSERT INTO ORDERS (.createStatement().getInt(1). if (rs..next()) { int clave = rs.. } .. ResultSet rs = stmt.RETURN_GENERATED_KEYS  Ejecutar getGeneratedKeys() para obtener un ResultSet con las claves generadas Statement stmt = conn. stmt.

com/j2se/1.0/docs/api/index.Pearson Educación .com Página oficial de Sun (inglés)  Documentación API J2SE http://java.Enlaces y Bibliografía  En Internet:  http://java.html  Libros:  "Piensa en Java" Bruce Eckel .sun.sun.5.