Poo
Paradigma de objetos

Paradigma: el concepto de paradigma es utilizado comúnmente como sinónimo de “ejemplo” o para hacer referencia en caso de algo que se toma como “modelo".

La Programación Orientada a Objetos (abreviada de ahora en más como POO) es un conjunto de reglas y principios de programación (o sea, un paradigma de programación) que busca representar las entidades u objetos del dominio (o enunciado) del problema dentro de un programa, en la forma más natural posible.

Distintos tipos de paradigmas:

  • IMPERATIVOS
    • Estructurado
    • Orienado a objetos

  • DECLARATIVOS
    • Funcional
    • Lógico

Caracterísitas del paradigma orientado a objetos

  • Es un paradigma de programación que usa objetos y sus interacciones, para diseñar aplicaciones y programas de computadoras.
  • Es una forma especial de programar, más cercana a como expresaríamos las cosas en la vida real.
  • Se basa en la idea natural de la existencia de un mundo lleno de objetos, de modo que la resolución del problema se realiza en términos de objetos.

Entonces, la programación orientada a objetos es un enfoque de programación que tiene un estilo en el cual cada programa es pensado y escrito como un objeto y además, se forma por una serie o un conjunto de componentes, que también son objetos y que con sus datos (atributos o propiedades) y con la posibilidad de realizar acciones (métodos) cooperan y se relacionan para lograr el funcionamiento de la aplicación completa.

Qué son los objetos?

Un Objeto es un elemento que posee características, denominadas atributos, y comportamientos, denominados métodos, que puede interactuar con otros objetos del sistema, enviando mensajes, y tiene asociado una identidad que lo distingue entre todos los objetos del sistema.

Esta entidad objeto tiene como “estructura” a una clase.

El objeto inicia su participación activa en el sistema cuando es llamada la clase que contiene su “estructura” por medio de una instancia.

Clases

¿Y cuál es la relación entre las clases y los objetos?

Las Clases son definiciones de las propiedades y comportamientos que podrá tener un tipo de objeto.

Instanciar una clase, realiza la lectura de estas definiciones y la creación de un objeto a partir de ellas.

Podemos ver a una clase como un modelo o plantilla que representa entidades o conceptos.

Una clase es un modelo abstracto que define cómo será un objeto real.

Atributos
Atributos y métodos
ATRIBUTOS

Cuando definimos atributos dentro de una clase, éstos toman el nombre técnico de atributos de instancia, porque cuando se crea un objeto en memoria de la computadora, éste objeto tendrá una copia tanto de los atributos como también de sus métodos de la clase inicial.

Métodos
Comportamiento (métodos)
Qué es un método?

Un método es el código definido para realizar una acción que se incluye dentro de una clase y puede ser parte de un Objeto cuando ese Objeto haya sido creado mediante la instancia a la clase.

La idea central de los métodos es no escribir una misma instrucción varias veces, si la vamos a utilizar más de una vez.

Cuando se llama a un método, la ejecución del programa pasa al método, ejecuta las instrucciones que se encuentren en él y la ejecución continua a partir del punto donde se produjo el llamado, es decir, sigue el flujo natural.

OTROS CONCEPTOS
MENSAJES

Los Objetos interactúan enviándose mensajes unos a otros. Tras la recepción de un mensaje el objeto actuará. La acción puede ser el envío de otros mensajes, el cambio de su estado, o la ejecución de cualquier otra tarea que se requiera que haga el objeto.

MÉTODOS ESTÁTICOS

Un método static en Java es un método que pertenece a la clase y no al objeto. Un método static solo puede acceder a variables o tipos de datos declarados como static.

PARÁMETRO

Es el valor que recibe un método para su procesamiento.

ARGUMENTO

Es el valor que se envía a un método para ser procesado.

VALOR DE RETORNO

Los métodos pueden retornar valores y modificar el estado (valor de sus atributos) de otro objeto o simplemente de una variable.

IDENTIDAD DE UN OBJETO

