sábado, 21 de octubre de 2017

JAVA CON BASE DATOS


                                         "AÑO DEL BUEN SERVICIO AL CIUDADANO"

                          ESCUELA ACADÉMICA INGENIERÍA DE SISTEMAS Y TELEMÁTICA


                                                                    ASIGNATURA

                                              LABORATORIO DE PROGRAMACIÓN II


                                                                           TEMA

                                                         JAVA CON BASE DE DATOS

                                                                         AUTORES

                                                     AGUILAR CORDOVA JHAKELIN

                                                   RAMOS FERNÁNDEZ SONIA ELVIRA


                                                                         DOCENTE

                                            ING. MARCO AURELIO PORRO CHULLI


                                                    BAGUA GRANDE-UTCUBAMBA

                                                                        AMAZONAS 

                                                                               2017


JAVA CON BASE DATOS

1.    CONTENIDO

1.1 DEFINICION

JDBC es un API de Java para acceder a sistemas de bases de datos, y prácticamente a cualquier tipo de dato tabular. El API JDBC consiste de un conjunto de clases e interfaces que permiten a cualquier programa Java acceder a sistemas de bases de datos de forma homogénea. Al igual que ODBC, la aplicación de Java debe tener acceso a un controlador (driver) JDBC adecuado. Este controlador es el que implementa la funcionalidad de todas las clases de acceso a datos y proporciona la comunicación entre el API JDBC y la base de datos real. De manera muy simple, al usar JDBC se pueden hacer tres cosas:
·         Establecer una conexión a una fuente de datos (ejemplo. Una base de datos).
·         Mandar consultas y sentencias a la fuente de datos.
·         Procesar los resultados.

La necesidad de una librería



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. Estos archivos se pueden obtener de:

      -
http://developers.sun.com/product/jdbc/drivers

También es posible conseguir estos archivos jar en la página web correspondiente a cada DBMS, por ejemplo, en caso de usar DMBS Oracle es posible buscarlo en la página de Oracle: 
www.oracle.com. En nuestro caso vamos a usar el jar de mysql, el mysql connector y lo podemos descargar desde acá:


Dentro del zip que se descarga se encuentra el jar.

CARGAR EL CONTROLADOR  JDBC

Para trabajar con el API JDBC se tiene que importar el paquete java.sql, tal y como se indica a continuación:

Import java.sql.*;

En este paquete se definen los objetos que proporcionan toda la funcionalidad que se requiere para el acceso a bases de datos. El siguiente paso después de importar el paquete java.sql consiste en cargar el controlador JDBC, es decir un objeto Driver específico para una base de datos que define cómo se ejecutan las instrucciones para esa base de datos en particular.

Hay varias formas de hacerlo, pero la más sencilla es utilizar el método forname() de la claseclass:

Class.forname("Controlador JDBC");

Para el caso particular del controlador para sqlserver, Connector/J, se tiene lo siguiente:

Class.forname("com.mysql.jdbc.Driver ");

Debe tenerse en cuenta que el método estático forname() definido por la clase Class genera un objeto de la clase especificada. Cualquier controlador JDBC tiene que incluir una parte de iniciación estática que se ejecuta cuando se carga la clase. En cuanto el cargador de clases carga dicha clase, se ejecuta la iniciación estática, que pasa a registrarse como un controlador JDBC en el drivermanager.

Para la base de datos csl creada anteriormente, el URL sería:

String url = "jdbc:mysql://localhost/agendita";

Una vez que se ha determinado el URL, se puede establecer una conexión a una base de datos.



1.2   OBJETOS CONNECTION, STATEMENT Y RESULTSET



v  OBJETOS CONNECTION

El objeto Connection es el principal objeto utilizado para proporcionar un vínculo entre las bases de datos y una aplicación en Java. Connection proporciona métodos para manejar el procesamiento de transacciones, para crear objetos y ejecutar instrucciones SQL, y para crear objetos para la ejecución de procedimientos almacenados.

Se puede emplear tanto el objeto Driver como el objeto drivermanager para crear un objeto Connection. Se utiliza el método connect() para el objeto Driver, y el método getconnection()para el objeto drivermanager.


El objeto Connection proporciona una conexión estática a la base de datos. Esto significa que hasta que se llame en forma explícita a su método close() para cerrar la conexión o se destruya el objeto Connection, la conexión a la base de datos permanecerá activa.

La manera más usual de establecer una conexión a una base de datos es invocando el método getconnection() de la clase drivermanager. A menudo, las bases de datos están protegidas con nombres de usuario (login) y contraseñas (password) para restringir el acceso a las mismas. El método getconnection() permite que el nombre de usuario y la contraseña se pasen también como parámetros.

