martes, 10 de octubre de 2017

JDBC.


https://es.slideshare.net/SILVA19_PAMELA/jdbc-
80677259


“AÑO DEL BUEN SERVICIO AL CUIDADANO”

TEMA: JDBC.

CURSO: LABORATORIO DE PROGRAMACIÓN I.

ESPECIALIDAD: INGENIERÍA DE SISTEMAS Y
 TELEMATICA.

NOMBRE Y APELLIDO: GILDA  PAMELA SILVA
                  FLORES.

                              KARLA FEBRES
                    PUELLES 
DOCENTE: MARCO AURELIO  PORRO  CHULLI.

CILCO: V – A                                   AULA: 501 

BAGUA GRANDE– PERÚ


2017


I. Tema: JDBC
1. Contenido
 Capa de Acceso de datos, creación.

Una capa de acceso a datos o DAL ( del inglés data access layer ) en los programas informáticos, es una capa de un programa informático que proporciona acceso simplificado a los datos almacenados en el almacenamiento persistente de algún tipo, tal como una entidad - relación de base de datos. Por ejemplo, el DAL podría devolver una referencia al objeto (en términos de programación orientada a objetos) completo con sus atributos en lugar de un registro de campos de una tabla de la base de datos. El DAL esconde esa complejidad del almacén de datos subyacente del mundo externo. O bien los comandos inserción, eliminación y actualización podría ser ejecutado en funciones simples como registerUser o loginUser almacenada dentro de la capa de acceso a datos. Además, los métodos de la lógica de negocio de una aplicación se pueden asignar a la capa de acceso a datos. Así, por ejemplo, en vez de hacer una consulta en una base de datos en busca de todos los usuarios de varias tablas de la aplicación puede llamar a un solo método de una DAL que abstrae las llamadas bases de datos. Si la capa de acceso a datos es compatible con varios tipos de bases de datos, la aplicación se vuelve capaz de utilizar lo que las bases de datos de la CHA pueden hablar. En cualquier circunstancia, que tiene una capa de acceso de datos proporciona una ubicación centralizada para todas las llamadas en la base de datos, y por lo tanto hace que sea más fácil de puerto de la aplicación a otros sistemas de bases de datos (suponiendo que el 100% de la interacción de base de datos se hace en la CHA para un dado aplicación). El modelo ORM/active - record es popular entre los framework para aplicaciones web.

 Configuración de conexión BD con NetBeans.