Es la propiedad que permite diferenciar a un objeto y distinguirse de otros. En programación la identidad de todos los objetos sirve para comparar si dos objetos son iguales o no.

CONSTRUCTOR

Un Constructor es un método de las clases, el cual es llamado automáticamente cuando se crea un objeto a partir de esa clase.

Por ser métodos, los constructores también aceptan parámetros. Cuando en una clase no especificamos ningún tipo de constructor, el compilador añade uno de uso público por omisión sin parámetros, el cual NO hace nada.

Encapsulamiento

En un lenguaje orientado a objetos, hablamos de encapsular al referirnos al acceso que brinda una clase a diferentes objetos sobre sus datos.

Encapsulamos información (métodos, atributos etc.) para que no pueda ser accedida desde otros métodos y solamente pueda ser utilizada dentro del método que creó esa información.

El encapsulamiento de variables y métodos en un programa es una simple y poderosa herramienta que provee dos principales beneficios a los desarrolladores de software:

  • Modularidad: el código de una clase puede ser escrito y modificado, independientemente del código de otras clases. Así mismo, un objeto puede ser utilizado en un sistema sin alterar su estado y conducta.
  • Ocultamiento de la información: un objeto tiene una “interfaz publica” que otros objetos pueden utilizar para comunicarse con él. Pero el objeto puede mantener información y métodos privados que pueden ser cambiados (si éste lo permite) en cualquier momento sin afectar a los otros objetos que dependan de ello.

Modificadores de acceso

Tenemos que tener en cuenta las herramientas necesarias para un correcto encapsulamiento, o no, de la información.

Public y Private
La misma clase Otra clase del mismo paquete Subclase Otra clase de otro paquete
public X X X X
protected X X X
default X X
private X
  • Public: Si un componente de una clase es public, podremos tener acceso al mismo desde cualquier clase o instancia sin importar el paquete. Las clases, atributos y métodos incluyendo los constructores pueden tener este tipo de acceso.
  • Protected: Nos permite acceso a los componentes con dicho modificador desde la misma clase, clases del mismo paquete y clases que hereden del mismo.
  • Private: Cualquier elemento de una clase que sea privado solo puede ser accedido únicamente por la misma clase, este modificador no puede ser asignado a las clases.

Setters y Getters

Para poder acceder a datos de acceso privado de una clase existen los métodos normalmente llamados Getters y Setters, aunque se utilizan con las palabras Get y Set seguida del nombre del atributo.

Son una forma pública para cambiar miembros de las clases privadas.

Los Setters & Getters nos sirven para dos cosas:

  • Setters: Del Inglés Set, que significa establecer, pues nos sirve para asignar un valor a un atributo, pero de forma explícita, y solo nos permite dar acceso público a los atributos que deseemos que el usuario pueda modificar. Es decir permiten cambiar el valor de los atributos.
  • Getters: Del Inglés Get, que significa obtener, pues nos sirve para obtener (recuperar o acceder) el valor ya asignado a un atributo y utilizarlo para cierto método. Por lo que devuelven el valor o propiedad de los atributos por él alcanzados.

En muchas ocasiones, el uso del Set y Get no apunta a modificar la propiedad de un atributo privado, sino que además de esa opción tenemos la posibilidad de ejecutar un filtro o control del dato que llega al método Set, y eso no lo podríamos solucionar en un atributo que sea público solamente.

Miembros estáticos

Son aquellos que pertenecen a la clase, en lugar de pertenecer a un objeto en particular. Recuperando concetos básicos de orientación a objetos, sabemos que tenemos:
Clases: definiciones de elementos de un tipo homogéneo.
Objetos: concreción de un ejemplar de una clase.

En las clases defines que tal objeto tendrá algunos atributos y métodos, sin embargo, para acceder a ellos o darles valores necesitarás construir objetos de esa clase.