String usuario = "root";
String contraseña = "123456789";
Connection conn = drivermanager.getconnection(url,usuario,contraseña);


En toda aplicación de bases de datos con mysql es indispensable poder establecer la conexión al servidor para posteriormente enviarle las consultas. Los programas en Java no son la excepción. El siguiente código va a servir para verificar que podemos establecer una conexión a la base de datos agendita.

CREACIÓN DE SENTENCIAS

El objeto Connection permite establecer una conexión a una base de datos. Para ejecutar instrucciones SQL y procesar los resultados de las mismas, se debe hacer uso de un objetostatement.



v  OBJETOS STATEMENT

Los objetos Statement envían comandos SQL a la base de datos, y pueden ser de cualquiera de los tipos siguientes:
·         Un comando de definición de datos como CREATE TABLE o CREATE INDEX.
·         Un comando de manipulación de datos como INSERT, DELETE o UPDATE.
·         Un sentencia SELECT para consulta de datos.

Un comando de manipulación de datos devuelve un contador con el número de filas (registros) afectados, o modificados, mientras una instrucción SELECT devuelve un conjunto de registros denominado conjunto de resultados (result set). La interfaz Statement no tiene un constructor, sin embargo, podemos obtener un objeto Statement al invocar el método createstatement() de un objeto Connection.

Conn = drivermanager.getconnection(url,login,pasword);

Statement stmt = conn.createstatement();

Una vez creado el objeto Statement, se puede emplear para enviar consultas a la base de datos usando los métodos execute(), executeupdate() o executequery(). La elección del método depende del tipo de consulta que se va a enviar al servidor de bases de datos:

Método
Descripción
Execute( )
Se usa principalmente cuando una sentencia SQL regresa varios conjuntos de resultados. Esto ocurre principalmente cuando se está haciendo uso de procedimientos almacenados.
Executeupdate( )
Este método se utiliza con instrucciones SQL de manipulación de datos tales como INSERT, DELETE o UPDATE.
Executequery( )
Se usa en las instrucciones del tipo SELECT.

Es recomendable que se cierren los objetos Connection y Statement que se hayan creado cuando ya no se necesiten. Lo que sucede es que cuando en una aplicación en Java se están usando recursos externos, como es el caso del acceso a bases de datos con el API JDBC, el recolector de basura de Java (garbage collector) no tiene manera de conocer cuál es el estado de esos recursos, y por lo tanto, no es capaz de liberarlos en el caso de que ya no sean útiles. Lo que ocurre en estos casos es que se pueden quedar almacenados en memoria grandes cantidades de recursos relacionados con la aplicación de bases de datos que se está ejecutando. Es por esto que se recomienda que se cierren de manera explícita los objetos Connection y Statement.
De manera similar a Connection, la interfaz Statement tiene un método close() que permite cerrar de manera explícita un objeto Statement. Al cerrar un objeto Statement se liberan los recursos que están en uso tanto en la aplicación Java como en el servidor de bases de datos.
Statement stmt = conn.createstatement();
  
   ....

   Stmt.close();

EJECUCIÓN DE CONSULTAS

Cuando se ejecutan sentencias SELECT usando el método executequery(), se obtiene como respuesta un conjunto de resultados, que en Java es representado por un objeto resultset.

Statement stmt = conn.createstatement();

v  OBJETOS RESULTSET

Resultset res = stmt.executequery("SELECT * FROM estudiante");

Se puede pensar en un conjunto de resultados como una tabla ( filas y columnas ) en la que están los datos obtenidos por una sentencia SELECT.

La información del conjunto de resultados se puede obtener usando el método next() y los diversos métodos getxxx() del objeto resultset. El método next() permite moverse fila por fila a través del resultset, mientras que los diversos métodos getxxx() permiten accesar a los datos de una fila en particular.

Los métodos getxxx() toman como argumento el gndice o nombre de una columna, y regresan un valor con el tipo de datos especificado en el método. Así por ejemplo, getstring() regresará una cadena, getboolean() regresará un booleano y getint() regresará un entero. Cabe mencionar que estos métodos deben tener una correspondencia con los tipos de datos que se tienen en el resultset, y que son a las vez los tipos de datos provenientes de la consulta SELECT en la base de datos, sin embargo, si únicamente se desean mostrar los datos se puede usar getstring() sin importar el tipo de dato de la columna.

Por otra parte, si en estos métodos se utiliza la versión que toma el índice de la columna, se debe considerar que los índices empiezan a partir de 1, y no en 0 (cero) como en los arreglos, los vectores, y algunas otras estructuras de datos de Java.