Java puede conectarse a múltiples bases de datos, con la que mejor se lleva es con Oracle, sin embargo en ocasiones puede ser que los que venimos de la web, al tener la necesidad de hacer una aplicación de escritorio, nos sintamos más acostumbrados con MySQL.
En primer lugar, para realizar este ejemplo debemos tener instalado tres cosas en nuestro sistema:
  • La máquina virtual de Java (Para ejecutar Java, claro está)
  • MySQL (en mi caso yo tengo instalado Xampp que viene con Apache y MySQL, entre otros servicios
  • Netbeans (Con Java instalado)
MySQL
En primer lugar vamos a crear una base de datos, a la cual yo llamaré: java_mysql. La mista tendrá una sola tabla llamada tareas con el siguiente código:
CREATE TABLE tareas (
   id_tarea int (10) unsigned not null auto_increment primary key,
   Titulo varchar (50) not null,
   Descripcion varchar (255) not null,
   nivel_de_prioridad tinyint (1) not null
);
Java
Vamos a abrir Netbeans y vamos a crear un nuevo proyecto, yendo a File -> New Project -> Java -> Java Application.

Vamos a ponerle un nombre y vamos a guardarlo en alguna parte de nuestra máquina.

Vamos a borrar todo lo que esté dentro de la carpeta source (o src) y dentro vamos a crear dos paquetes, uno al que yo llamaré modelos y otro al que llamaré servicios.

Ahora, para conectar Java a MySQL tenemos que agregar una librería que se encargará de hacer esa magia. Así que dentro que pulsando botón derecho sobre la carpeta Libraries, vamos a ir a Add Library.




Y agregamos la librería MySQL JDBC Driver, primero seleccionándola y luego pulsando Add Library.









Bueno, ya tenemos todo, no nos falta nada. Ya podemos empezar a escribir código Java.
Dentro del paquete modelos, vamos a crear una clase, a la que yo llamaré Tarea.java, con el siguiente código:
package modelos;
public class Tarea {
   private final Integer id_tarea;
   private String titulo;
   private String descripcion;
   private Integer nivel_de_prioridad;
   public Tarea() {
      this.id_tarea = null;
      this.titulo = null;
      this.descripcion = null;
      this.nivel_de_prioridad = null;
   }
   public Tarea(Integer id_tarea, String titulo, String descripcion, Integer nivel_de_prioridad) {
      this.id_tarea = id_tarea;
      this.titulo = titulo;
      this.descripcion = descripcion;
      this.nivel_de_prioridad = nivel_de_prioridad;
   }
   public Integer getId_tarea() {
      return id_tarea;
   }
   public String getTitulo() {
      return titulo;
   }
   public String getDescripcion() {
      return descripcion;
   }
   public Integer getNivel_de_prioridad() {
      return nivel_de_prioridad;
   }
   public void setTitulo(String titulo) {
      this.titulo = titulo;
   }
   public void setDescripcion(String descripcion) {
      this.descripcion = descripcion;
   }
   public void setNivel_de_prioridad(Integer nivel_de_prioridad) {
      this.nivel_de_prioridad = nivel_de_prioridad;
   }
   @Override
   public String toString() {
      return "Tarea{" + "id_tarea=" + id_tarea + ", titulo=" + titulo + ", descripcion=" + descripcion + ", nivel_de_prioridad=" + nivel_de_prioridad + '}';
   } 
}
Una clase, nada nuevo, que va a representar el modelo de una tarea.

Conectando JAVA con MySQL 
Bien, ahora creamos la clase que va a conectar nuestra aplicación con MySQL, yendo al paquete servicios, vamos a crear una nueva clase llamada Conexion.java con el siguiente código:
package servicios;
import java.sql.*;
public class Conexion {
   private static Connection cnx = null;
   public static Connection obtener() throws SQLException, ClassNotFoundException {
      if (cnx == null) {
         try {
            Class.forName("com.mysql.jdbc.Driver");
            cnx = DriverManager.getConnection("jdbc:mysql://localhost/java_mysql", "root", "");
         } catch (SQLException ex) {
            throw new SQLException(ex);
         } catch (ClassNotFoundException ex) {
            throw new ClassCastException(ex.getMessage());
         }
      }
      return cnx;
   }
   public static void cerrar() throws SQLException {
      if (cnx != null) {
         cnx.close();
      }
   }
}
Esta clase tendrá un método estático llamado obtener(), el cual va a devolvernos una instancia de conexión y de no haber una previa va crear una:
cnx = DriverManager.getConnection("jdbc:mysql://localhost/java_mysql", "root", "");
Esto gracias al método getConnection(), el cuál recibirá como primer parámetro el tipo de base de datos (MySQL) y la ubicación de la base de datos, en mi caso, como estoy trabajando en un entorno local, será localhost. El segundo parámetro es el usuario y el tercero la contraseña.
A su vez este método puede disparar dos excepciones, SQLException, si surge algún error, por ejemplo que no se pueda conectar a la base de datos, y ClassNotFoundException, en caso de que no encuentre la librería.
Y por último el método, también estático, cerrar(), que como su nombre lo indica, cerrará la conexión, en caso de que haya alguna abierta.
Consultas
Para hacer las consultas con la base de datos, dentro del paquete servicios, creamos una clase con el nombre: Tareas_servicio.java con el siguiente código:
package servicios;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import modelos.Tarea;
public class Tareas_servicio {
   private final String tabla = "tareas";
   public void guardar(Connection conexion, Tarea tarea) throws SQLException{
      try{
         PreparedStatement consulta;
         if(tarea.getId_tarea() == null){
            Consulta = conexion.prepareStatement("INSERT INTO " + this.tabla + "(titulo, descripcion, nivel_de_prioridad) VALUES(?, ?, ?)");
            consulta.setString(1, tarea.getTitulo());
            consulta.setString(2, tarea.getDescripcion());
            consulta.setInt(3, tarea.getNivel_de_prioridad());
         }else{
            consulta = conexion.prepareStatement("UPDATE " + this.tabla + " SET titulo = ?, descripcion = ?, nivel_de_prioridad = ? WHERE id_tarea = ?");
            consulta.setString(1, tarea.getTitulo());
            consulta.setString(2, tarea.getDescripcion());
            consulta.setInt(3, tarea.getNivel_de_prioridad());
            consulta.setInt(4, tarea.getId_tarea());
         }
         consulta.executeUpdate();
      }catch(SQLException ex){
         throw new SQLException(ex);
      }
   }
   public Tarea recuperarPorId(Connection conexion, int id_tarea) throws SQLException {
      Tarea tarea = null;
      try{
         PreparedStatement consulta = conexion.prepareStatement("SELECT titulo, descripcion, nivel_de_prioridad FROM " + this.tabla + " WHERE id_tarea = ?" );
         consulta.setInt(1, id_tarea);
         ResultSet resultado = consulta.executeQuery();
         while(resultado.next()){
            tarea = new Tarea(id_tarea, resultado.getString("titulo"), resultado.getString("descripcion"), resultado.getInt("nivel_de_prioridad"));
         }
      }catch(SQLException ex){
         throw new SQLException(ex);
      }
      return tarea;
   }
   public void eliminar(Connection conexion, Tarea tarea) throws SQLException{
      try{
         PreparedStatement consulta = conexion.prepareStatement("DELETE FROM " + this.tabla + " WHERE id_tarea = ?");
         consulta.setInt(1, tarea.getId_tarea());
         consulta.executeUpdate();
      }catch(SQLException ex){
         throw new SQLException(ex);
      }
   }
   public List<Tarea> recuperarTodas(Connection conexion) throws SQLException{
      List<Tarea> tareas = new ArrayList<>();
      try{
         PreparedStatement consulta = conexion.prepareStatement("SELECT id_tarea, titulo, descripcion, nivel_de_prioridad FROM " + this.tabla + " ORDER BY nivel_de_prioridad");
         ResultSet resultado = consulta.executeQuery();
         while(resultado.next()){
            tareas.add(new Tarea(resultado.getInt("id_tarea"), resultado.getString("titulo"), resultado.getString("descripcion"), resultado.getInt("nivel_de_prioridad")));
         }
      }catch(SQLException ex){
         throw new SQLException(ex);
      }
      return tareas;
   }
}
Esta clase cuenta con los métodos capaces de realizar las distintas operaciones en una tabla.
El método guardar (), que recibirá como parámetro una instancia de conexión y un objeto Tarea. Si el objeto tiene el valor de id nulo, va a hacer un insert, de lo contrario un update en el registro con dicho id.
El método recuperarPorId (), recibirá la conexión y un id, y nos devolverá un objeto Tarea correspondiente a ese id, de lo contrario nos devolverá un valor null, en caso de que no encuentre ningún registro con ese id.
El método eliminar () recibirá un una instancia de conexión y el objeto Tarea que debe eliminar.
Y finalmente recuperar Todas () también recibirá una instancia de conexión y nos devolverá una lista con todas las tareas.
 Definición de JDBC. Tipos. Aplicaciones.

En la mayoría de las aplicaciones que nos vamos a encontrar, aparecerá una base de datos como fuente de información. JDBC nos va a permitir acceder a bases de datos (BD) desde Java. Con JDBC no es necesario escribir distintos programas para distintas BD, sino que un único programa sirve para acceder a BD de distinta naturaleza. Incluso, podemos acceder a más de una BD de distinta fuente (Oracle, Access, MySql, etc.) en la misma aplicación. Podemos pensar en JDBC como el puente entre una base de datos y nuestro programa Java. Un ejemplo sencillo puede ser un applet que muestra dinámicamente información contenida en una base de datos. El applet utilizará JDBC para obtener dichos datos.
El esquema a seguir en un programa que use JDBC es el siguiente: 






 Uso de JDBC en aplicaciones java. 


Un programa Java que utilice JDBC primero deberá establecer una conexión con el SGBD. Para realizar dicha conexión haremos uso de un driver específico para cada SGBD que estemos utilizando. Una vez establecida la conexión ya podemos interrogar la BD con cualquier comando SQL (select, update, create, etc.). El resultado de un comando select es un objeto de la clase ResultSet, que contiene los datos que devuelve la consulta. Disponemos de métodos en ResultSet para manejar los datos devueltos. También podemos realizar cualquier operación en SQL (creación de tablas, gestión de usuarios, etc.). 







 
 Para realizar estas operaciones necesitaremos contar con un SGBD (sistema gestor de bases de datos) además de un driver específico para poder acceder a este SGBD. Vamos a utilizar dos SGBD: MySQL (disponible para Windows y Linux, de libre distribución) y PostGres (sólo para Linux, también de libre distribución).

Tipos de drivers

Existe un estándar establecido que divide los drivers en cuatro grupos:
·         Tipo 1: Puente JDBC-ODBC. ODBC (Open Database Connectivity) fue creado para proporcionar una conexión a bases de datos en Microsoft Windows. ODBC permite acceso a bases de datos desde diferentes lenguajes de programación, tales como C y Cobol. El puente JDBC-ODBC permite enlazar Java con cualquier base de datos disponible en ODBC. No se aconseja el uso de este tipo de driver cuando tengamos que acceder a bases de datos de alto rendimiento, pues las funcionalidades están limitadas a las que marca ODBC. Cada cliente debe tener instalado el driver. J2SE incluye este driver en su versión Windows y Solaris.



·         Tipo 2: Parte Java, parte driver nativo. Es una combinación de implementación Java y API nativo para el acceso a la base de datos. Este tipo de driver es más rápido que el anterior, pues no se realiza el paso por la capa ODBC. Las llamadas JDBC se traducen en llamadas específicas del API de la base de datos. Cada cliente debe tener instalado el driver. Tiene menor rendimiento que los dos siguientes y no se pueden usar en Internet, ya que necesita el API de forma local.

 











·         Tipo 3: Servidor intermediario de acceso a base de datos. Este tipo de driver proporciona una abstracción de la conexión. El cliente se conecta a los SGBD mediante un componente servidor intermedio, que actúa como una puerta para múltiples servidores. La ventaja de este tipo de driver es el nivel de abstracción. El servidor de aplicaciones WebLogic incorpora este tipo de driver. 




·         Tipo 4: Drivers Java. Este es el más directo. La llamada JDBC se traduce directamente en una llamada de red a la base de datos, sin intermediarios. Proporcionan mejor rendimiento. La mayoría de SGBD proporcionan drivers de este tipo. 




2. Resumen

Java Database Connectivity, más conocida por sus siglas JDBC,es una API que permite la ejecución de operaciones sobre bases de datos desde el lenguaje de programación Java, independientemente del sistema operativo donde se ejecute o de la base de datos a la cual se accede, utilizando el dialecto SQL del modelo de base de datos que se utilice.
El API JDBC se presenta como una colección de interfaces Java y métodos de gestión de manejadores de conexión hacia cada modelo específico de base de datos. Un manejador de conexiones hacia un modelo de base de datos en particular es un conjunto de clases que implementan las interfaces Java y que utilizan los métodos de registro para declarar los tipos de localizadores a base de datos (URL) que pueden manejar. Para utilizar una base de datos particular, el usuario ejecuta su programa junto con la biblioteca de conexión apropiada al modelo de su base de datos, y accede a ella estableciendo una conexión; para ello provee el localizador a la base de datos y los parámetros de conexión específicos. A partir de allí puede realizar cualquier tipo de tarea con la base de datos a la que tenga permiso: consulta, actualización, creación, modificación y borrado de tablas, ejecución de procedimientos almacenados en la base de datos, etc.

3. Summary

Java Database Connectivity, better known by its abbreviations JDBC, 12 is an API that allows the 
execution of operations on databases from the programming language Java, regardless of the 
operating system where it is executed or of the database to which it is acceded , using the SQL 
dialect of the database model that is used.
The JDBC API is presented as a collection of Java interfaces and methods of managing connection
 handlers to each specific database model. A connection handler to a particular database model is
 a set of classes that implement Java interfaces and that use the registration methods to declare 
the types of database locators (URLs) they can handle. To use a particular database, the user runs 
his program together with the appropriate connection library to the model of his database, and 
accesses it by establishing a connection; for this it provides the locator to the database and the 
connection parameters. From there you can perform any type of task with the database to which
 you have permission: query, update, creation, modification and deletion of tables, execution of 
stored procedures in the database, etc.

4. Recomendaciones

Ø  JDBC es usado para enviar comandos SQL hacia una base de datos relacional, que puede ser Oracle, Infomix, SyBase, etc.
Ø  Nos realizar estas operaciones necesitaría.
Ø  Hemos de tener en cuenta que el tipo del campo en la tabla debe ser convertible al tipo de datos Java solicitado.

5. Conclusiones
Utilizar JDBC implica construir y ejecutar repetidamente sentencias SELECT, INSERT, UPDATE y DELETE.
Por lo tanto:
Creamos mucho código que además estará muy acoplado a la base de datos que estemos usando.
Tenemos que iterar manualmente sobre las propiedades de objetos como ResultSet cada vez que consultemos algo en la base de datos.
A su vez es muy costoso crear PreparedStatements en cada caso por el mismo motivo de las iteraciones, pero en este caso sería sobre los POJO’s para Inserts, Updates y Deletes.
Tendríamos que gestionar manualmente el orden de las inserciones, actualizaciones y borrados para que no hubiese problemas con la integridad referencial.
6. Glosario de Términos
RDIF: (Radio Frequency Identification), Identificación por Radiofrecuencia.
IrLMP: (Infrared Link Management Protocol), Protocolo de Gestión de Enlace Infrarrojos.
RHCE: (Red Hat Certified Engineer), Ingeniero Certificado de Red Hat.
AMR: (Audio/Modem Riser), Elevador de Audio/Módem.
EDI: (Electronic Data Interchange), Intercambio Electrónico de Datos.
APPN: (Advanced Peer to Peer Networking), Red Avanzada de Punto a Punto.


7. Bibliografía o Linkografía

https://blogs.msdn.microsoft.com/.../nuestro-nuevo-libro-guia-de-arquitectura-n-capas
https://www.svcommunity.org/forum/net/visual-2005-net-capas/?action=dlattach
www.ehu.eus/mrodriguez/archivos/csharppdf/WebForms/Introduccion_ASPNET.pdf