Ese es el comportamiento normal de los miembros de clase. Sin embargo, los elementos estáticos o miembros de clase son un poco distintos. Son elementos que existen dentro de la propia clase y para acceder los cuales no necesitamos haber creado ningún objeto de esa clase. Ó sea, en vez de acceder a través de un objeto, accedemos a través del nombre de la clase.

Atributos y métodos de clase

Atributos de clase

Existe un modificador que aplicado a las variables hace que el atributo de instancia se convierta en atributo de clase. La diferencia que existe con el anterior es que al momento de crear un objeto ese atributo de clase no se crea en el objeto, por lo que si se llegaran a crear más objetos ninguno de ellos tendría una copia del original sino que todos compartirían el mismo atributo. Esto implica que si un objeto modifica el valor de ese atributo, se verá reflejado el cambio en todos los objetos.

Para poder definir un atributo de clase tendrás que utilizar la palabra static, anteponiéndola al nombre del atributo.

Métodos de clase

Si aplicás la palabra static a los métodos, se los denomina método de clase. Los métodos de clase permiten acceder a código cuando no se tiene una instancia en particular de un objeto.

Al definir un método de clase, tenés que tener en cuenta que no pueden acceder a atributos que no están definidos como estáticos.

Estado de un Objeto

El estado de un objeto abarca todos los atributos del objeto, y los valores actuales de cada una de esas propiedades. Las propiedades o atributos de los objetos suelen ser estáticas, mientras los valores que toman estas propiedades o atributos cambian con el tiempo.

El hecho de que los objetos tengan un estado implica que ocupan un espacio determinado en la memoria de la computadora. Están en funcionamiento. El estado puede definirse, además de por el valor de un atributo, por un método o por las posibilidades de interactuar de una clase con otras.

El estado de un objeto representa, en todos los casos, el efecto acumulado de los cambios, modificaciones, ejecuciones, intervenciones y todas las acciones que se hayan llevado a cabo sobre él o sobre algún otro objeto con el cual interactúa.

Herencia

Qué es la herencia?

La herencia es una propiedad de los objetos, que le permite obtener atributos y métodos de una clase y así ampliar su funcionalidad. Entonces, en este mecanismo, encontraremos que hay una clase que aporta los atributos y métodos y otra que los recibe para utilizarlos sin necesidad de escribir el código en Java nuevamente.

La herencia es transitiva. Esto quiere decir que, sean las clases A, B y C, si A hereda de B y B hereda de C entonces A hereda de C.

La herencia es una propiedad esencial de la Programación Orientada a Objetos que consiste en la creación de nuevas clases a partir de otras ya existentes.

Un lenguaje orientado a objetos permite heredar a las clases características y conductas, es decir los atributos y métodos, de una o varias clases denominadas superclases, clases bases o padres. A las clases que heredan de otras clases se las denominan subclases, clases derivadas o hijas. Las clases derivadas, a su vez, pueden ser clases bases para otras clases derivadas.

La herencia te permitirá lograr una de las principales características de la programación, que es la reutilización de código.

La herencia es un mecanismo mediante el cual una clase hereda todo el comportamiento y atributos de otra clase. La clase que hereda se denomina clase hija, clase derivada o subclase. La clase que provee la herencia se llama clase padre, base, o superclase.

Tipos de herencia
DOS TIPOS DE HERENCIA
Herencia SIMPLEHerencia MÚLTIPLE

En este tipo de herencia, una clase puede extender las características de una sola clase, o sea sólo puede tener un padre.

Hay otro tipo de herencia y es en el caso en que una clase puede extender las características de varias clases, es decir, puede tener varios padres. En este aspecto hay discrepancias entre los diseñadores de lenguajes. Algunos de ellos han preferido no admitir la herencia múltiple por las posibles coincidencias en nombres de métodos o datos miembros.

En el caso de la izquierda, las clases B y C poseen las mismas características y comportamiento de la clase A. En cambio, en el gráfico de la derecha, la clase B posee las mismas características y comportamiento de la clase A. mientras que la clase C tiene las mismas características y comportamiento de la clase B, pero al haber heredado de A, se dice que C posee las mismas características y comportamiento de la clase A y B.

En éste caso una clase puede extender las características de varias clases, es decir, puede tener varios padres. En este aspecto hay discrepancias entre los diseñadores de lenguajes. Algunos de ellos han preferido no admitir la herencia múltiple por las posibles coincidencias en nombres de métodos o datos miembros.

(Para el caso de JAVA, los diseñadores del lenguaje prefirieron no aceptar la herencia múltiple como se muestra en el caso anterior, sino que implementaron el concepto de Interfaces para lograr esta cualidad dentro de los objetos.)

Especificadores de alcance

En la siguiente tabla especificamos el alcance en la clase derivada según el alcance que tenga el componente en la clase base.

ESPECIFICADORES DE ALCANCE PARA LA HERENCIA
Clase BASE Clase DERIVADA ACCESO
1 PRIVADO PRIVADO SÓLO MEDIANTE MÉTODOS
2 PROTEGIDO PÚBLICO DIRECTO
3 PÚBLICO PÚBLICO DIRECTO
  1. Si los datos en la clase base son privados, en la clase derivada también lo serán y su acceso sólo será mediante los métodos.
  2. Si los datos en la clase base son protegidos, en la clase derivada se convierten en públicos y su acceso sólo será directo, o sea, no hará falta acceder mediante la invocación de ningún método.
  3. Si los datos en la clase base son públicos en la clase derivada también lo serán y su acceso sólo será directo, o sea, no hará falta acceder mediante la invocación de ningún método.
Relación entre clases y objetos

Un objeto es una INSTANCIA de una clase. Por lo tanto, los objetos hacen uso de los Atributos (variables) y Métodos (Funciones y Procedimientos) de su correspondiente Clase.

Como se puede observar, un objeto a través de su CLASE está compuesto por 2 partes:

  • Atributos o Estados
  • Métodos: que definen el comportamiento de dicho objeto a partir de sus atributos

Los atributos y los métodos pueden ser o no accedidos desde afuera dependiendo de la solución a plantear. Por lo general los atributos siempre se ocultan al exterior y algunos métodos quedan visibles al exterior para convertirse en la interfaz del objeto.

Paquetes

Un paquete es un conjunto de clases e interfaces relacionadas.

Para hacer que una clase sea más fácil de localizar y utilizar, así como evitar conflictos de nombres y controlar el acceso a los miembros de una clase, las clases se agrupan en paquetes.

Polimorfismo
POLIMORFISMO
Definición para POO

El polimorfismo es la capacidad que tiene un objeto de tomar distintas formas, de tal manera que una referencia a una clase (atributo, parámetro o declaración local o elemento de un vector) acepta direcciones de objetos de dicha clase y de sus clases derivadas (hijas, nietas, …).

El polimorfismo y la herencia son dos conceptos estrechamente ligados. Conseguimos implementar polimorfismo en jerarquías de clasificación que se dan a través de la herencia.

Cuando declaramos una función, ésta puede recibir como parámetro un objeto de una clase base y el compilador aceptará no solamente objetos de ésa clase, sino todos aquellos objetos que hayamos creado que hereden de la clase base. Esa cualidad del sistema para aceptar una gama de objetos diferentes, es lo que llamamos polimorfismo.

Sobrecarga y Sobreescritura
  • SOBRECARGA: se produce dentro de una misma clase sobre un método que tiene igual nombre, pero distintos parámetros. Dependiendo de los parámetros que se encuentren en la invocación será el método que se termine llamando.
  • SOBREESCRITURA: se produce con métodos de distintas clases, donde se encuentra definido un método con el mismo nombre y con los mismos parámetros. Dependiendo del objeto que invoque al método será la clase que resolverá ese llamado.
Clases abstractas

El polimorfismo es la habilidad que tiene un objeto de tomar diferentes formas en tiempo de ejecución. Nosotros vamos a representar el polimorfismo con la palabra reservada “abstracto”, la cual puede ser utilizada tanto en clases como en métodos.

Para que exista polimorfismo tiene que haber una jerarquía de clases.

Una clase abstracta no se puede instanciar pero sí se puede heredar y las clases hijas serán las encargadas de agregar la funcionalidad a los métodos abstractos. Si no lo hacen así, las clases hijas deben ser también abstractas.

Si un método tiene antepuesto a su definición la palabra “abstracto” (‘abstract’ en java), entonces decimos que es un método abstracto, es decir que su cabecera se encuentra en la clase base y su implementación se encuentra en alguna clase derivada.

Una clase que posee, al menos, un método abstracto se denomina clase abstracta.

Una clase abstracta, por lo tanto, tendrá que derivarse, ya que no podrá hacerse un nuevo objeto o instanciar de esa clase abstracta.

Interfaces

La interfaz es una clase, pero definida con la palabra reservada “interface” ( interfaz). Ésta es una clase especial que contiene todos sus métodos abstractos, por lo tanto, tendrán que ser definidos en las clases que lo implementen.

  • Una interface es una colección de declaraciones de métodos sin definirse.
  • Las interfaces se implementan en una clase para poder modelar el comportamiento en común.
  • Una clase puede implementar más de una interface. De esta manera podrás simular el comportamiento de una herencia múltiple. Esta es una característica fundamental ya que mediante las interfaces podrás definir compartimientos comunes sin necesidad de forzar una herencia de clases.
  • A diferencia de lo que sucede con la Herencia, la implementación de interfaces no fuerza una relación jerárquica, simplemente permite que clases no relacionadas puedan tener algunas características de comportamiento similares.
Interfaces y Clases Abstractas
  • Las interfaces son completamente abstractas, no tienen ninguna implementación.
  • Con interfaces no hay herencia de métodos, con clases abstractas sí.
  • De una clase abstracta no es posible crear instancias; de las interfaces tampoco.
  • Una clase solamente puede extender una clase abstracta (o concreta) pero puede implementar más de una interface.

La clase que implementa una interface tiene dos opciones:

  1. Implementar todos los métodos de la interface.
  2. Implementar sólo algunos de los métodos de la interface pero esa clase debe ser una clase abstracta (debe declararse con la palabra abstract).
Control de acceso a miembros de una clase
Nivel de acceso permitido por cada modificador
Public Protected (sin modificador) private
Clase SI SI SI SI
Subclase en el mismo paquete SI SI SI NO
No-Subclase en el mismo paquete SI SI SI NO
Subclase en diferente paquete SI SI/NO* NO NO
No-Subclase en diferente paquete (Universo) SI NO NO NO
(*) Los miembros (variables y métodos) de clase (static) sí son visibles. Los miembros de instancia no son visibles.
Casteo

Muchas veces nos vamos a encontrar con la necesidad de convertir algún tipo de dato; por ello java al ser un lenguaje de tipado fuerte nos facilita las herramientas para poder lograrlo.

DOS TIPOS DE CASTEO
Casteo IMPLÍCITO Casteo EXPLÍCITO
Ocurre cuando necesitamos un tipo de dato más pequeño en otro más grande. Este tipo de casteo va a ocurrir cuando queremos asignar un tipo de dato más grande a un tipo de dato más pequeño, es tarea del usuario especificar al nuevo tipo de dato al cual se va a transformar. Se escribe de forma explícita entre paréntesis.
byte x = 5;
int y = x;
byte a = 20;
int b = (int) a;
Foreach
Vectores

Los arreglos (o arrays en inglés), son un conjunto de datos que se caracterizan por almacenarse en memoria de manera contigua, bajo un mismo nombre, pero con diferentes “índices” para diferenciar la ubicación de cada uno de ellos.

Los arreglos son estructuras fijas, es decir, que una vez declarados e inicializados, mantienen su tamaño durante toda la ejecución del programa.

Los arreglos, al igual que las variables comunes, deben poseer un solo tipo de dato determinado.

Declaración de un array:

  • int numerosB[] = new int [3];
  • numerosB[0] = 10;

Foreach

Al trabajar con arrays, es común encontrar situaciones en las que cada elemento de una matriz debe examinarse, de principio a fin.

Método 1
int numeros[] = {1,2,3,4,5,6};
for (int i=0; i < numeros.length; i++) {
    System.out.println("Los números son "+numeros[i]);
}
Método 2
int numeros[] = {1,2,3,4,5,6};
for (int cadena:numeros) {
    System.out.println("Los números son "+cadena);
}
Este bucle recorre un arreglo de principio a fin de forma secuencial, es importante recordar que al no tener un índice o un valor por defecto no funciona para modificar un valor.
Colecciones
Qué son las colecciones?

Una colección representa un grupo de objetos, que son conocidos como elementos.

Cuando queremos trabajar con un conjunto de elementos, necesitamos un almacén donde poder guardarlos. En Java, se emplea la interfaz genérica Collection para este propósito.

Cuardo de colecciones Java
IMPLEMENTACIONES DE COLECCIONES
SET

La interfaz Set define una colección que no puede contener elementos duplicados. Esta interfaz contiene, únicamente, los métodos heredados de Collection añadiendo la restricción de que los elementos duplicados están prohibidos.

HashSet

Ésta implementación almacena los elementos en una tabla hash. Es la implementación con mejor rendimiento de todas, pero no garantiza ningún orden a la hora de realizar iteraciones. Es la implementación más empleada debido a su rendimiento y a que, generalmente, no nos importa el orden que ocupen los elementos.

TreeSet

Ésta implementación almacena los elementos ordenándolos en función de sus valores. Es bastante más lento que HashSet.

LinkedHashSet

Ésta implementación almacena los elementos en función del orden de inserción. Es, simplemente, un poco más costosa que HashSet.

LIST

La interfaz List define una sucesión de elementos, que admite elementos duplicados.

A parte de los métodos heredados de Collection, añade métodos que permiten mejorar los siguientes puntos:

  • Acceso posicional a elementos: manipula elementos en función de su posición en la lista.
  • Búsqueda de elementos: busca un elemento concreto de la lista y devuelve su posición.
  • Iteración sobre elementos: mejora el Iterator por defecto.
  • Rango de operación: permite realizar ciertas operaciones sobre rangos de elementos dentro de la propia lista.
ArrayList

Se basa en un array redimensionable que aumenta su tamaño según crece la colección de elementos. Es la que mejor rendimiento tiene sobre la mayoría de situaciones.

LinkedList

Se basa en una lista doblemente enlazada de los elementos, teniendo cada uno de los elementos un puntero al anterior y al siguiente elemento.

Excepciones
Excepciones

En los sistemas pueden ocurrir eventos excepcionales que corten el flujo correcto y provoquen comportamientos inesperados. Una excepción no es más que un error que se presenta en nuestro software, estos errores pueden ser más o menos graves, se producen durante la ejecución del programa.

En Java no se pueden evitar, pero se pueden gestionar y evitar la interrupción total de nuestro programa, tratando correctamente el problema y así tener un software que sea tolerante a fallas, más robusto.

Bloque TRY CATCH FINALLY

Están conformados para capturar errores y ejecutar las instrucciones sin tener interrupciones en el sistema.

PARTES
TRY

Contendrá las instrucciones que pueden provocar el error. De este tipo de bloque sólo se puede crear uno por grupo.

CATCH

Contendrá el código necesario para gestionar el error. Si se presenta un error en el bloque try el catch lo capturará creando un objeto según el tipo de excepción esperada, es por ello que este bloque contiene un parámetro y se pueden crear tantos bloques catch como se crea conveniente. No es obligatorio tener un catch pero es recomendable hacerlo.

FINALLY

Contendrá el código que se ejecutará suceda o no un error, este bloque no es obligatorio y de requerir sólo puede existir uno al final del try si no posee bloque catch y de poseerlo al final de todo el grupo.

El manejo de excepciones está diseñado para procesar errores sincrónicos, que ocurren cuando se ejecuta una instrucción. Ejemplos comunes de estos errores son los índices fuera de rango, el desbordamiento aritmético, la división entre cero, los parámetros inválidos de un método y la interrupción de hilos, así como la asignación fallida de memoria.

Todas las excepciones son un subtipo de la clase java.lang.Exception, la cual a su vez es una subclase de la clase Throwable. Los errores son situaciones anormales de nuestro programa y como no pueden ser manejados por el mismo para notificarlos debemos hacerlo desde la clase Throwable, en cambio de la clase Exception tendremos dos subclases encargadas de manejar las excepciones chequeadas (IOException) y las excepciones no chequeadas (RuntimeException), pasemos a ver algunos métodos disponibles en la clase Throwable:

  • public String getMessage(), nos devuelve una información detallada de la excepcion
  • public Throwable getCause(), devuelve la causa de la excepcion por medio de un objeto Throwable
  • public String toString(), devuelve el nombre de la clase concatenada con el resultado de getMessage()
  • public void printStackTrace(), imprime el resultado de toString() junto con el seguimiento de la pila a System.err
  • public StackTraceElement[] getStackTrace(), devuelve un array conteniendo los elementos del seguimiento de la pila, donde el indice cero sera el elemento de arriba de la pila y el ultimo indice el del ultimo elemento de la pila
  • public Throwable fillInStackTrace(), Rellena el seguimiento de pila de este objeto Throwable con el seguimiento de pila actual, agregando a cualquier información anterior en el seguimiento de pila
API

Al instalar Java (el paquete JDK) en nuestra computadora, además del compilador y la máquina virtual de Java se instalan bastantes muchos más elementos. Entre ellos, una cantidad muy importante de clases que ofrece la multinacional desarrolladora de Java y que están a disposición de todos los programadores listas para ser usadas. Estas clases junto a otros elementos forman lo que se denomina API (Application Programming Interface) de Java.

Cuando instalamos Java en nuestro ordenador instalamos múltiples herramientas, entre ellas una serie de “librerías” (paquetes) a cuyo conjunto solemos referirnos como “biblioteca estándar de Java”. Las librerías contienen código Java listo para ser usado por nosotros.

Componentes Java
Maven
Qué es Maven?

Apache Maven es una potente herramienta de gestión de proyectos que se utiliza para gestión de dependencias, como herramienta de compilación e incluso como herramienta de documentación. Es de código abierto y gratuita.

Al contrario que otras herramientas anteriores y más limitadas como Apache Ant (también muy popular), Maven utiliza convenciones sobre dónde colocar ciertos archivos para el proceso de build de un proyecto, por lo que solo debemos establecer las excepciones y por lo tanto simplifica mucho el trabajo. Además, es una herramienta declarativa. Es decir, todo lo que definamos (dependencias en módulos y compontes externos, procesos, orden de compilación, plugins del propio Maven...) se almacena en un archivo XML que Maven lee a la hora de funcionar.

Con Maven se puede:

  • Gestionar las dependencias del proyecto, para descargar e instalar módulos, paquetes y herramientas que sean necesarios para el mismo.
  • Compilar el código fuente de la aplicación de manera automática.
  • Empaquetar el código en archivos .jar o .zip.
  • Instalar los paquetes en un repositorio (local, remoto o en el central de la empresa)
  • Generar documentación a partir del código fuente.
  • Gestionar las distintas fases del ciclo de vida de las build: validación, generación de código fuente, procesamiento, generación de recursos, compilación, ejecución de test.
Qué es el archivo pom.xml?

La unidad básica de trabajo en Maven es el llamado Modelo de Objetos de Proyecto conocido simplemente como POM (de sus siglas en inglés: Project Object Model). Se trata de un archivo XML llamado pom.xml que se encuentra por defecto en la raíz de los proyectos y que contiene toda la información del proyecto: su configuración, sus dependencias, etc...

Esta sería la estructura habitual de un proyecto Java que utiliza Maven:

Estrucutra Maven

Dentro de un proyecto pueden existir varios archivos pom.xml en distintas subcarpetas. Cuando una subcarpeta tiene su propio POM, este hereda los valores de las carpetas superiores, sobrescribiéndolos en caso de estar definidos de nuevo dentro de él.

JDBC

Java Database Connectivity (JDBC) Es una API de acceso a bases de datos estándar SQL que proporciona un acceso uniforme a una gran variedad de bases de datos relacionales.

SE COMPONE DE DOS PAQUETES
java.sqlPaquete para acceder y procesar datos almacenados en una fuente de datos (generalmente una base de datos relacional).
javax.sqlPaquete para acceso y procesamiento de fuentes de datos del lado del servidor.
Agregando la librería a un proyecto

Al trabajar con JDBC resulta necesario agregar un jar al proyecto que contiene las clases necesarias que se utilizan para “dialogar” con un DBMS. Cada DBMS tiene su propio archivo jar.

Nuestros proyectos están creados con un arquetipo de Maven y a través del archivo pom.xml podemos gestionar las librerías que necesitamos.

Nuestro proyecto trabajará con MySQL así que nos dirigimos al repositorio de Maven, buscamos el Driver de Mysql y lo agregamos en las dependencias del archivo pom.xml:

pom

Conectando a un origen de datos

La interfaz CONNECTION provee una sesión de trabajo con una base de datos. Sus métodos, aparte de permitir modificarla y consultar sus tablas, también permiten obtener información sobre su estructura.

MÉTODOS DE LA INTERFAZ CONNECTION
commit() Confirma los cambios realizados provisionalmente por las transacciones.
close() Libera la conexión a la base de datos.
createStatement Crea un objeto Statement para enviar sentencias SQL a la base de datos.
prepareStatement (String sql) Crea un objeto PreparedStatemento para enviar sentencias SQL parametrizadas a la base de datos.
rollback() Deshace todos los cambios realizados en la transacción actual y libera los bloqueos de la base de datos.
setAutoCommit (boolean autoCommit) Establece el modo de confirmación automática.
isClosed() Recupera si la conexión se ha cerrado.
Crear la conexión

Debemos establecer la conexión a través de un método estático que nos provee la clase
DriverManager getConnection(String url, String user, String password) y que nos retorna un objeto de tipo Connection.

url = "jdbc:mysql://localhost:3306/desafiobd2022?useSSL=false&useTimezone=true&serverTimezone=UTC&allowPublicKeyRetrieval=true";
Connection conexion = DriverManager.getConnection(url, "root", "clave");

Ejecutar instrucciones SQL

La interfaz Statement nos provee una serie de métodos que al ser ejecutados nos devuelven los resultados que producen las sentencias ejecutadas.

execute (String sql) Ejecuta la instrucción SQL dada, que puede devolver varios resultados.
executeQuery (String sql) Ejecuta la instrucción SQL dada, que devuelve un solo Objeto ResultSet.
El método execute() se utiliza para ejecutar sentencias SQL del tipo INSERT, UPDATE o DELETE.
Leer datos devueltos

Para recuperar la información de una tabla o un origen de datos Java nos proporciona la interfaz ResultSet. Esta interfaz nos provee de varios métodos para obtener los datos de columna correspondientes a un fila. Todos ellos tienen el formato get, siendo un tipo de datos Java. Algunos ejemplos de estos métodos son getInt, getLong, getString, getBoolean y etc.

Casi todos estos métodos toman un solo parámetro, que es el índice que la columna tiene dentro del ResultSet o bien el nombre de la columna. El método executeQuery(String sql) de la interfaz Statement nos devuelve dicho objeto. Para poder recuperar cada una de las filas del objeto si las hubiera utilizaremos por lo común el bucle while colocando como condición el método next() que devuelve un boolean indicando si existe una fila que leer, si existe dicha fila mueve el cursor una fila hacia adelante desde su posición actual.

Métodos JDBC