Existe un objeto resultsetmetadata que proporciona varios métodos para obtener información sobre los datos que están dentro de un objeto resultset. Estos métodos permiten entre otras cosas obtener de manera dinámica el número de columnas en el conjunto de resultados, así como el nombre y el tipo de cada columna.

Resultset res = stmt.executequery("SELECT * FROM estudiante");
Resultsetmetadata metadata = res.getmetadata();

1.3 EJEMPLOS

CONNECTION
Import java.sql.*;

public class conexionbd
{
   static String bd = "sesion";
   static String login = "root";
   static String password = "123456789";
   static String url = "jdbc:mysql://localhost/"+bd;

   Public static void main(String[] args) throws Exception
   {
      Connection conn = null;

      try
      {
         Class.forname("com.mysql.jdbc.Driver").newinstance

         conn = drivermanager.getconnection(url,login,password);

         if (conn != null)
         {
            System.out.println("Conexiónse de datos "+url+" ... Ok");
            conn.close();
         }
      }
      catch(sqlexception ex)
      {
         System.out.println(ex);
      }
      catch(classnotfoundexception ex)
      {
         System.out.println(ex);
      }

   }
}


STATEMENT Y RESULTSET

         // Define la conexión

         Connection laconexion = administradordeconexiones.getconnection();       

        // Arma la consulta y la ejecuta

       String laconsulta = "SELECT * FROM alumnos";

        Statement stmtconsulta = laconexion.createstatement();

        resultset rs = stmtconsulta.executequery(laconsulta);       

        // Muestra los datos

        while( rs.next() )
        System.out.println( "ID: " + rs.getint("alu_id") + " -- " + "Nombre: " + rs.getstring("alu_nombre") + " -- " + "Apellido: " + rs.getstring("alu_apellido") );       

        // Cierra el Statement y la Connection

        stmtconsulta.close();
        laconexion.close();



2.   RESUMEN

Java es un potente y versátil lenguaje de programación que puede trabajar en todo tipo de entornos, desde servidores de aplicaciones mi ddle-tier hasta clientes Web. Independientemente del tipo de aplicación que usted desarrolle y del tipo de máquina en la que se ejecute el código, su aplicación seguramente tendrá que acceder a datos almacenados en algún tipo de base de datos. Las bases de datos relacionales son la elección obvia en la mayor parte de las empresas, y han evolucionado espectacularmente en los últimos años hasta convertirse en potentes sistemas de gestión de bases de datos.

En este tema se pretende mostrar cómo funcionan las bases de datos relacionales, y como emplear la interfaz JDBC para utilizarlas en sus programas Java. Se recogen desde los fundamentos básicos de SQL y dichas bases.

También veremos las sentencias DML de SQL que se utiliza en JAVA, acompañado de algunos ejemplos para su respectivo uso.

Adicionalmente mostraremos cuales son las funciones de Objetos Connection, Statement y resulset, donde se mostrarán algunos ejemplos de su uso.


3.   SUMMARY

Java is a powerful and versatile programming language that can work in all kinds
of environments, from my ddle-tier application servers to Web clients. Regardless 
of the type of application you develop and the type of machine running the code, 
your application will surely have to access data stored in some type of database. 
Relational databases are the obvious choice in most companies, and have evolved 
dramatically in recent years to become powerful database management systems.
 
This topic is intended to show how relational databases work, and how to use the 
JDBC interface to use them in your Java programs. They are collected from the 
basics of SQL and such databases.
 
We will also see the SQL DML statements that are used in JAVA, accompanied by 
some examples for their respective use.
 
Additionally we will show what are the functions of Objects Connection, Statement 
and resulset, which will show some examples of its use.

4.   RECOMENDACIONES

Evitar consultas SQL SELECT *


SELECT * FROM... Es una forma muy habitual de establecer una consulta en SQL. Sin embargo, muchas veces no es necesario consultar todos los campos. Para cada columna que hay que devolver, el controlador JDBC tiene que hacer el trabajo adicional de enlazar y devolver la fila. Aún en el caso de que la aplicación no llegue a utilizar nunca una columna concreta, el controlador JDBC debe tenerla presente y reservar espacio por si se utiliza. Esta cuestión no supone una actividad general significativa si son pocas las columnas que no se utilizan de las tablas. Sin embargo, si son numerosas las columnas no utilizadas, la actividad general puede llegar a ser significativa. En tal caso, sería mejor listar individualmente las columnas que a la aplicación le interesa consultar, como en este ejemplo:
     SELECT COL1, COL2, COL3 FROM...
 

Utilizar getxxx(int) en vez de getxxx(String)


Utilice los métodos getxxx de resultset que toman valores numéricos, en vez de las versiones que toman nombres de columna. Si bien la libertad que supone utilizar nombres de columna en vez de constantes numéricas parece ser una ventaja, la base de datos propiamente dicha solo sabe manejar los índices de las columnas. Por ello, cada vez que se llama a un método getxxx utilizando el nombre de una columna, el controlador JDBC lo debe resolver para que el método se pueda pasar a la base de datos. Normalmente, a los métodos getxxx se les suele llamar dentro de bucles que se pueden ejecutar millones de veces, y ello provocaría rápidamente la acumulación de la pequeña actividad general que supone la resolución de cada uno de los nombres de columna.
 

Evitar llamadas a getobject para tipos Java primitivos


Cuando de la base de datos se obtienen valores de tipos primitivos (int, long, float, etc.), es más rápido utilizar el método get específico del tipo primitivo (getint, getlong, getfloat) que utilizar el método getobject. La llamada a getobject realiza el trabajo de obtener el tipo primitivo y luego crea un objeto para devolverlo. Normalmente, esto se hace en los bucles, lo que supone crear millones de objetos de corta vida. Si se emplea getobject para los mandatos de primitivos, existe el inconveniente adicional de que se activa con frecuencia el colector de basura, lo que aún reduce más el rendimiento.

Cerrar explícitamente los recursos JDBC cuando ya no se necesitan


La aplicación debe cerrar explícitamente los objetos resultset, Statement y Connection cuando ya no se necesitan. Así se hace una limpieza de recursos del modo más eficaz posible, y el rendimiento puede aumentar. Además, los recursos de base de datos que no se cierran de manera explícita pueden provocar fugas de recursos, y los bloqueos de base de datos se pueden prolongar más de lo debido. Ello puede producir anomalías de aplicación o reducir la concurrencia en las aplicaciones.

 

5.   CONCLUSIONES

 Establecer una conexión a una fuente de datos (ej. Una base de datos).
Mandar consultas y sentencias a la fuente de datos.
Procesar los resultados.

      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. Estos archivos se pueden obtener de:



También es posible conseguir estos archivos jar en la página web correspondiente a cada DBMS, por ejemplo, en caso de usar DMBS Oracle es posible buscarlo en la página de Oracle: www.oracle.com. En nuestro caso vamos a usar el jar de mysql, el mysql connector y lo podemos descargar desde acá:



6.   GLOSARIO DE TÉRMINOS

API: Una API es un conjunto de funciones y procedimientos que cumplen una o muchas funciones con el fin de ser utilizadas por otro software. Las siglas API vienen del inglés Application Programming Interface. En español sería Interfaz de Programación de Aplicaciones.

ODBC: Open database Connectivity (ODBC) es un estándar de acceso a las bases de datos desarrollado por SQL Access Group (SAG) en 1992. El objetivo de odbces hacer posible el acceder a cualquier dato desde cualquier aplicación, sin importar qué sistema de gestión de bases de datos (DBMS) almacene los datos.

DRIVER: Controlador, rutina o programa que enlaza un dispositivo periférico al sistema operativo.

JAR: Un archivo JAR (por sus siglas en inglés, Java archive) es un tipo de archivo que permite ejecutar aplicaciones escritas en el lenguaje Java. Las siglas están deliberadamente escogidas para que coincidan con la palabra inglesa "jar" (tarro).

DRIVERMANAGER: drivermanager es una clase estática en Java 2 Software Development Kit (J2SDK).drivermanager gestiona el conjunto de controladores Java Database Connectivity (JDBC) que están disponibles para que los utilice una aplicación.

GETCONNECTION: Para crear una conexión a una base de datos o un servidor de bases de datos IBM® Informix, puede utilizar el método drivermanager.getconnection(). Este método crea un objeto Connection, que se utiliza para crear sentencias SQL, enviarlas a la base de datos Informix y procesar los resultados.

SELECT: Para realizar consultas sobre las tablas de las bases de datos disponemos de la instrucción SELECT. Con ella podemos consultar una o varias tablas. Es sin duda el comando más versátil del lenguaje SQL. Existen muchas cláusulas asociadas a la sentenciaselect (GROUP BY, ORDER, HAVING, UNION).

INTERFAZ: Dispositivo capaz de transformar las señales generadas por un aparato en señales comprensibles por otro.

GETINT: El método getint especifica este método getint en la interfaz java.sql.callablestatement. Este método solamente se admite en los tipos de datos SQL Server que pueden devolver de forma segura un valor entero como int, smallint, tinyint y bit.

7.   BIBLIOGRAFÍA







 Link de las diapositivas: